ETH Price: $2,497.96 (-5.24%)

Token

MetaMutts (Mutts)
 

Overview

Max Total Supply

6,888 Mutts

Holders

1,579

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
3 Mutts
0x144AE81c62098C0106E3381E9d9CD7FaaBDE7ccD
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:
MetaMutts

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 1000 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-10-20
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.6;

library Address {
    function isContract(address account) internal view returns (bool) {
        uint size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }
}
// File: @openzeppelin/contracts/utils/Strings.sol


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

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol


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

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol


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

pragma solidity ^0.8.0;


/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol


// OpenZeppelin Contracts v4.4.1 (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`, 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 be 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 Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

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

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

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol


// OpenZeppelin Contracts v4.4.1 (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 tokenId);

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

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

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

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

// File: @openzeppelin/contracts/utils/Context.sol


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

pragma solidity ^0.8.7;

abstract contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;
    
    string private _name;
    string private _symbol;

    // Mapping from token ID to owner address
    address[] internal _owners;

    mapping(uint256 => address) private _tokenApprovals;
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override(ERC165, IERC165)
        returns (bool)
    {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) 
        public 
        view 
        virtual 
        override 
        returns (uint) 
    {
        require(owner != address(0), "ERC721: balance query for the zero address");

        uint count;
        for( uint i; i < _owners.length; ++i ){
          if( owner == _owners[i] )
            ++count;
        }
        return count;
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId)
        public
        view
        virtual
        override
        returns (address)
    {
        address owner = _owners[tokenId];
        require(
            owner != address(0),
            "ERC721: owner query for nonexistent token"
        );
        return owner;
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId)
        public
        view
        virtual
        override
        returns (address)
    {
        require(
            _exists(tokenId),
            "ERC721: approved query for nonexistent token"
        );

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved)
        public
        virtual
        override
    {
        require(operator != _msgSender(), "ERC721: approve to caller");

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator)
        public
        view
        virtual
        override
        returns (bool)
    {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(
            _isApprovedOrOwner(_msgSender(), tokenId),
            "ERC721: transfer caller is not owner nor approved"
        );

        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(
            _isApprovedOrOwner(_msgSender(), tokenId),
            "ERC721: transfer caller is not owner nor approved"
        );
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @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.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(
            _checkOnERC721Received(from, to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return tokenId < _owners.length && _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId)
        internal
        view
        virtual
        returns (bool)
    {
        require(
            _exists(tokenId),
            "ERC721: operator query for nonexistent token"
        );
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner ||
            getApproved(tokenId) == spender ||
            isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);
        _owners.push(to);

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

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);
        _owners[tokenId] = address(0);

        emit Transfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(
            ERC721.ownerOf(tokenId) == from,
            "ERC721: transfer of token that is not own"
        );
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try
                IERC721Receiver(to).onERC721Received(
                    _msgSender(),
                    from,
                    tokenId,
                    _data
                )
            returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert(
                        "ERC721: transfer to non ERC721Receiver implementer"
                    );
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` 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 tokenId
    ) internal virtual {}
}

pragma solidity ^0.8.7;

/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account but rips out the core of the gas-wasting processing that comes from OpenZeppelin.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) {
        return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId);
    }

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

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < _owners.length, "ERC721Enumerable: global index out of bounds");
        return index;
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256 tokenId) {
        require(index < balanceOf(owner), "ERC721Enumerable: owner index out of bounds");

        uint count;
        for(uint i; i < _owners.length; i++){
            if(owner == _owners[i]){
                if(count == index) return i;
                else count++;
            }
        }

        revert("ERC721Enumerable: owner index out of bounds");
    }
}
// File: @openzeppelin/contracts/access/Ownable.sol


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

pragma solidity ^0.8.7;

/**
 * Hiya
 * This smart contract we have taken every measure possible to
 * keep the costs of gas managable every step along the way.
 * 
 * In this contract we've used several different methods to keep costs down.
 * If you came here worried because gas is so low or you don't have to pay that pesky
 * OpenSea approval fee; rejoice! 

 * Contract by: _granto
 * Based on the work of solidity geniuses: nftchance & masonnft & squeebo_nft
 
   
       ____
           !
     !     !
     !      `-  _ _    _ 
     |              ```  !
_____!                   !
\,      Made in Texas     \
  l    _                  ;
   \ _/  \.              /
           \           .’ 
            .       ./’
             `.    ,
               \   ;
                 ``’
 
 */



contract MetaMutts is ERC721Enumerable, Ownable {
    string public baseURI;

    address public proxyRegistryAddress;
    address public treasuryAccount;

    uint256 public MAX_SUPPLY = 6888;

    uint256 public MAX_PER_TX = 3;
    uint256 public constant RESERVES = 210;
    uint256 public priceInWei = 0.02 ether;
    bool    public publicSaleActive = true;

    mapping(address => bool) public projectProxy;
    mapping(address => uint256) public addressToMinted;

    // baseURI: metadata endpoint for this collection
    // treasuryAccount: address the funds should be widthdrawn to
    constructor(string memory _baseURI, address _treasuryAccount)
        ERC721("MetaMutts", "Mutts")
    {
        baseURI = _baseURI;
        treasuryAccount = _treasuryAccount;
        // Opensea proxy registry address: this preapproves Opensea for transactions, saving users gas fees
        proxyRegistryAddress = 0xa5409ec958C83C3f309868babACA7c86DCB077c1;
    }

    function setBaseURI(string memory _baseURI) public onlyOwner {
        baseURI = _baseURI;
    }

    function setMaxSupply(uint256 _maxSupply) public onlyOwner {
        MAX_SUPPLY = _maxSupply;
    }

    function setPriceInWei(uint256 _priceInWei) public onlyOwner {
        priceInWei = _priceInWei;
    }

    function setTxnMax(uint256 _txnMax) public onlyOwner {
        MAX_PER_TX = _txnMax;
    }

    function tokenURI(uint256 _tokenId)
        public
        view
        override
        returns (string memory)
    {
        require(_exists(_tokenId), "Token does not exist.");
        return string(abi.encodePacked(baseURI, Strings.toString(_tokenId)));
    }

    function setProxyRegistryAddress(address _proxyRegistryAddress)
        external
        onlyOwner
    {
        proxyRegistryAddress = _proxyRegistryAddress;
    }

    function flipProxyState(address proxyAddress) public onlyOwner {
        projectProxy[proxyAddress] = !projectProxy[proxyAddress];
    }

    function togglePublicSaleActive() external onlyOwner {
        publicSaleActive = !publicSaleActive;
    }

    function collectReserves() external onlyOwner {
        require(_owners.length == 0, "Reserves already taken.");
        for (uint256 i; i < RESERVES; i++) _mint(_msgSender(), i);
    }

    function mint(uint256 count) public payable {
        uint256 totalSupply = _owners.length;
        require(publicSaleActive, "Public sale is not active.");
        require(totalSupply + count < MAX_SUPPLY + 1, "Excedes max supply.");
        require(count < MAX_PER_TX + 1, "Exceeds max per transaction.");
        require(count * priceInWei == msg.value, "Invalid funds provided.");

        for (uint256 i; i < count; i++) {
            _mint(_msgSender(), totalSupply + i);
        }
    }

    function burn(uint256 tokenId) public {
        require(
            _isApprovedOrOwner(_msgSender(), tokenId),
            "Not approved to burn."
        );
        _burn(tokenId);
    }

    function withdraw() public {
        (bool success, ) = treasuryAccount.call{value: address(this).balance}(
            ""
        );
        require(success, "Failed to send to treasury.");
    }

    function walletOfOwner(address _owner)
        public
        view
        returns (uint256[] memory)
    {
        uint256 tokenCount = balanceOf(_owner);
        if (tokenCount == 0) return new uint256[](0);

        uint256[] memory tokensId = new uint256[](tokenCount);
        for (uint256 i; i < tokenCount; i++) {
            tokensId[i] = tokenOfOwnerByIndex(_owner, i);
        }
        return tokensId;
    }

    function batchTransferFrom(
        address _from,
        address _to,
        uint256[] memory _tokenIds
    ) public {
        for (uint256 i = 0; i < _tokenIds.length; i++) {
            transferFrom(_from, _to, _tokenIds[i]);
        }
    }

    function batchSafeTransferFrom(
        address _from,
        address _to,
        uint256[] memory _tokenIds,
        bytes memory data_
    ) public {
        for (uint256 i = 0; i < _tokenIds.length; i++) {
            safeTransferFrom(_from, _to, _tokenIds[i], data_);
        }
    }

    function isOwnerOf(address account, uint256[] calldata _tokenIds)
        external
        view
        returns (bool)
    {
        for (uint256 i; i < _tokenIds.length; ++i) {
            if (_owners[_tokenIds[i]] != account) return false;
        }

        return true;
    }

    function isApprovedForAll(address _owner, address operator)
        public
        view
        override
        returns (bool)
    {
        OpenSeaProxyRegistry proxyRegistry = OpenSeaProxyRegistry(
            proxyRegistryAddress
        );
        if (
            address(proxyRegistry.proxies(_owner)) == operator ||
            projectProxy[operator]
        ) return true;
        return super.isApprovedForAll(_owner, operator);
    }

    function _mint(address to, uint256 tokenId) internal virtual override {
        _owners.push(to);
        emit Transfer(address(0), to, tokenId);
    }
}

contract OwnableDelegateProxy {}

contract OpenSeaProxyRegistry {
    mapping(address => OwnableDelegateProxy) public proxies;
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_baseURI","type":"string"},{"internalType":"address","name":"_treasuryAccount","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","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":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_PER_TX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RESERVES","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addressToMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"},{"internalType":"bytes","name":"data_","type":"bytes"}],"name":"batchSafeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"batchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"collectReserves","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"proxyAddress","type":"address"}],"name":"flipProxyState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"isOwnerOf","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"priceInWei","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"projectProxy","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxyRegistryAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxSupply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_priceInWei","type":"uint256"}],"name":"setPriceInWei","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_proxyRegistryAddress","type":"address"}],"name":"setProxyRegistryAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_txnMax","type":"uint256"}],"name":"setTxnMax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","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":"togglePublicSaleActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasuryAccount","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052611ae86009556003600a5566470de4df820000600b55600c805460ff191660011790553480156200003457600080fd5b5060405162002fd938038062002fd983398101604081905262000057916200024b565b60408051808201825260098152684d6574614d7574747360b81b6020808301918252835180850190945260058452644d7574747360d81b908401528151919291620000a59160009162000188565b508051620000bb90600190602084019062000188565b505050620000d8620000d26200013260201b60201c565b62000136565b8151620000ed90600690602085019062000188565b50600880546001600160a01b039092166001600160a01b03199283161790556007805490911673a5409ec958c83c3f309868babaca7c86dcb077c1179055506200038f565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b82805462000196906200033c565b90600052602060002090601f016020900481019282620001ba576000855562000205565b82601f10620001d557805160ff191683800117855562000205565b8280016001018555821562000205579182015b8281111562000205578251825591602001919060010190620001e8565b506200021392915062000217565b5090565b5b8082111562000213576000815560010162000218565b80516001600160a01b03811681146200024657600080fd5b919050565b600080604083850312156200025f57600080fd5b82516001600160401b03808211156200027757600080fd5b818501915085601f8301126200028c57600080fd5b815181811115620002a157620002a162000379565b604051601f8201601f19908116603f01168101908382118183101715620002cc57620002cc62000379565b81604052828152602093508884848701011115620002e957600080fd5b600091505b828210156200030d5784820184015181830185015290830190620002ee565b828211156200031f5760008484830101525b9550620003319150508582016200022e565b925050509250929050565b600181811c908216806200035157607f821691505b602082108114156200037357634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b612c3a806200039f6000396000f3fe6080604052600436106102e75760003560e01c80636352211e11610184578063b88d4fde116100d6578063e100f3d11161008a578063f3993d1111610064578063f3993d11146107f4578063f43a22dc14610814578063f73c814b1461082a57600080fd5b8063e100f3d114610794578063e985e9c5146107b4578063f2fde38b146107d457600080fd5b8063c87b56dd116100bb578063c87b56dd14610734578063cd7c032614610754578063d26ea6c01461077457600080fd5b8063b88d4fde146106fa578063bc8893b41461071a57600080fd5b80638774e5d0116101385780639ec00c95116101125780639ec00c951461069a578063a0712d68146106c7578063a22cb465146106da57600080fd5b80638774e5d0146106475780638da5cb5b1461066757806395d89b411461068557600080fd5b80636f8b44b0116101695780636f8b44b0146105f257806370a0823114610612578063715018a61461063257600080fd5b80636352211e146105bd5780636c0360eb146105dd57600080fd5b8063339b2cff1161023d578063438b6300116101f157806355f804b3116101cb57806355f804b31461054d5780635a4fee301461056d5780635bab26e21461058d57600080fd5b8063438b6300146104e05780634d44660c1461050d5780634f6ccce71461052d57600080fd5b80633ccfd60b116102225780633ccfd60b1461048b57806342842e0e146104a057806342966c68146104c057600080fd5b8063339b2cff146104555780633c8da5881461047557600080fd5b8063095ea7b31161029f57806323b872dd1161027957806323b872dd146103ff5780632f745c591461041f57806332cb6b0c1461043f57600080fd5b8063095ea7b3146103b55780630c894cfe146103d557806318160ddd146103ea57600080fd5b806306fdde03116102d057806306fdde0314610338578063081812fc1461035a5780630922f9c51461039257600080fd5b806301ffc9a7146102ec578063029877b614610321575b600080fd5b3480156102f857600080fd5b5061030c61030736600461281d565b61084a565b60405190151581526020015b60405180910390f35b34801561032d57600080fd5b5061033661088e565b005b34801561034457600080fd5b5061034d610968565b6040516103189190612a45565b34801561036657600080fd5b5061037a6103753660046128bd565b6109fa565b6040516001600160a01b039091168152602001610318565b34801561039e57600080fd5b506103a760d281565b604051908152602001610318565b3480156103c157600080fd5b506103366103d03660046127f1565b610a82565b3480156103e157600080fd5b50610336610bb4565b3480156103f657600080fd5b506002546103a7565b34801561040b57600080fd5b5061033661041a366004612695565b610c22565b34801561042b57600080fd5b506103a761043a3660046127f1565b610caa565b34801561044b57600080fd5b506103a760095481565b34801561046157600080fd5b5060085461037a906001600160a01b031681565b34801561048157600080fd5b506103a7600b5481565b34801561049757600080fd5b50610336610de5565b3480156104ac57600080fd5b506103366104bb366004612695565b610e88565b3480156104cc57600080fd5b506103366104db3660046128bd565b610ea3565b3480156104ec57600080fd5b506105006104fb366004612554565b610f01565b6040516103189190612a01565b34801561051957600080fd5b5061030c610528366004612736565b610fba565b34801561053957600080fd5b506103a76105483660046128bd565b61103c565b34801561055957600080fd5b50610336610568366004612874565b6110ba565b34801561057957600080fd5b5061033661058836600461260c565b61112b565b34801561059957600080fd5b5061030c6105a8366004612554565b600d6020526000908152604090205460ff1681565b3480156105c957600080fd5b5061037a6105d83660046128bd565b611175565b3480156105e957600080fd5b5061034d611215565b3480156105fe57600080fd5b5061033661060d3660046128bd565b6112a3565b34801561061e57600080fd5b506103a761062d366004612554565b611302565b34801561063e57600080fd5b506103366113e3565b34801561065357600080fd5b506103366106623660046128bd565b611449565b34801561067357600080fd5b506005546001600160a01b031661037a565b34801561069157600080fd5b5061034d6114a8565b3480156106a657600080fd5b506103a76106b5366004612554565b600e6020526000908152604090205481565b6103366106d53660046128bd565b6114b7565b3480156106e657600080fd5b506103366106f53660046127be565b611659565b34801561070657600080fd5b506103366107153660046126d6565b61171e565b34801561072657600080fd5b50600c5461030c9060ff1681565b34801561074057600080fd5b5061034d61074f3660046128bd565b6117ac565b34801561076057600080fd5b5060075461037a906001600160a01b031681565b34801561078057600080fd5b5061033661078f366004612554565b611835565b3480156107a057600080fd5b506103366107af3660046128bd565b6118b1565b3480156107c057600080fd5b5061030c6107cf366004612571565b611910565b3480156107e057600080fd5b506103366107ef366004612554565b611a1c565b34801561080057600080fd5b5061033661080f3660046125aa565b611afb565b34801561082057600080fd5b506103a7600a5481565b34801561083657600080fd5b50610336610845366004612554565b611b3d565b60006001600160e01b031982167f780e9d63000000000000000000000000000000000000000000000000000000001480610888575061088882611bc0565b92915050565b6005546001600160a01b031633146108ed5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b6002541561093d5760405162461bcd60e51b815260206004820152601760248201527f526573657276657320616c72656164792074616b656e2e00000000000000000060448201526064016108e4565b60005b60d2811015610965576109533382611c5b565b8061095d81612b52565b915050610940565b50565b60606000805461097790612b17565b80601f01602080910402602001604051908101604052809291908181526020018280546109a390612b17565b80156109f05780601f106109c5576101008083540402835291602001916109f0565b820191906000526020600020905b8154815290600101906020018083116109d357829003601f168201915b5050505050905090565b6000610a0582611cd7565b610a665760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016108e4565b506000908152600360205260409020546001600160a01b031690565b6000610a8d82611175565b9050806001600160a01b0316836001600160a01b03161415610b175760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f720000000000000000000000000000000000000000000000000000000000000060648201526084016108e4565b336001600160a01b0382161480610b335750610b338133611910565b610ba55760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016108e4565b610baf8383611d21565b505050565b6005546001600160a01b03163314610c0e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108e4565b600c805460ff19811660ff90911615179055565b610c2d335b82611d8f565b610c9f5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656400000000000000000000000000000060648201526084016108e4565b610baf838383611e51565b6000610cb583611302565b8210610d175760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016108e4565b6000805b600254811015610d885760028181548110610d3857610d38612bad565b6000918252602090912001546001600160a01b0386811691161415610d765783821415610d685791506108889050565b81610d7281612b52565b9250505b80610d8081612b52565b915050610d1b565b5060405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016108e4565b6008546040516000916001600160a01b03169047908381818185875af1925050503d8060008114610e32576040519150601f19603f3d011682016040523d82523d6000602084013e610e37565b606091505b50509050806109655760405162461bcd60e51b815260206004820152601b60248201527f4661696c656420746f2073656e6420746f2074726561737572792e000000000060448201526064016108e4565b610baf8383836040518060200160405280600081525061171e565b610eac33610c27565b610ef85760405162461bcd60e51b815260206004820152601560248201527f4e6f7420617070726f76656420746f206275726e2e000000000000000000000060448201526064016108e4565b61096581611fd4565b60606000610f0e83611302565b905080610f2f5760408051600080825260208201909252905b509392505050565b60008167ffffffffffffffff811115610f4a57610f4a612bc3565b604051908082528060200260200182016040528015610f73578160200160208202803683370190505b50905060005b82811015610f2757610f8b8582610caa565b828281518110610f9d57610f9d612bad565b602090810291909101015280610fb281612b52565b915050610f79565b6000805b8281101561102f57846001600160a01b03166002858584818110610fe457610fe4612bad565b9050602002013581548110610ffb57610ffb612bad565b6000918252602090912001546001600160a01b03161461101f576000915050611035565b61102881612b52565b9050610fbe565b50600190505b9392505050565b60025460009082106110b65760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201527f7574206f6620626f756e6473000000000000000000000000000000000000000060648201526084016108e4565b5090565b6005546001600160a01b031633146111145760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108e4565b80516111279060069060208401906123c6565b5050565b60005b825181101561116e5761115c858585848151811061114e5761114e612bad565b60200260200101518561171e565b8061116681612b52565b91505061112e565b5050505050565b6000806002838154811061118b5761118b612bad565b6000918252602090912001546001600160a01b03169050806108885760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e000000000000000000000000000000000000000000000060648201526084016108e4565b6006805461122290612b17565b80601f016020809104026020016040519081016040528092919081815260200182805461124e90612b17565b801561129b5780601f106112705761010080835404028352916020019161129b565b820191906000526020600020905b81548152906001019060200180831161127e57829003601f168201915b505050505081565b6005546001600160a01b031633146112fd5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108e4565b600955565b60006001600160a01b0382166113805760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f20616464726573730000000000000000000000000000000000000000000060648201526084016108e4565b6000805b6002548110156113dc57600281815481106113a1576113a1612bad565b6000918252602090912001546001600160a01b03858116911614156113cc576113c982612b52565b91505b6113d581612b52565b9050611384565b5092915050565b6005546001600160a01b0316331461143d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108e4565b6114476000612056565b565b6005546001600160a01b031633146114a35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108e4565b600b55565b60606001805461097790612b17565b600254600c5460ff1661150c5760405162461bcd60e51b815260206004820152601a60248201527f5075626c69632073616c65206973206e6f74206163746976652e00000000000060448201526064016108e4565b60095461151a906001612a89565b6115248383612a89565b106115715760405162461bcd60e51b815260206004820152601360248201527f45786365646573206d617820737570706c792e0000000000000000000000000060448201526064016108e4565b600a5461157f906001612a89565b82106115cd5760405162461bcd60e51b815260206004820152601c60248201527f45786365656473206d617820706572207472616e73616374696f6e2e0000000060448201526064016108e4565b34600b54836115dc9190612ab5565b146116295760405162461bcd60e51b815260206004820152601760248201527f496e76616c69642066756e64732070726f76696465642e00000000000000000060448201526064016108e4565b60005b82811015610baf57611647336116428385612a89565b611c5b565b8061165181612b52565b91505061162c565b6001600160a01b0382163314156116b25760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016108e4565b3360008181526004602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6117283383611d8f565b61179a5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656400000000000000000000000000000060648201526084016108e4565b6117a6848484846120a8565b50505050565b60606117b782611cd7565b6118035760405162461bcd60e51b815260206004820152601560248201527f546f6b656e20646f6573206e6f742065786973742e000000000000000000000060448201526064016108e4565b600661180e83612131565b60405160200161181f92919061291e565b6040516020818303038152906040529050919050565b6005546001600160a01b0316331461188f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108e4565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b0316331461190b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108e4565b600a55565b6007546040517fc45527910000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015260009281169190841690829063c45527919060240160206040518083038186803b15801561197657600080fd5b505afa15801561198a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119ae9190612857565b6001600160a01b031614806119db57506001600160a01b0383166000908152600d602052604090205460ff165b156119ea576001915050610888565b6001600160a01b0380851660009081526004602090815260408083209387168352929052205460ff165b949350505050565b6005546001600160a01b03163314611a765760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108e4565b6001600160a01b038116611af25760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016108e4565b61096581612056565b60005b81518110156117a657611b2b8484848481518110611b1e57611b1e612bad565b6020026020010151610c22565b80611b3581612b52565b915050611afe565b6005546001600160a01b03163314611b975760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108e4565b6001600160a01b03166000908152600d60205260409020805460ff19811660ff90911615179055565b60006001600160e01b031982167f80ac58cd000000000000000000000000000000000000000000000000000000001480611c2357506001600160e01b031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061088857507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b0319831614610888565b6002805460018101825560009182527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0180546001600160a01b0319166001600160a01b0385169081179091556040518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60025460009082108015610888575060006001600160a01b031660028381548110611d0457611d04612bad565b6000918252602090912001546001600160a01b0316141592915050565b600081815260036020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611d5682611175565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611d9a82611cd7565b611dfb5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016108e4565b6000611e0683611175565b9050806001600160a01b0316846001600160a01b03161480611e415750836001600160a01b0316611e36846109fa565b6001600160a01b0316145b80611a145750611a148185611910565b826001600160a01b0316611e6482611175565b6001600160a01b031614611ee05760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e000000000000000000000000000000000000000000000060648201526084016108e4565b6001600160a01b038216611f5b5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016108e4565b611f66600082611d21565b8160028281548110611f7a57611f7a612bad565b6000918252602082200180546001600160a01b0319166001600160a01b03938416179055604051839285811692908716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9190a4505050565b6000611fdf82611175565b9050611fec600083611d21565b60006002838154811061200157612001612bad565b6000918252602082200180546001600160a01b0319166001600160a01b0393841617905560405184928416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6120b3848484611e51565b6120bf84848484612263565b6117a65760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016108e4565b60608161217157505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b811561219b578061218581612b52565b91506121949050600a83612aa1565b9150612175565b60008167ffffffffffffffff8111156121b6576121b6612bc3565b6040519080825280601f01601f1916602001820160405280156121e0576020820181803683370190505b5090505b8415611a14576121f5600183612ad4565b9150612202600a86612b6d565b61220d906030612a89565b60f81b81838151811061222257612222612bad565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535061225c600a86612aa1565b94506121e4565b60006001600160a01b0384163b156123bb57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906122a79033908990889088906004016129c5565b602060405180830381600087803b1580156122c157600080fd5b505af19250505080156122f1575060408051601f3d908101601f191682019092526122ee9181019061283a565b60015b6123a1573d80801561231f576040519150601f19603f3d011682016040523d82523d6000602084013e612324565b606091505b5080516123995760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016108e4565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611a14565b506001949350505050565b8280546123d290612b17565b90600052602060002090601f0160209004810192826123f4576000855561243a565b82601f1061240d57805160ff191683800117855561243a565b8280016001018555821561243a579182015b8281111561243a57825182559160200191906001019061241f565b506110b69291505b808211156110b65760008155600101612442565b600067ffffffffffffffff83111561247057612470612bc3565b612483601f8401601f1916602001612a58565b905082815283838301111561249757600080fd5b828260208301376000602084830101529392505050565b600082601f8301126124bf57600080fd5b8135602067ffffffffffffffff8211156124db576124db612bc3565b8160051b6124ea828201612a58565b83815282810190868401838801850189101561250557600080fd5b600093505b8584101561252857803583526001939093019291840191840161250a565b50979650505050505050565b600082601f83011261254557600080fd5b61103583833560208501612456565b60006020828403121561256657600080fd5b813561103581612bd9565b6000806040838503121561258457600080fd5b823561258f81612bd9565b9150602083013561259f81612bd9565b809150509250929050565b6000806000606084860312156125bf57600080fd5b83356125ca81612bd9565b925060208401356125da81612bd9565b9150604084013567ffffffffffffffff8111156125f657600080fd5b612602868287016124ae565b9150509250925092565b6000806000806080858703121561262257600080fd5b843561262d81612bd9565b9350602085013561263d81612bd9565b9250604085013567ffffffffffffffff8082111561265a57600080fd5b612666888389016124ae565b9350606087013591508082111561267c57600080fd5b5061268987828801612534565b91505092959194509250565b6000806000606084860312156126aa57600080fd5b83356126b581612bd9565b925060208401356126c581612bd9565b929592945050506040919091013590565b600080600080608085870312156126ec57600080fd5b84356126f781612bd9565b9350602085013561270781612bd9565b925060408501359150606085013567ffffffffffffffff81111561272a57600080fd5b61268987828801612534565b60008060006040848603121561274b57600080fd5b833561275681612bd9565b9250602084013567ffffffffffffffff8082111561277357600080fd5b818601915086601f83011261278757600080fd5b81358181111561279657600080fd5b8760208260051b85010111156127ab57600080fd5b6020830194508093505050509250925092565b600080604083850312156127d157600080fd5b82356127dc81612bd9565b91506020830135801515811461259f57600080fd5b6000806040838503121561280457600080fd5b823561280f81612bd9565b946020939093013593505050565b60006020828403121561282f57600080fd5b813561103581612bee565b60006020828403121561284c57600080fd5b815161103581612bee565b60006020828403121561286957600080fd5b815161103581612bd9565b60006020828403121561288657600080fd5b813567ffffffffffffffff81111561289d57600080fd5b8201601f810184136128ae57600080fd5b611a1484823560208401612456565b6000602082840312156128cf57600080fd5b5035919050565b600081518084526128ee816020860160208601612aeb565b601f01601f19169290920160200192915050565b60008151612914818560208601612aeb565b9290920192915050565b600080845481600182811c91508083168061293a57607f831692505b602080841082141561295a57634e487b7160e01b86526022600452602486fd5b81801561296e576001811461297f576129ac565b60ff198616895284890196506129ac565b60008b81526020902060005b868110156129a45781548b82015290850190830161298b565b505084890196505b5050505050506129bc8185612902565b95945050505050565b60006001600160a01b038087168352808616602084015250836040830152608060608301526129f760808301846128d6565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015612a3957835183529284019291840191600101612a1d565b50909695505050505050565b60208152600061103560208301846128d6565b604051601f8201601f1916810167ffffffffffffffff81118282101715612a8157612a81612bc3565b604052919050565b60008219821115612a9c57612a9c612b81565b500190565b600082612ab057612ab0612b97565b500490565b6000816000190483118215151615612acf57612acf612b81565b500290565b600082821015612ae657612ae6612b81565b500390565b60005b83811015612b06578181015183820152602001612aee565b838111156117a65750506000910152565b600181811c90821680612b2b57607f821691505b60208210811415612b4c57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612b6657612b66612b81565b5060010190565b600082612b7c57612b7c612b97565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461096557600080fd5b6001600160e01b03198116811461096557600080fdfea264697066735822122029cb417026dae22566b358a11a8d7f71c7a5d9866811de1d0b59d22cbc8ee1b464736f6c634300080700330000000000000000000000000000000000000000000000000000000000000040000000000000000000000000668154dc24811a77eb06701b8201f6634335dd28000000000000000000000000000000000000000000000000000000000000003c68747470733a2f2f73746f726167652e676f6f676c65617069732e636f6d2f6d757474612d646174612f4d6574614d757474734d657461646174612f00000000

Deployed Bytecode

0x6080604052600436106102e75760003560e01c80636352211e11610184578063b88d4fde116100d6578063e100f3d11161008a578063f3993d1111610064578063f3993d11146107f4578063f43a22dc14610814578063f73c814b1461082a57600080fd5b8063e100f3d114610794578063e985e9c5146107b4578063f2fde38b146107d457600080fd5b8063c87b56dd116100bb578063c87b56dd14610734578063cd7c032614610754578063d26ea6c01461077457600080fd5b8063b88d4fde146106fa578063bc8893b41461071a57600080fd5b80638774e5d0116101385780639ec00c95116101125780639ec00c951461069a578063a0712d68146106c7578063a22cb465146106da57600080fd5b80638774e5d0146106475780638da5cb5b1461066757806395d89b411461068557600080fd5b80636f8b44b0116101695780636f8b44b0146105f257806370a0823114610612578063715018a61461063257600080fd5b80636352211e146105bd5780636c0360eb146105dd57600080fd5b8063339b2cff1161023d578063438b6300116101f157806355f804b3116101cb57806355f804b31461054d5780635a4fee301461056d5780635bab26e21461058d57600080fd5b8063438b6300146104e05780634d44660c1461050d5780634f6ccce71461052d57600080fd5b80633ccfd60b116102225780633ccfd60b1461048b57806342842e0e146104a057806342966c68146104c057600080fd5b8063339b2cff146104555780633c8da5881461047557600080fd5b8063095ea7b31161029f57806323b872dd1161027957806323b872dd146103ff5780632f745c591461041f57806332cb6b0c1461043f57600080fd5b8063095ea7b3146103b55780630c894cfe146103d557806318160ddd146103ea57600080fd5b806306fdde03116102d057806306fdde0314610338578063081812fc1461035a5780630922f9c51461039257600080fd5b806301ffc9a7146102ec578063029877b614610321575b600080fd5b3480156102f857600080fd5b5061030c61030736600461281d565b61084a565b60405190151581526020015b60405180910390f35b34801561032d57600080fd5b5061033661088e565b005b34801561034457600080fd5b5061034d610968565b6040516103189190612a45565b34801561036657600080fd5b5061037a6103753660046128bd565b6109fa565b6040516001600160a01b039091168152602001610318565b34801561039e57600080fd5b506103a760d281565b604051908152602001610318565b3480156103c157600080fd5b506103366103d03660046127f1565b610a82565b3480156103e157600080fd5b50610336610bb4565b3480156103f657600080fd5b506002546103a7565b34801561040b57600080fd5b5061033661041a366004612695565b610c22565b34801561042b57600080fd5b506103a761043a3660046127f1565b610caa565b34801561044b57600080fd5b506103a760095481565b34801561046157600080fd5b5060085461037a906001600160a01b031681565b34801561048157600080fd5b506103a7600b5481565b34801561049757600080fd5b50610336610de5565b3480156104ac57600080fd5b506103366104bb366004612695565b610e88565b3480156104cc57600080fd5b506103366104db3660046128bd565b610ea3565b3480156104ec57600080fd5b506105006104fb366004612554565b610f01565b6040516103189190612a01565b34801561051957600080fd5b5061030c610528366004612736565b610fba565b34801561053957600080fd5b506103a76105483660046128bd565b61103c565b34801561055957600080fd5b50610336610568366004612874565b6110ba565b34801561057957600080fd5b5061033661058836600461260c565b61112b565b34801561059957600080fd5b5061030c6105a8366004612554565b600d6020526000908152604090205460ff1681565b3480156105c957600080fd5b5061037a6105d83660046128bd565b611175565b3480156105e957600080fd5b5061034d611215565b3480156105fe57600080fd5b5061033661060d3660046128bd565b6112a3565b34801561061e57600080fd5b506103a761062d366004612554565b611302565b34801561063e57600080fd5b506103366113e3565b34801561065357600080fd5b506103366106623660046128bd565b611449565b34801561067357600080fd5b506005546001600160a01b031661037a565b34801561069157600080fd5b5061034d6114a8565b3480156106a657600080fd5b506103a76106b5366004612554565b600e6020526000908152604090205481565b6103366106d53660046128bd565b6114b7565b3480156106e657600080fd5b506103366106f53660046127be565b611659565b34801561070657600080fd5b506103366107153660046126d6565b61171e565b34801561072657600080fd5b50600c5461030c9060ff1681565b34801561074057600080fd5b5061034d61074f3660046128bd565b6117ac565b34801561076057600080fd5b5060075461037a906001600160a01b031681565b34801561078057600080fd5b5061033661078f366004612554565b611835565b3480156107a057600080fd5b506103366107af3660046128bd565b6118b1565b3480156107c057600080fd5b5061030c6107cf366004612571565b611910565b3480156107e057600080fd5b506103366107ef366004612554565b611a1c565b34801561080057600080fd5b5061033661080f3660046125aa565b611afb565b34801561082057600080fd5b506103a7600a5481565b34801561083657600080fd5b50610336610845366004612554565b611b3d565b60006001600160e01b031982167f780e9d63000000000000000000000000000000000000000000000000000000001480610888575061088882611bc0565b92915050565b6005546001600160a01b031633146108ed5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b6002541561093d5760405162461bcd60e51b815260206004820152601760248201527f526573657276657320616c72656164792074616b656e2e00000000000000000060448201526064016108e4565b60005b60d2811015610965576109533382611c5b565b8061095d81612b52565b915050610940565b50565b60606000805461097790612b17565b80601f01602080910402602001604051908101604052809291908181526020018280546109a390612b17565b80156109f05780601f106109c5576101008083540402835291602001916109f0565b820191906000526020600020905b8154815290600101906020018083116109d357829003601f168201915b5050505050905090565b6000610a0582611cd7565b610a665760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016108e4565b506000908152600360205260409020546001600160a01b031690565b6000610a8d82611175565b9050806001600160a01b0316836001600160a01b03161415610b175760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f720000000000000000000000000000000000000000000000000000000000000060648201526084016108e4565b336001600160a01b0382161480610b335750610b338133611910565b610ba55760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016108e4565b610baf8383611d21565b505050565b6005546001600160a01b03163314610c0e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108e4565b600c805460ff19811660ff90911615179055565b610c2d335b82611d8f565b610c9f5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656400000000000000000000000000000060648201526084016108e4565b610baf838383611e51565b6000610cb583611302565b8210610d175760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016108e4565b6000805b600254811015610d885760028181548110610d3857610d38612bad565b6000918252602090912001546001600160a01b0386811691161415610d765783821415610d685791506108889050565b81610d7281612b52565b9250505b80610d8081612b52565b915050610d1b565b5060405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016108e4565b6008546040516000916001600160a01b03169047908381818185875af1925050503d8060008114610e32576040519150601f19603f3d011682016040523d82523d6000602084013e610e37565b606091505b50509050806109655760405162461bcd60e51b815260206004820152601b60248201527f4661696c656420746f2073656e6420746f2074726561737572792e000000000060448201526064016108e4565b610baf8383836040518060200160405280600081525061171e565b610eac33610c27565b610ef85760405162461bcd60e51b815260206004820152601560248201527f4e6f7420617070726f76656420746f206275726e2e000000000000000000000060448201526064016108e4565b61096581611fd4565b60606000610f0e83611302565b905080610f2f5760408051600080825260208201909252905b509392505050565b60008167ffffffffffffffff811115610f4a57610f4a612bc3565b604051908082528060200260200182016040528015610f73578160200160208202803683370190505b50905060005b82811015610f2757610f8b8582610caa565b828281518110610f9d57610f9d612bad565b602090810291909101015280610fb281612b52565b915050610f79565b6000805b8281101561102f57846001600160a01b03166002858584818110610fe457610fe4612bad565b9050602002013581548110610ffb57610ffb612bad565b6000918252602090912001546001600160a01b03161461101f576000915050611035565b61102881612b52565b9050610fbe565b50600190505b9392505050565b60025460009082106110b65760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201527f7574206f6620626f756e6473000000000000000000000000000000000000000060648201526084016108e4565b5090565b6005546001600160a01b031633146111145760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108e4565b80516111279060069060208401906123c6565b5050565b60005b825181101561116e5761115c858585848151811061114e5761114e612bad565b60200260200101518561171e565b8061116681612b52565b91505061112e565b5050505050565b6000806002838154811061118b5761118b612bad565b6000918252602090912001546001600160a01b03169050806108885760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e000000000000000000000000000000000000000000000060648201526084016108e4565b6006805461122290612b17565b80601f016020809104026020016040519081016040528092919081815260200182805461124e90612b17565b801561129b5780601f106112705761010080835404028352916020019161129b565b820191906000526020600020905b81548152906001019060200180831161127e57829003601f168201915b505050505081565b6005546001600160a01b031633146112fd5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108e4565b600955565b60006001600160a01b0382166113805760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f20616464726573730000000000000000000000000000000000000000000060648201526084016108e4565b6000805b6002548110156113dc57600281815481106113a1576113a1612bad565b6000918252602090912001546001600160a01b03858116911614156113cc576113c982612b52565b91505b6113d581612b52565b9050611384565b5092915050565b6005546001600160a01b0316331461143d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108e4565b6114476000612056565b565b6005546001600160a01b031633146114a35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108e4565b600b55565b60606001805461097790612b17565b600254600c5460ff1661150c5760405162461bcd60e51b815260206004820152601a60248201527f5075626c69632073616c65206973206e6f74206163746976652e00000000000060448201526064016108e4565b60095461151a906001612a89565b6115248383612a89565b106115715760405162461bcd60e51b815260206004820152601360248201527f45786365646573206d617820737570706c792e0000000000000000000000000060448201526064016108e4565b600a5461157f906001612a89565b82106115cd5760405162461bcd60e51b815260206004820152601c60248201527f45786365656473206d617820706572207472616e73616374696f6e2e0000000060448201526064016108e4565b34600b54836115dc9190612ab5565b146116295760405162461bcd60e51b815260206004820152601760248201527f496e76616c69642066756e64732070726f76696465642e00000000000000000060448201526064016108e4565b60005b82811015610baf57611647336116428385612a89565b611c5b565b8061165181612b52565b91505061162c565b6001600160a01b0382163314156116b25760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016108e4565b3360008181526004602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6117283383611d8f565b61179a5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656400000000000000000000000000000060648201526084016108e4565b6117a6848484846120a8565b50505050565b60606117b782611cd7565b6118035760405162461bcd60e51b815260206004820152601560248201527f546f6b656e20646f6573206e6f742065786973742e000000000000000000000060448201526064016108e4565b600661180e83612131565b60405160200161181f92919061291e565b6040516020818303038152906040529050919050565b6005546001600160a01b0316331461188f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108e4565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b0316331461190b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108e4565b600a55565b6007546040517fc45527910000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015260009281169190841690829063c45527919060240160206040518083038186803b15801561197657600080fd5b505afa15801561198a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119ae9190612857565b6001600160a01b031614806119db57506001600160a01b0383166000908152600d602052604090205460ff165b156119ea576001915050610888565b6001600160a01b0380851660009081526004602090815260408083209387168352929052205460ff165b949350505050565b6005546001600160a01b03163314611a765760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108e4565b6001600160a01b038116611af25760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016108e4565b61096581612056565b60005b81518110156117a657611b2b8484848481518110611b1e57611b1e612bad565b6020026020010151610c22565b80611b3581612b52565b915050611afe565b6005546001600160a01b03163314611b975760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108e4565b6001600160a01b03166000908152600d60205260409020805460ff19811660ff90911615179055565b60006001600160e01b031982167f80ac58cd000000000000000000000000000000000000000000000000000000001480611c2357506001600160e01b031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061088857507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b0319831614610888565b6002805460018101825560009182527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0180546001600160a01b0319166001600160a01b0385169081179091556040518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60025460009082108015610888575060006001600160a01b031660028381548110611d0457611d04612bad565b6000918252602090912001546001600160a01b0316141592915050565b600081815260036020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611d5682611175565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611d9a82611cd7565b611dfb5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016108e4565b6000611e0683611175565b9050806001600160a01b0316846001600160a01b03161480611e415750836001600160a01b0316611e36846109fa565b6001600160a01b0316145b80611a145750611a148185611910565b826001600160a01b0316611e6482611175565b6001600160a01b031614611ee05760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e000000000000000000000000000000000000000000000060648201526084016108e4565b6001600160a01b038216611f5b5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016108e4565b611f66600082611d21565b8160028281548110611f7a57611f7a612bad565b6000918252602082200180546001600160a01b0319166001600160a01b03938416179055604051839285811692908716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9190a4505050565b6000611fdf82611175565b9050611fec600083611d21565b60006002838154811061200157612001612bad565b6000918252602082200180546001600160a01b0319166001600160a01b0393841617905560405184928416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6120b3848484611e51565b6120bf84848484612263565b6117a65760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016108e4565b60608161217157505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b811561219b578061218581612b52565b91506121949050600a83612aa1565b9150612175565b60008167ffffffffffffffff8111156121b6576121b6612bc3565b6040519080825280601f01601f1916602001820160405280156121e0576020820181803683370190505b5090505b8415611a14576121f5600183612ad4565b9150612202600a86612b6d565b61220d906030612a89565b60f81b81838151811061222257612222612bad565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535061225c600a86612aa1565b94506121e4565b60006001600160a01b0384163b156123bb57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906122a79033908990889088906004016129c5565b602060405180830381600087803b1580156122c157600080fd5b505af19250505080156122f1575060408051601f3d908101601f191682019092526122ee9181019061283a565b60015b6123a1573d80801561231f576040519150601f19603f3d011682016040523d82523d6000602084013e612324565b606091505b5080516123995760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016108e4565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611a14565b506001949350505050565b8280546123d290612b17565b90600052602060002090601f0160209004810192826123f4576000855561243a565b82601f1061240d57805160ff191683800117855561243a565b8280016001018555821561243a579182015b8281111561243a57825182559160200191906001019061241f565b506110b69291505b808211156110b65760008155600101612442565b600067ffffffffffffffff83111561247057612470612bc3565b612483601f8401601f1916602001612a58565b905082815283838301111561249757600080fd5b828260208301376000602084830101529392505050565b600082601f8301126124bf57600080fd5b8135602067ffffffffffffffff8211156124db576124db612bc3565b8160051b6124ea828201612a58565b83815282810190868401838801850189101561250557600080fd5b600093505b8584101561252857803583526001939093019291840191840161250a565b50979650505050505050565b600082601f83011261254557600080fd5b61103583833560208501612456565b60006020828403121561256657600080fd5b813561103581612bd9565b6000806040838503121561258457600080fd5b823561258f81612bd9565b9150602083013561259f81612bd9565b809150509250929050565b6000806000606084860312156125bf57600080fd5b83356125ca81612bd9565b925060208401356125da81612bd9565b9150604084013567ffffffffffffffff8111156125f657600080fd5b612602868287016124ae565b9150509250925092565b6000806000806080858703121561262257600080fd5b843561262d81612bd9565b9350602085013561263d81612bd9565b9250604085013567ffffffffffffffff8082111561265a57600080fd5b612666888389016124ae565b9350606087013591508082111561267c57600080fd5b5061268987828801612534565b91505092959194509250565b6000806000606084860312156126aa57600080fd5b83356126b581612bd9565b925060208401356126c581612bd9565b929592945050506040919091013590565b600080600080608085870312156126ec57600080fd5b84356126f781612bd9565b9350602085013561270781612bd9565b925060408501359150606085013567ffffffffffffffff81111561272a57600080fd5b61268987828801612534565b60008060006040848603121561274b57600080fd5b833561275681612bd9565b9250602084013567ffffffffffffffff8082111561277357600080fd5b818601915086601f83011261278757600080fd5b81358181111561279657600080fd5b8760208260051b85010111156127ab57600080fd5b6020830194508093505050509250925092565b600080604083850312156127d157600080fd5b82356127dc81612bd9565b91506020830135801515811461259f57600080fd5b6000806040838503121561280457600080fd5b823561280f81612bd9565b946020939093013593505050565b60006020828403121561282f57600080fd5b813561103581612bee565b60006020828403121561284c57600080fd5b815161103581612bee565b60006020828403121561286957600080fd5b815161103581612bd9565b60006020828403121561288657600080fd5b813567ffffffffffffffff81111561289d57600080fd5b8201601f810184136128ae57600080fd5b611a1484823560208401612456565b6000602082840312156128cf57600080fd5b5035919050565b600081518084526128ee816020860160208601612aeb565b601f01601f19169290920160200192915050565b60008151612914818560208601612aeb565b9290920192915050565b600080845481600182811c91508083168061293a57607f831692505b602080841082141561295a57634e487b7160e01b86526022600452602486fd5b81801561296e576001811461297f576129ac565b60ff198616895284890196506129ac565b60008b81526020902060005b868110156129a45781548b82015290850190830161298b565b505084890196505b5050505050506129bc8185612902565b95945050505050565b60006001600160a01b038087168352808616602084015250836040830152608060608301526129f760808301846128d6565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015612a3957835183529284019291840191600101612a1d565b50909695505050505050565b60208152600061103560208301846128d6565b604051601f8201601f1916810167ffffffffffffffff81118282101715612a8157612a81612bc3565b604052919050565b60008219821115612a9c57612a9c612b81565b500190565b600082612ab057612ab0612b97565b500490565b6000816000190483118215151615612acf57612acf612b81565b500290565b600082821015612ae657612ae6612b81565b500390565b60005b83811015612b06578181015183820152602001612aee565b838111156117a65750506000910152565b600181811c90821680612b2b57607f821691505b60208210811415612b4c57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612b6657612b66612b81565b5060010190565b600082612b7c57612b7c612b97565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461096557600080fd5b6001600160e01b03198116811461096557600080fdfea264697066735822122029cb417026dae22566b358a11a8d7f71c7a5d9866811de1d0b59d22cbc8ee1b464736f6c63430008070033

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

0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000668154dc24811a77eb06701b8201f6634335dd28000000000000000000000000000000000000000000000000000000000000003c68747470733a2f2f73746f726167652e676f6f676c65617069732e636f6d2f6d757474612d646174612f4d6574614d757474734d657461646174612f00000000

-----Decoded View---------------
Arg [0] : _baseURI (string): https://storage.googleapis.com/mutta-data/MetaMuttsMetadata/
Arg [1] : _treasuryAccount (address): 0x668154DC24811a77Eb06701B8201F6634335DD28

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 000000000000000000000000668154dc24811a77eb06701b8201f6634335dd28
Arg [2] : 000000000000000000000000000000000000000000000000000000000000003c
Arg [3] : 68747470733a2f2f73746f726167652e676f6f676c65617069732e636f6d2f6d
Arg [4] : 757474612d646174612f4d6574614d757474734d657461646174612f00000000


Deployed Bytecode Sourcemap

31067:5183:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26430:224;;;;;;;;;;-1:-1:-1;26430:224:0;;;;;:::i;:::-;;:::i;:::-;;;11004:14:1;;10997:22;10979:41;;10967:2;10952:18;26430:224:0;;;;;;;;33204:188;;;;;;;;;;;;;:::i;:::-;;15047:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;15859:308::-;;;;;;;;;;-1:-1:-1;15859:308:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;9619:55:1;;;9601:74;;9589:2;9574:18;15859:308:0;9455:226:1;31310:38:0;;;;;;;;;;;;31345:3;31310:38;;;;;20294:25:1;;;20282:2;20267:18;31310:38:0;20148:177:1;15382:411:0;;;;;;;;;;-1:-1:-1;15382:411:0;;;;;:::i;:::-;;:::i;33088:108::-;;;;;;;;;;;;;:::i;26730:110::-;;;;;;;;;;-1:-1:-1;26818:7:0;:14;26730:110;;16918:376;;;;;;;;;;-1:-1:-1;16918:376:0;;;;;:::i;:::-;;:::i;27206:490::-;;;;;;;;;;-1:-1:-1;27206:490:0;;;;;:::i;:::-;;:::i;31233:32::-;;;;;;;;;;;;;;;;31194:30;;;;;;;;;;-1:-1:-1;31194:30:0;;;;-1:-1:-1;;;;;31194:30:0;;;31355:38;;;;;;;;;;;;;;;;34113:201;;;;;;;;;;;;;:::i;17365:185::-;;;;;;;;;;-1:-1:-1;17365:185:0;;;;;:::i;:::-;;:::i;33911:194::-;;;;;;;;;;-1:-1:-1;33911:194:0;;;;;:::i;:::-;;:::i;34322:432::-;;;;;;;;;;-1:-1:-1;34322:432:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;35330:289::-;;;;;;;;;;-1:-1:-1;35330:289:0;;;;;:::i;:::-;;:::i;26917:205::-;;;;;;;;;;-1:-1:-1;26917:205:0;;;;;:::i;:::-;;:::i;32059:98::-;;;;;;;;;;-1:-1:-1;32059:98:0;;;;;:::i;:::-;;:::i;35024:298::-;;;;;;;;;;-1:-1:-1;35024:298:0;;;;;:::i;:::-;;:::i;31447:44::-;;;;;;;;;;-1:-1:-1;31447:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;14654:326;;;;;;;;;;-1:-1:-1;14654:326:0;;;;;:::i;:::-;;:::i;31122:21::-;;;;;;;;;;;;;:::i;32165:101::-;;;;;;;;;;-1:-1:-1;32165:101:0;;;;;:::i;:::-;;:::i;14200:392::-;;;;;;;;;;-1:-1:-1;14200:392:0;;;;;:::i;:::-;;:::i;29414:103::-;;;;;;;;;;;;;:::i;32274:104::-;;;;;;;;;;-1:-1:-1;32274:104:0;;;;;:::i;:::-;;:::i;28763:87::-;;;;;;;;;;-1:-1:-1;28836:6:0;;-1:-1:-1;;;;;28836:6:0;28763:87;;15216:104;;;;;;;;;;;;;:::i;31498:50::-;;;;;;;;;;-1:-1:-1;31498:50:0;;;;;:::i;:::-;;;;;;;;;;;;;;33400:503;;;;;;:::i;:::-;;:::i;16239:327::-;;;;;;;;;;-1:-1:-1;16239:327:0;;;;;:::i;:::-;;:::i;17621:365::-;;;;;;;;;;-1:-1:-1;17621:365:0;;;;;:::i;:::-;;:::i;31400:38::-;;;;;;;;;;-1:-1:-1;31400:38:0;;;;;;;;32486:271;;;;;;;;;;-1:-1:-1;32486:271:0;;;;;:::i;:::-;;:::i;31152:35::-;;;;;;;;;;-1:-1:-1;31152:35:0;;;;-1:-1:-1;;;;;31152:35:0;;;32765:169;;;;;;;;;;-1:-1:-1;32765:169:0;;;;;:::i;:::-;;:::i;32386:92::-;;;;;;;;;;-1:-1:-1;32386:92:0;;;;;:::i;:::-;;:::i;35627:458::-;;;;;;;;;;-1:-1:-1;35627:458:0;;;;;:::i;:::-;;:::i;29672:201::-;;;;;;;;;;-1:-1:-1;29672:201:0;;;;;:::i;:::-;;:::i;34762:254::-;;;;;;;;;;-1:-1:-1;34762:254:0;;;;;:::i;:::-;;:::i;31274:29::-;;;;;;;;;;;;;;;;32942:138;;;;;;;;;;-1:-1:-1;32942:138:0;;;;;:::i;:::-;;:::i;26430:224::-;26532:4;-1:-1:-1;;;;;;26556:50:0;;26571:35;26556:50;;:90;;;26610:36;26634:11;26610:23;:36::i;:::-;26549:97;26430:224;-1:-1:-1;;26430:224:0:o;33204:188::-;28836:6;;-1:-1:-1;;;;;28836:6:0;12891:10;28983:23;28975:68;;;;-1:-1:-1;;;28975:68:0;;17287:2:1;28975:68:0;;;17269:21:1;;;17306:18;;;17299:30;17365:34;17345:18;;;17338:62;17417:18;;28975:68:0;;;;;;;;;33269:7:::1;:14:::0;:19;33261:55:::1;;;::::0;-1:-1:-1;;;33261:55:0;;18810:2:1;33261:55:0::1;::::0;::::1;18792:21:1::0;18849:2;18829:18;;;18822:30;18888:25;18868:18;;;18861:53;18931:18;;33261:55:0::1;18608:347:1::0;33261:55:0::1;33332:9;33327:57;31345:3;33343:1;:12;33327:57;;;33362:22;12891:10:::0;33382:1:::1;33362:5;:22::i;:::-;33357:3:::0;::::1;::::0;::::1;:::i;:::-;;;;33327:57;;;;33204:188::o:0;15047:100::-;15101:13;15134:5;15127:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15047:100;:::o;15859:308::-;15980:7;16027:16;16035:7;16027;:16::i;:::-;16005:110;;;;-1:-1:-1;;;16005:110:0;;16874:2:1;16005:110:0;;;16856:21:1;16913:2;16893:18;;;16886:30;16952:34;16932:18;;;16925:62;-1:-1:-1;;;17003:18:1;;;16996:42;17055:19;;16005:110:0;16672:408:1;16005:110:0;-1:-1:-1;16135:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;16135:24:0;;15859:308::o;15382:411::-;15463:13;15479:23;15494:7;15479:14;:23::i;:::-;15463:39;;15527:5;-1:-1:-1;;;;;15521:11:0;:2;-1:-1:-1;;;;;15521:11:0;;;15513:57;;;;-1:-1:-1;;;15513:57:0;;18408:2:1;15513:57:0;;;18390:21:1;18447:2;18427:18;;;18420:30;18486:34;18466:18;;;18459:62;18557:3;18537:18;;;18530:31;18578:19;;15513:57:0;18206:397:1;15513:57:0;12891:10;-1:-1:-1;;;;;15605:21:0;;;;:62;;-1:-1:-1;15630:37:0;15647:5;12891:10;35627:458;:::i;15630:37::-;15583:168;;;;-1:-1:-1;;;15583:168:0;;14926:2:1;15583:168:0;;;14908:21:1;14965:2;14945:18;;;14938:30;15004:34;14984:18;;;14977:62;15075:26;15055:18;;;15048:54;15119:19;;15583:168:0;14724:420:1;15583:168:0;15764:21;15773:2;15777:7;15764:8;:21::i;:::-;15452:341;15382:411;;:::o;33088:108::-;28836:6;;-1:-1:-1;;;;;28836:6:0;12891:10;28983:23;28975:68;;;;-1:-1:-1;;;28975:68:0;;17287:2:1;28975:68:0;;;17269:21:1;;;17306:18;;;17299:30;17365:34;17345:18;;;17338:62;17417:18;;28975:68:0;17085:356:1;28975:68:0;33172:16:::1;::::0;;-1:-1:-1;;33152:36:0;::::1;33172:16;::::0;;::::1;33171:17;33152:36;::::0;;33088:108::o;16918:376::-;17127:41;12891:10;17146:12;17160:7;17127:18;:41::i;:::-;17105:140;;;;-1:-1:-1;;;17105:140:0;;19162:2:1;17105:140:0;;;19144:21:1;19201:2;19181:18;;;19174:30;19240:34;19220:18;;;19213:62;19311:19;19291:18;;;19284:47;19348:19;;17105:140:0;18960:413:1;17105:140:0;17258:28;17268:4;17274:2;17278:7;17258:9;:28::i;27206:490::-;27303:15;27347:16;27357:5;27347:9;:16::i;:::-;27339:5;:24;27331:80;;;;-1:-1:-1;;;27331:80:0;;12161:2:1;27331:80:0;;;12143:21:1;12200:2;12180:18;;;12173:30;12239:34;12219:18;;;12212:62;-1:-1:-1;;;12290:18:1;;;12283:41;12341:19;;27331:80:0;11959:407:1;27331:80:0;27424:10;27449:6;27445:178;27461:7;:14;27457:18;;27445:178;;;27508:7;27516:1;27508:10;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;27499:19:0;;;27508:10;;27499:19;27496:116;;;27550:5;27541;:14;27538:58;;;27564:1;-1:-1:-1;27557:8:0;;-1:-1:-1;27557:8:0;27538:58;27589:7;;;;:::i;:::-;;;;27538:58;27477:3;;;;:::i;:::-;;;;27445:178;;;-1:-1:-1;27635:53:0;;-1:-1:-1;;;27635:53:0;;12161:2:1;27635:53:0;;;12143:21:1;12200:2;12180:18;;;12173:30;12239:34;12219:18;;;12212:62;-1:-1:-1;;;12290:18:1;;;12283:41;12341:19;;27635:53:0;11959:407:1;34113:201:0;34170:15;;:78;;34152:12;;-1:-1:-1;;;;;34170:15:0;;34198:21;;34152:12;34170:78;34152:12;34170:78;34198:21;34170:15;:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34151:97;;;34267:7;34259:47;;;;-1:-1:-1;;;34259:47:0;;11805:2:1;34259:47:0;;;11787:21:1;11844:2;11824:18;;;11817:30;11883:29;11863:18;;;11856:57;11930:18;;34259:47:0;11603:351:1;17365:185:0;17503:39;17520:4;17526:2;17530:7;17503:39;;;;;;;;;;;;:16;:39::i;33911:194::-;33982:41;12891:10;34001:12;12811:98;33982:41;33960:112;;;;-1:-1:-1;;;33960:112:0;;18058:2:1;33960:112:0;;;18040:21:1;18097:2;18077:18;;;18070:30;18136:23;18116:18;;;18109:51;18177:18;;33960:112:0;17856:345:1;33960:112:0;34083:14;34089:7;34083:5;:14::i;34322:432::-;34409:16;34443:18;34464:17;34474:6;34464:9;:17::i;:::-;34443:38;-1:-1:-1;34496:15:0;34492:44;;34520:16;;;34534:1;34520:16;;;;;;;;;;;-1:-1:-1;34513:23:0;34322:432;-1:-1:-1;;;34322:432:0:o;34492:44::-;34549:25;34591:10;34577:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34577:25:0;;34549:53;;34618:9;34613:108;34633:10;34629:1;:14;34613:108;;;34679:30;34699:6;34707:1;34679:19;:30::i;:::-;34665:8;34674:1;34665:11;;;;;;;;:::i;:::-;;;;;;;;;;:44;34645:3;;;;:::i;:::-;;;;34613:108;;35330:289;35446:4;35473:9;35468:120;35484:20;;;35468:120;;;35555:7;-1:-1:-1;;;;;35530:32:0;:7;35538:9;;35548:1;35538:12;;;;;;;:::i;:::-;;;;;;;35530:21;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;35530:21:0;:32;35526:50;;35571:5;35564:12;;;;;35526:50;35506:3;;;:::i;:::-;;;35468:120;;;;35607:4;35600:11;;35330:289;;;;;;:::o;26917:205::-;27028:7;:14;26992:7;;27020:22;;27012:79;;;;-1:-1:-1;;;27012:79:0;;19937:2:1;27012:79:0;;;19919:21:1;19976:2;19956:18;;;19949:30;20015:34;19995:18;;;19988:62;20086:14;20066:18;;;20059:42;20118:19;;27012:79:0;19735:408:1;27012:79:0;-1:-1:-1;27109:5:0;26917:205::o;32059:98::-;28836:6;;-1:-1:-1;;;;;28836:6:0;12891:10;28983:23;28975:68;;;;-1:-1:-1;;;28975:68:0;;17287:2:1;28975:68:0;;;17269:21:1;;;17306:18;;;17299:30;17365:34;17345:18;;;17338:62;17417:18;;28975:68:0;17085:356:1;28975:68:0;32131:18;;::::1;::::0;:7:::1;::::0;:18:::1;::::0;::::1;::::0;::::1;:::i;:::-;;32059:98:::0;:::o;35024:298::-;35197:9;35192:123;35216:9;:16;35212:1;:20;35192:123;;;35254:49;35271:5;35278:3;35283:9;35293:1;35283:12;;;;;;;;:::i;:::-;;;;;;;35297:5;35254:16;:49::i;:::-;35234:3;;;;:::i;:::-;;;;35192:123;;;;35024:298;;;;:::o;14654:326::-;14771:7;14796:13;14812:7;14820;14812:16;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;14812:16:0;;-1:-1:-1;14861:19:0;14839:110;;;;-1:-1:-1;;;14839:110:0;;15762:2:1;14839:110:0;;;15744:21:1;15801:2;15781:18;;;15774:30;15840:34;15820:18;;;15813:62;15911:11;15891:18;;;15884:39;15940:19;;14839:110:0;15560:405:1;31122:21:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;32165:101::-;28836:6;;-1:-1:-1;;;;;28836:6:0;12891:10;28983:23;28975:68;;;;-1:-1:-1;;;28975:68:0;;17287:2:1;28975:68:0;;;17269:21:1;;;17306:18;;;17299:30;17365:34;17345:18;;;17338:62;17417:18;;28975:68:0;17085:356:1;28975:68:0;32235:10:::1;:23:::0;32165:101::o;14200:392::-;14322:4;-1:-1:-1;;;;;14353:19:0;;14345:74;;;;-1:-1:-1;;;14345:74:0;;15351:2:1;14345:74:0;;;15333:21:1;15390:2;15370:18;;;15363:30;15429:34;15409:18;;;15402:62;15500:12;15480:18;;;15473:40;15530:19;;14345:74:0;15149:406:1;14345:74:0;14432:10;14458:6;14453:109;14470:7;:14;14466:18;;14453:109;;;14517:7;14525:1;14517:10;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;14508:19:0;;;14517:10;;14508:19;14504:46;;;14543:7;;;:::i;:::-;;;14504:46;14486:3;;;:::i;:::-;;;14453:109;;;-1:-1:-1;14579:5:0;14200:392;-1:-1:-1;;14200:392:0:o;29414:103::-;28836:6;;-1:-1:-1;;;;;28836:6:0;12891:10;28983:23;28975:68;;;;-1:-1:-1;;;28975:68:0;;17287:2:1;28975:68:0;;;17269:21:1;;;17306:18;;;17299:30;17365:34;17345:18;;;17338:62;17417:18;;28975:68:0;17085:356:1;28975:68:0;29479:30:::1;29506:1;29479:18;:30::i;:::-;29414:103::o:0;32274:104::-;28836:6;;-1:-1:-1;;;;;28836:6:0;12891:10;28983:23;28975:68;;;;-1:-1:-1;;;28975:68:0;;17287:2:1;28975:68:0;;;17269:21:1;;;17306:18;;;17299:30;17365:34;17345:18;;;17338:62;17417:18;;28975:68:0;17085:356:1;28975:68:0;32346:10:::1;:24:::0;32274:104::o;15216:::-;15272:13;15305:7;15298:14;;;;;:::i;33400:503::-;33477:7;:14;33510:16;;;;33502:55;;;;-1:-1:-1;;;33502:55:0;;13399:2:1;33502:55:0;;;13381:21:1;13438:2;13418:18;;;13411:30;13477:28;13457:18;;;13450:56;13523:18;;33502:55:0;13197:350:1;33502:55:0;33598:10;;:14;;33611:1;33598:14;:::i;:::-;33576:19;33590:5;33576:11;:19;:::i;:::-;:36;33568:68;;;;-1:-1:-1;;;33568:68:0;;11457:2:1;33568:68:0;;;11439:21:1;11496:2;11476:18;;;11469:30;11535:21;11515:18;;;11508:49;11574:18;;33568:68:0;11255:343:1;33568:68:0;33663:10;;:14;;33676:1;33663:14;:::i;:::-;33655:5;:22;33647:63;;;;-1:-1:-1;;;33647:63:0;;19580:2:1;33647:63:0;;;19562:21:1;19619:2;19599:18;;;19592:30;19658;19638:18;;;19631:58;19706:18;;33647:63:0;19378:352:1;33647:63:0;33751:9;33737:10;;33729:5;:18;;;;:::i;:::-;:31;33721:67;;;;-1:-1:-1;;;33721:67:0;;16172:2:1;33721:67:0;;;16154:21:1;16211:2;16191:18;;;16184:30;16250:25;16230:18;;;16223:53;16293:18;;33721:67:0;15970:347:1;33721:67:0;33806:9;33801:95;33821:5;33817:1;:9;33801:95;;;33848:36;12891:10;33868:15;33882:1;33868:11;:15;:::i;:::-;33848:5;:36::i;:::-;33828:3;;;;:::i;:::-;;;;33801:95;;16239:327;-1:-1:-1;;;;;16374:24:0;;12891:10;16374:24;;16366:62;;;;-1:-1:-1;;;16366:62:0;;14159:2:1;16366:62:0;;;14141:21:1;14198:2;14178:18;;;14171:30;14237:27;14217:18;;;14210:55;14282:18;;16366:62:0;13957:349:1;16366:62:0;12891:10;16441:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;16441:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;16441:53:0;;;;;;;;;;16510:48;;10979:41:1;;;16441:42:0;;12891:10;16510:48;;10952:18:1;16510:48:0;;;;;;;16239:327;;:::o;17621:365::-;17810:41;12891:10;17843:7;17810:18;:41::i;:::-;17788:140;;;;-1:-1:-1;;;17788:140:0;;19162:2:1;17788:140:0;;;19144:21:1;19201:2;19181:18;;;19174:30;19240:34;19220:18;;;19213:62;19311:19;19291:18;;;19284:47;19348:19;;17788:140:0;18960:413:1;17788:140:0;17939:39;17953:4;17959:2;17963:7;17972:5;17939:13;:39::i;:::-;17621:365;;;;:::o;32486:271::-;32588:13;32627:17;32635:8;32627:7;:17::i;:::-;32619:51;;;;-1:-1:-1;;;32619:51:0;;16524:2:1;32619:51:0;;;16506:21:1;16563:2;16543:18;;;16536:30;16602:23;16582:18;;;16575:51;16643:18;;32619:51:0;16322:345:1;32619:51:0;32712:7;32721:26;32738:8;32721:16;:26::i;:::-;32695:53;;;;;;;;;:::i;:::-;;;;;;;;;;;;;32681:68;;32486:271;;;:::o;32765:169::-;28836:6;;-1:-1:-1;;;;;28836:6:0;12891:10;28983:23;28975:68;;;;-1:-1:-1;;;28975:68:0;;17287:2:1;28975:68:0;;;17269:21:1;;;17306:18;;;17299:30;17365:34;17345:18;;;17338:62;17417:18;;28975:68:0;17085:356:1;28975:68:0;32882:20:::1;:44:::0;;-1:-1:-1;;;;;;32882:44:0::1;-1:-1:-1::0;;;;;32882:44:0;;;::::1;::::0;;;::::1;::::0;;32765:169::o;32386:92::-;28836:6;;-1:-1:-1;;;;;28836:6:0;12891:10;28983:23;28975:68;;;;-1:-1:-1;;;28975:68:0;;17287:2:1;28975:68:0;;;17269:21:1;;;17306:18;;;17299:30;17365:34;17345:18;;;17338:62;17417:18;;28975:68:0;17085:356:1;28975:68:0;32450:10:::1;:20:::0;32386:92::o;35627:458::-;35847:20;;35915:29;;;;;-1:-1:-1;;;;;9619:55:1;;;35915:29:0;;;9601:74:1;35753:4:0;;35847:20;;;35907:50;;;;35847:20;;35915:21;;9574:18:1;;35915:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;35907:50:0;;:89;;;-1:-1:-1;;;;;;35974:22:0;;;;;;:12;:22;;;;;;;;35907:89;35889:130;;;36015:4;36008:11;;;;;35889:130;-1:-1:-1;;;;;16808:25:0;;;16779:4;16808:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;36037:40;36030:47;35627:458;-1:-1:-1;;;;35627:458:0:o;29672:201::-;28836:6;;-1:-1:-1;;;;;28836:6:0;12891:10;28983:23;28975:68;;;;-1:-1:-1;;;28975:68:0;;17287:2:1;28975:68:0;;;17269:21:1;;;17306:18;;;17299:30;17365:34;17345:18;;;17338:62;17417:18;;28975:68:0;17085:356:1;28975:68:0;-1:-1:-1;;;;;29761:22:0;::::1;29753:73;;;::::0;-1:-1:-1;;;29753:73:0;;12992:2:1;29753:73:0::1;::::0;::::1;12974:21:1::0;13031:2;13011:18;;;13004:30;13070:34;13050:18;;;13043:62;13141:8;13121:18;;;13114:36;13167:19;;29753:73:0::1;12790:402:1::0;29753:73:0::1;29837:28;29856:8;29837:18;:28::i;34762:254::-:0;34902:9;34897:112;34921:9;:16;34917:1;:20;34897:112;;;34959:38;34972:5;34979:3;34984:9;34994:1;34984:12;;;;;;;;:::i;:::-;;;;;;;34959;:38::i;:::-;34939:3;;;;:::i;:::-;;;;34897:112;;32942:138;28836:6;;-1:-1:-1;;;;;28836:6:0;12891:10;28983:23;28975:68;;;;-1:-1:-1;;;28975:68:0;;17287:2:1;28975:68:0;;;17269:21:1;;;17306:18;;;17299:30;17365:34;17345:18;;;17338:62;17417:18;;28975:68:0;17085:356:1;28975:68:0;-1:-1:-1;;;;;33046:26:0::1;;::::0;;;:12:::1;:26;::::0;;;;;;-1:-1:-1;;33016:56:0;::::1;33046:26;::::0;;::::1;33045:27;33016:56;::::0;;32942:138::o;13781:355::-;13928:4;-1:-1:-1;;;;;;13970:40:0;;13985:25;13970:40;;:105;;-1:-1:-1;;;;;;;14027:48:0;;14042:33;14027:48;13970:105;:158;;;-1:-1:-1;5344:25:0;-1:-1:-1;;;;;;5329:40:0;;;14092:36;5220:157;36093:154;36174:7;:16;;;;;;;-1:-1:-1;36174:16:0;;;;;;;-1:-1:-1;;;;;;36174:16:0;-1:-1:-1;;;;;36174:16:0;;;;;;;;36206:33;;36231:7;;-1:-1:-1;36206:33:0;;-1:-1:-1;;36206:33:0;36093:154;;:::o;19533:155::-;19632:7;:14;19598:4;;19622:24;;:58;;;;;19678:1;-1:-1:-1;;;;;19650:30:0;:7;19658;19650:16;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;19650:16:0;:30;;19615:65;19533:155;-1:-1:-1;;19533:155:0:o;23558:174::-;23633:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;23633:29:0;-1:-1:-1;;;;;23633:29:0;;;;;;;;:24;;23687:23;23633:24;23687:14;:23::i;:::-;-1:-1:-1;;;;;23678:46:0;;;;;;;;;;;23558:174;;:::o;19855:452::-;19984:4;20028:16;20036:7;20028;:16::i;:::-;20006:110;;;;-1:-1:-1;;;20006:110:0;;14513:2:1;20006:110:0;;;14495:21:1;14552:2;14532:18;;;14525:30;14591:34;14571:18;;;14564:62;-1:-1:-1;;;14642:18:1;;;14635:42;14694:19;;20006:110:0;14311:408:1;20006:110:0;20127:13;20143:23;20158:7;20143:14;:23::i;:::-;20127:39;;20196:5;-1:-1:-1;;;;;20185:16:0;:7;-1:-1:-1;;;;;20185:16:0;;:64;;;;20242:7;-1:-1:-1;;;;;20218:31:0;:20;20230:7;20218:11;:20::i;:::-;-1:-1:-1;;;;;20218:31:0;;20185:64;:113;;;;20266:32;20283:5;20290:7;20266:16;:32::i;22887:553::-;23060:4;-1:-1:-1;;;;;23033:31:0;:23;23048:7;23033:14;:23::i;:::-;-1:-1:-1;;;;;23033:31:0;;23011:122;;;;-1:-1:-1;;;23011:122:0;;17648:2:1;23011:122:0;;;17630:21:1;17687:2;17667:18;;;17660:30;17726:34;17706:18;;;17699:62;17797:11;17777:18;;;17770:39;17826:19;;23011:122:0;17446:405:1;23011:122:0;-1:-1:-1;;;;;23152:16:0;;23144:65;;;;-1:-1:-1;;;23144:65:0;;13754:2:1;23144:65:0;;;13736:21:1;13793:2;13773:18;;;13766:30;13832:34;13812:18;;;13805:62;13903:6;13883:18;;;13876:34;13927:19;;23144:65:0;13552:400:1;23144:65:0;23326:29;23343:1;23347:7;23326:8;:29::i;:::-;23385:2;23366:7;23374;23366:16;;;;;;;;:::i;:::-;;;;;;;;;:21;;-1:-1:-1;;;;;;23366:21:0;-1:-1:-1;;;;;23366:21:0;;;;;;23405:27;;23424:7;;23405:27;;;;;;;;;;23366:16;23405:27;22887:553;;;:::o;22218:332::-;22278:13;22294:23;22309:7;22294:14;:23::i;:::-;22278:39;;22419:29;22436:1;22440:7;22419:8;:29::i;:::-;22486:1;22459:7;22467;22459:16;;;;;;;;:::i;:::-;;;;;;;;;:29;;-1:-1:-1;;;;;;22459:29:0;-1:-1:-1;;;;;22459:29:0;;;;;;22506:36;;22534:7;;22506:36;;;;;22459:16;;22506:36;22267:283;22218:332;:::o;30033:191::-;30126:6;;;-1:-1:-1;;;;;30143:17:0;;;-1:-1:-1;;;;;;30143:17:0;;;;;;;30176:40;;30126:6;;;30143:17;30126:6;;30176:40;;30107:16;;30176:40;30096:128;30033:191;:::o;18868:352::-;19025:28;19035:4;19041:2;19045:7;19025:9;:28::i;:::-;19086:48;19109:4;19115:2;19119:7;19128:5;19086:22;:48::i;:::-;19064:148;;;;-1:-1:-1;;;19064:148:0;;12573:2:1;19064:148:0;;;12555:21:1;12612:2;12592:18;;;12585:30;12651:34;12631:18;;;12624:62;12722:20;12702:18;;;12695:48;12760:19;;19064:148:0;12371:414:1;648:723:0;704:13;925:10;921:53;;-1:-1:-1;;952:10:0;;;;;;;;;;;;;;;;;;648:723::o;921:53::-;999:5;984:12;1040:78;1047:9;;1040:78;;1073:8;;;;:::i;:::-;;-1:-1:-1;1096:10:0;;-1:-1:-1;1104:2:0;1096:10;;:::i;:::-;;;1040:78;;;1128:19;1160:6;1150:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1150:17:0;;1128:39;;1178:154;1185:10;;1178:154;;1212:11;1222:1;1212:11;;:::i;:::-;;-1:-1:-1;1281:10:0;1289:2;1281:5;:10;:::i;:::-;1268:24;;:2;:24;:::i;:::-;1255:39;;1238:6;1245;1238:14;;;;;;;;:::i;:::-;;;;:56;;;;;;;;;;-1:-1:-1;1309:11:0;1318:2;1309:11;;:::i;:::-;;;1178:154;;24297:980;24452:4;-1:-1:-1;;;;;24473:13:0;;214:20;262:8;24469:801;;24526:175;;-1:-1:-1;;;24526:175:0;;-1:-1:-1;;;;;24526:36:0;;;;;:175;;12891:10;;24620:4;;24647:7;;24677:5;;24526:175;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24526:175:0;;;;;;;;-1:-1:-1;;24526:175:0;;;;;;;;;;;;:::i;:::-;;;24505:710;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24884:13:0;;24880:320;;24927:108;;-1:-1:-1;;;24927:108:0;;12573:2:1;24927:108:0;;;12555:21:1;12612:2;12592:18;;;12585:30;12651:34;12631:18;;;12624:62;12722:20;12702:18;;;12695:48;12760:19;;24927:108:0;12371:414:1;24880:320:0;25150:6;25144:13;25135:6;25131:2;25127:15;25120:38;24505:710;-1:-1:-1;;;;;;24765:51:0;-1:-1:-1;;;24765:51:0;;-1:-1:-1;24758:58:0;;24469:801;-1:-1:-1;25254:4:0;24297:980;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:406:1;78:5;112:18;104:6;101:30;98:56;;;134:18;;:::i;:::-;172:57;217:2;196:15;;-1:-1:-1;;192:29:1;223:4;188:40;172:57;:::i;:::-;163:66;;252:6;245:5;238:21;292:3;283:6;278:3;274:16;271:25;268:45;;;309:1;306;299:12;268:45;358:6;353:3;346:4;339:5;335:16;322:43;412:1;405:4;396:6;389:5;385:18;381:29;374:40;14:406;;;;;:::o;425:723::-;479:5;532:3;525:4;517:6;513:17;509:27;499:55;;550:1;547;540:12;499:55;586:6;573:20;612:4;635:18;631:2;628:26;625:52;;;657:18;;:::i;:::-;703:2;700:1;696:10;726:28;750:2;746;742:11;726:28;:::i;:::-;788:15;;;819:12;;;;851:15;;;885;;;881:24;;878:33;-1:-1:-1;875:53:1;;;924:1;921;914:12;875:53;946:1;937:10;;956:163;970:2;967:1;964:9;956:163;;;1027:17;;1015:30;;988:1;981:9;;;;;1065:12;;;;1097;;956:163;;;-1:-1:-1;1137:5:1;425:723;-1:-1:-1;;;;;;;425:723:1:o;1153:220::-;1195:5;1248:3;1241:4;1233:6;1229:17;1225:27;1215:55;;1266:1;1263;1256:12;1215:55;1288:79;1363:3;1354:6;1341:20;1334:4;1326:6;1322:17;1288:79;:::i;1378:247::-;1437:6;1490:2;1478:9;1469:7;1465:23;1461:32;1458:52;;;1506:1;1503;1496:12;1458:52;1545:9;1532:23;1564:31;1589:5;1564:31;:::i;1630:388::-;1698:6;1706;1759:2;1747:9;1738:7;1734:23;1730:32;1727:52;;;1775:1;1772;1765:12;1727:52;1814:9;1801:23;1833:31;1858:5;1833:31;:::i;:::-;1883:5;-1:-1:-1;1940:2:1;1925:18;;1912:32;1953:33;1912:32;1953:33;:::i;:::-;2005:7;1995:17;;;1630:388;;;;;:::o;2023:624::-;2125:6;2133;2141;2194:2;2182:9;2173:7;2169:23;2165:32;2162:52;;;2210:1;2207;2200:12;2162:52;2249:9;2236:23;2268:31;2293:5;2268:31;:::i;:::-;2318:5;-1:-1:-1;2375:2:1;2360:18;;2347:32;2388:33;2347:32;2388:33;:::i;:::-;2440:7;-1:-1:-1;2498:2:1;2483:18;;2470:32;2525:18;2514:30;;2511:50;;;2557:1;2554;2547:12;2511:50;2580:61;2633:7;2624:6;2613:9;2609:22;2580:61;:::i;:::-;2570:71;;;2023:624;;;;;:::o;2652:844::-;2772:6;2780;2788;2796;2849:3;2837:9;2828:7;2824:23;2820:33;2817:53;;;2866:1;2863;2856:12;2817:53;2905:9;2892:23;2924:31;2949:5;2924:31;:::i;:::-;2974:5;-1:-1:-1;3031:2:1;3016:18;;3003:32;3044:33;3003:32;3044:33;:::i;:::-;3096:7;-1:-1:-1;3154:2:1;3139:18;;3126:32;3177:18;3207:14;;;3204:34;;;3234:1;3231;3224:12;3204:34;3257:61;3310:7;3301:6;3290:9;3286:22;3257:61;:::i;:::-;3247:71;;3371:2;3360:9;3356:18;3343:32;3327:48;;3400:2;3390:8;3387:16;3384:36;;;3416:1;3413;3406:12;3384:36;;3439:51;3482:7;3471:8;3460:9;3456:24;3439:51;:::i;:::-;3429:61;;;2652:844;;;;;;;:::o;3501:456::-;3578:6;3586;3594;3647:2;3635:9;3626:7;3622:23;3618:32;3615:52;;;3663:1;3660;3653:12;3615:52;3702:9;3689:23;3721:31;3746:5;3721:31;:::i;:::-;3771:5;-1:-1:-1;3828:2:1;3813:18;;3800:32;3841:33;3800:32;3841:33;:::i;:::-;3501:456;;3893:7;;-1:-1:-1;;;3947:2:1;3932:18;;;;3919:32;;3501:456::o;3962:665::-;4057:6;4065;4073;4081;4134:3;4122:9;4113:7;4109:23;4105:33;4102:53;;;4151:1;4148;4141:12;4102:53;4190:9;4177:23;4209:31;4234:5;4209:31;:::i;:::-;4259:5;-1:-1:-1;4316:2:1;4301:18;;4288:32;4329:33;4288:32;4329:33;:::i;:::-;4381:7;-1:-1:-1;4435:2:1;4420:18;;4407:32;;-1:-1:-1;4490:2:1;4475:18;;4462:32;4517:18;4506:30;;4503:50;;;4549:1;4546;4539:12;4503:50;4572:49;4613:7;4604:6;4593:9;4589:22;4572:49;:::i;4632:750::-;4727:6;4735;4743;4796:2;4784:9;4775:7;4771:23;4767:32;4764:52;;;4812:1;4809;4802:12;4764:52;4851:9;4838:23;4870:31;4895:5;4870:31;:::i;:::-;4920:5;-1:-1:-1;4976:2:1;4961:18;;4948:32;4999:18;5029:14;;;5026:34;;;5056:1;5053;5046:12;5026:34;5094:6;5083:9;5079:22;5069:32;;5139:7;5132:4;5128:2;5124:13;5120:27;5110:55;;5161:1;5158;5151:12;5110:55;5201:2;5188:16;5227:2;5219:6;5216:14;5213:34;;;5243:1;5240;5233:12;5213:34;5296:7;5291:2;5281:6;5278:1;5274:14;5270:2;5266:23;5262:32;5259:45;5256:65;;;5317:1;5314;5307:12;5256:65;5348:2;5344;5340:11;5330:21;;5370:6;5360:16;;;;;4632:750;;;;;:::o;5387:416::-;5452:6;5460;5513:2;5501:9;5492:7;5488:23;5484:32;5481:52;;;5529:1;5526;5519:12;5481:52;5568:9;5555:23;5587:31;5612:5;5587:31;:::i;:::-;5637:5;-1:-1:-1;5694:2:1;5679:18;;5666:32;5736:15;;5729:23;5717:36;;5707:64;;5767:1;5764;5757:12;5808:315;5876:6;5884;5937:2;5925:9;5916:7;5912:23;5908:32;5905:52;;;5953:1;5950;5943:12;5905:52;5992:9;5979:23;6011:31;6036:5;6011:31;:::i;:::-;6061:5;6113:2;6098:18;;;;6085:32;;-1:-1:-1;;;5808:315:1:o;6128:245::-;6186:6;6239:2;6227:9;6218:7;6214:23;6210:32;6207:52;;;6255:1;6252;6245:12;6207:52;6294:9;6281:23;6313:30;6337:5;6313:30;:::i;6378:249::-;6447:6;6500:2;6488:9;6479:7;6475:23;6471:32;6468:52;;;6516:1;6513;6506:12;6468:52;6548:9;6542:16;6567:30;6591:5;6567:30;:::i;6632:280::-;6731:6;6784:2;6772:9;6763:7;6759:23;6755:32;6752:52;;;6800:1;6797;6790:12;6752:52;6832:9;6826:16;6851:31;6876:5;6851:31;:::i;6917:450::-;6986:6;7039:2;7027:9;7018:7;7014:23;7010:32;7007:52;;;7055:1;7052;7045:12;7007:52;7095:9;7082:23;7128:18;7120:6;7117:30;7114:50;;;7160:1;7157;7150:12;7114:50;7183:22;;7236:4;7228:13;;7224:27;-1:-1:-1;7214:55:1;;7265:1;7262;7255:12;7214:55;7288:73;7353:7;7348:2;7335:16;7330:2;7326;7322:11;7288:73;:::i;7372:180::-;7431:6;7484:2;7472:9;7463:7;7459:23;7455:32;7452:52;;;7500:1;7497;7490:12;7452:52;-1:-1:-1;7523:23:1;;7372:180;-1:-1:-1;7372:180:1:o;7557:257::-;7598:3;7636:5;7630:12;7663:6;7658:3;7651:19;7679:63;7735:6;7728:4;7723:3;7719:14;7712:4;7705:5;7701:16;7679:63;:::i;:::-;7796:2;7775:15;-1:-1:-1;;7771:29:1;7762:39;;;;7803:4;7758:50;;7557:257;-1:-1:-1;;7557:257:1:o;7819:185::-;7861:3;7899:5;7893:12;7914:52;7959:6;7954:3;7947:4;7940:5;7936:16;7914:52;:::i;:::-;7982:16;;;;;7819:185;-1:-1:-1;;7819:185:1:o;8009:1231::-;8185:3;8214:1;8247:6;8241:13;8277:3;8299:1;8327:9;8323:2;8319:18;8309:28;;8387:2;8376:9;8372:18;8409;8399:61;;8453:4;8445:6;8441:17;8431:27;;8399:61;8479:2;8527;8519:6;8516:14;8496:18;8493:38;8490:222;;;-1:-1:-1;;;8561:3:1;8554:90;8667:4;8664:1;8657:15;8697:4;8692:3;8685:17;8490:222;8728:18;8755:104;;;;8873:1;8868:320;;;;8721:467;;8755:104;-1:-1:-1;;8788:24:1;;8776:37;;8833:16;;;;-1:-1:-1;8755:104:1;;8868:320;20683:1;20676:14;;;20720:4;20707:18;;8963:1;8977:165;8991:6;8988:1;8985:13;8977:165;;;9069:14;;9056:11;;;9049:35;9112:16;;;;9006:10;;8977:165;;;8981:3;;9171:6;9166:3;9162:16;9155:23;;8721:467;;;;;;;9204:30;9230:3;9222:6;9204:30;:::i;:::-;9197:37;8009:1231;-1:-1:-1;;;;;8009:1231:1:o;9686:511::-;9880:4;-1:-1:-1;;;;;9990:2:1;9982:6;9978:15;9967:9;9960:34;10042:2;10034:6;10030:15;10025:2;10014:9;10010:18;10003:43;;10082:6;10077:2;10066:9;10062:18;10055:34;10125:3;10120:2;10109:9;10105:18;10098:31;10146:45;10186:3;10175:9;10171:19;10163:6;10146:45;:::i;:::-;10138:53;9686:511;-1:-1:-1;;;;;;9686:511:1:o;10202:632::-;10373:2;10425:21;;;10495:13;;10398:18;;;10517:22;;;10344:4;;10373:2;10596:15;;;;10570:2;10555:18;;;10344:4;10639:169;10653:6;10650:1;10647:13;10639:169;;;10714:13;;10702:26;;10783:15;;;;10748:12;;;;10675:1;10668:9;10639:169;;;-1:-1:-1;10825:3:1;;10202:632;-1:-1:-1;;;;;;10202:632:1:o;11031:219::-;11180:2;11169:9;11162:21;11143:4;11200:44;11240:2;11229:9;11225:18;11217:6;11200:44;:::i;20330:275::-;20401:2;20395:9;20466:2;20447:13;;-1:-1:-1;;20443:27:1;20431:40;;20501:18;20486:34;;20522:22;;;20483:62;20480:88;;;20548:18;;:::i;:::-;20584:2;20577:22;20330:275;;-1:-1:-1;20330:275:1:o;20736:128::-;20776:3;20807:1;20803:6;20800:1;20797:13;20794:39;;;20813:18;;:::i;:::-;-1:-1:-1;20849:9:1;;20736:128::o;20869:120::-;20909:1;20935;20925:35;;20940:18;;:::i;:::-;-1:-1:-1;20974:9:1;;20869:120::o;20994:168::-;21034:7;21100:1;21096;21092:6;21088:14;21085:1;21082:21;21077:1;21070:9;21063:17;21059:45;21056:71;;;21107:18;;:::i;:::-;-1:-1:-1;21147:9:1;;20994:168::o;21167:125::-;21207:4;21235:1;21232;21229:8;21226:34;;;21240:18;;:::i;:::-;-1:-1:-1;21277:9:1;;21167:125::o;21297:258::-;21369:1;21379:113;21393:6;21390:1;21387:13;21379:113;;;21469:11;;;21463:18;21450:11;;;21443:39;21415:2;21408:10;21379:113;;;21510:6;21507:1;21504:13;21501:48;;;-1:-1:-1;;21545:1:1;21527:16;;21520:27;21297:258::o;21560:437::-;21639:1;21635:12;;;;21682;;;21703:61;;21757:4;21749:6;21745:17;21735:27;;21703:61;21810:2;21802:6;21799:14;21779:18;21776:38;21773:218;;;-1:-1:-1;;;21844:1:1;21837:88;21948:4;21945:1;21938:15;21976:4;21973:1;21966:15;21773:218;;21560:437;;;:::o;22002:135::-;22041:3;-1:-1:-1;;22062:17:1;;22059:43;;;22082:18;;:::i;:::-;-1:-1:-1;22129:1:1;22118:13;;22002:135::o;22142:112::-;22174:1;22200;22190:35;;22205:18;;:::i;:::-;-1:-1:-1;22239:9:1;;22142:112::o;22259:184::-;-1:-1:-1;;;22308:1:1;22301:88;22408:4;22405:1;22398:15;22432:4;22429:1;22422:15;22448:184;-1:-1:-1;;;22497:1:1;22490:88;22597:4;22594:1;22587:15;22621:4;22618:1;22611:15;22637:184;-1:-1:-1;;;22686:1:1;22679:88;22786:4;22783:1;22776:15;22810:4;22807:1;22800:15;22826:184;-1:-1:-1;;;22875:1:1;22868:88;22975:4;22972:1;22965:15;22999:4;22996:1;22989:15;23015:154;-1:-1:-1;;;;;23094:5:1;23090:54;23083:5;23080:65;23070:93;;23159:1;23156;23149:12;23174:177;-1:-1:-1;;;;;;23252:5:1;23248:78;23241:5;23238:89;23228:117;;23341:1;23338;23331:12

Swarm Source

ipfs://29cb417026dae22566b358a11a8d7f71c7a5d9866811de1d0b59d22cbc8ee1b4
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.