ETH Price: $3,329.82 (-9.21%)

Token

Trumpy Dumpy (Trumpy)
 

Overview

Max Total Supply

1,994 Trumpy

Holders

429

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
5 Trumpy
0x6e5dd24e20248e3eca6130d95a6bd779f0b5d0c9
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:
TrumpyDumpy

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-02-26
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.7;

library Address {
    function isContract(address account) internal view returns (bool) {
        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 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);
    }
}

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

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

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

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

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

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

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

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 (uint256)
    {
        require(
            owner != address(0),
            "ERC721: balance query for the zero address"
        );

        uint256 count;
        for (uint256 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 {}
}

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

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

        revert("ERC721Enumerable: owner index out of bounds");
    }
}

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

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merklee tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf)
        internal
        pure
        returns (bytes32)
    {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = keccak256(
                    abi.encodePacked(computedHash, proofElement)
                );
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = keccak256(
                    abi.encodePacked(proofElement, computedHash)
                );
            }
        }
        return computedHash;
    }
}

contract TrumpyDumpy is ERC721Enumerable, Ownable {
    string public baseURI;

    uint256 public constant MAX_SUPPLY = 10000;
    
    uint256 public maxMintPerWallet = 5;
    uint256 public currentPrice = 0 ether;
    bool public isPreSale = false;
    bool public isPublicSale = false;
    bool public isRevealed = false;

    bytes32 public whitelistMerkleRoot;
    
    mapping(address => uint256) public whitelistAddressToMinted;
    mapping(address => uint256) public addressToMinted;


    constructor(string memory _baseURI) ERC721("Trumpy Dumpy", "Trumpy") {
        baseURI = _baseURI;
    }

    function setReveal(bool reveal, string memory _baseURI) public onlyOwner {
        isRevealed = reveal;
        baseURI = _baseURI;
    }

    function setSale(bool preSale, bool publicSale) public onlyOwner {
        isPreSale = preSale;
        isPublicSale = publicSale;
    }
    function setCurrentPrice(uint256 _currentPrice) public onlyOwner {
        currentPrice = _currentPrice;
    }
    function setMaxPerWallet(uint256 _maxMintPerWallet) public onlyOwner {
        maxMintPerWallet = _maxMintPerWallet;
    }

    function setWhitelistMerkleRoot(bytes32 _whitelistMerkleRoot)
        external
        onlyOwner
    {
        whitelistMerkleRoot = _whitelistMerkleRoot;
    }

    function getAllowance(string memory allowance, bytes32[] calldata proof)
        public
        view
        returns (uint256)
    {
        string memory payload = string(abi.encodePacked(_msgSender()));
        require(
            _verify(_leaf(allowance, payload), proof),
            "Invalid Merkle Tree proof supplied."
        );
        return whitelistAddressToMinted[_msgSender()];
    }
    

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


    function giveAway(address[] calldata _users) external onlyOwner {
        uint256 totalSupply = _owners.length;
        require(totalSupply + _users.length <= MAX_SUPPLY, "Excedes max supply.");
        for (uint256 i; i < _users.length; i++) _mint(_users[i], totalSupply + i);
    }


    function publicMint(uint256 count) public payable {
        uint256 totalSupply = _owners.length;
        require(isPublicSale, "Public sale not started");
        require(totalSupply + count <= MAX_SUPPLY, "Excedes max supply.");
        require(count <= maxMintPerWallet - addressToMinted[_msgSender()], "Exceeds max per wallet.");
        require(count * currentPrice == msg.value, "Invalid funds provided.");
        
        addressToMinted[_msgSender()] += count;

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

    function whitelistMint(
        uint256 count,
        uint256 allowance,
        bytes32[] calldata proof
    ) public payable {
        uint256 totalSupply = _owners.length;
        require(isPreSale, "pre sale not started");
        require(totalSupply + count <= MAX_SUPPLY, "Excedes max supply.");
        string memory payload = string(abi.encodePacked(_msgSender()));
        require(_verify(_leaf(Strings.toString(allowance), payload), proof),"Invalid Merkle Tree proof supplied.");
        require(whitelistAddressToMinted[_msgSender()] + count <= allowance, "Exceeds whitelist supply");
        require(count * currentPrice == msg.value, "Invalid funds provided.");

        whitelistAddressToMinted[_msgSender()] += count;
        
        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, ) = payable(owner()).call{value: address(this).balance}(
            ""
        );
        require(success, "Failed to send.");
    }

    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 _mint(address to, uint256 tokenId) internal virtual override {
        _owners.push(to);
        emit Transfer(address(0), to, tokenId);
    }

    function _leaf(string memory allowance, string memory payload)
        internal
        pure
        returns (bytes32)
    {
        return keccak256(abi.encodePacked(payload, allowance));
    }

    function _verify(bytes32 leaf, bytes32[] memory proof)
        internal
        view
        returns (bool)
    {
        return MerkleProof.verify(proof, whitelistMerkleRoot, leaf);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_baseURI","type":"string"}],"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_SUPPLY","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":"currentPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"allowance","type":"string"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"getAllowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"_users","type":"address[]"}],"name":"giveAway","outputs":[],"stateMutability":"nonpayable","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":[],"name":"isPreSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPublicSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isRevealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","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":"uint256","name":"_currentPrice","type":"uint256"}],"name":"setCurrentPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintPerWallet","type":"uint256"}],"name":"setMaxPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"reveal","type":"bool"},{"internalType":"string","name":"_baseURI","type":"string"}],"name":"setReveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"preSale","type":"bool"},{"internalType":"bool","name":"publicSale","type":"bool"}],"name":"setSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_whitelistMerkleRoot","type":"bytes32"}],"name":"setWhitelistMerkleRoot","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":[{"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":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistAddressToMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052600560075560006008556009805462ffffff191690553480156200002757600080fd5b5060405162002f9f38038062002f9f8339810160408190526200004a91620001e8565b604080518082018252600c81526b5472756d70792044756d707960a01b6020808301918252835180850190945260068452655472756d707960d01b9084015281519192916200009c9160009162000142565b508051620000b290600190602084019062000142565b505050620000cf620000c9620000ec60201b60201c565b620000f0565b8051620000e490600690602084019062000142565b505062000317565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200015090620002c4565b90600052602060002090601f016020900481019282620001745760008555620001bf565b82601f106200018f57805160ff1916838001178555620001bf565b82800160010185558215620001bf579182015b82811115620001bf578251825591602001919060010190620001a2565b50620001cd929150620001d1565b5090565b5b80821115620001cd5760008155600101620001d2565b60006020808385031215620001fc57600080fd5b82516001600160401b03808211156200021457600080fd5b818501915085601f8301126200022957600080fd5b8151818111156200023e576200023e62000301565b604051601f8201601f19908116603f0116810190838211818310171562000269576200026962000301565b8160405282815288868487010111156200028257600080fd5b600093505b82841015620002a6578484018601518185018701529285019262000287565b82841115620002b85760008684830101525b98975050505050505050565b600181811c90821680620002d957607f821691505b60208210811415620002fb57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b612c7880620003276000396000f3fe6080604052600436106102675760003560e01c80636c0360eb11610144578063b88d4fde116100b6578063dd504bb71161007a578063dd504bb71461070c578063e268e4d31461072c578063e985e9c51461074c578063ee82e5a014610795578063f2fde38b146107b5578063f3993d11146107d557600080fd5b8063b88d4fde14610679578063bd32fb6614610699578063c0d4c307146106b9578063c4be5b59146106d9578063c87b56dd146106ec57600080fd5b80639d1b464a116101085780639d1b464a146105cb5780639ec00c95146105e1578063a22cb4651461060e578063a5a865dc1461062e578063aa98e0c61461064d578063b228d9251461066357600080fd5b80636c0360eb1461054e57806370a0823114610563578063715018a6146105835780638da5cb5b1461059857806395d89b41146105b657600080fd5b806342842e0e116101dd5780634f6ccce7116101a15780634f6ccce71461048157806354214f69146104a15780635a4fee30146104c15780636352211e146104e15780636364fa671461050157806366fddfa91461052e57600080fd5b806342842e0e146103da57806342966c68146103fa578063438b63001461041a5780634ced4734146104475780634d44660c1461046157600080fd5b806318b200711161022f57806318b200711461033c57806323b872dd1461035c5780632db115441461037c5780632f745c591461038f57806332cb6b0c146103af5780633ccfd60b146103c557600080fd5b806301ffc9a71461026c57806306fdde03146102a1578063081812fc146102c3578063095ea7b3146102fb57806318160ddd1461031d575b600080fd5b34801561027857600080fd5b5061028c61028736600461266c565b6107f5565b60405190151581526020015b60405180910390f35b3480156102ad57600080fd5b506102b6610820565b6040516102989190612906565b3480156102cf57600080fd5b506102e36102de366004612653565b6108b2565b6040516001600160a01b039091168152602001610298565b34801561030757600080fd5b5061031b61031636600461257f565b61093f565b005b34801561032957600080fd5b506002545b604051908152602001610298565b34801561034857600080fd5b5061031b610357366004612653565b610a55565b34801561036857600080fd5b5061031b61037736600461246c565b610a84565b61031b61038a366004612653565b610ab6565b34801561039b57600080fd5b5061032e6103aa36600461257f565b610c53565b3480156103bb57600080fd5b5061032e61271081565b3480156103d157600080fd5b5061031b610d06565b3480156103e657600080fd5b5061031b6103f536600461246c565b610daf565b34801561040657600080fd5b5061031b610415366004612653565b610dca565b34801561042657600080fd5b5061043a61043536600461233d565b610e20565b60405161029891906128c2565b34801561045357600080fd5b5060095461028c9060ff1681565b34801561046d57600080fd5b5061028c61047c366004612503565b610ed8565b34801561048d57600080fd5b5061032e61049c366004612653565b610f5a565b3480156104ad57600080fd5b5060095461028c9062010000900460ff1681565b3480156104cd57600080fd5b5061031b6104dc3660046123e8565b610fc7565b3480156104ed57600080fd5b506102e36104fc366004612653565b611011565b34801561050d57600080fd5b5061032e61051c36600461233d565b600b6020526000908152604090205481565b34801561053a57600080fd5b5061032e6105493660046126a6565b61109d565b34801561055a57600080fd5b506102b6611149565b34801561056f57600080fd5b5061032e61057e36600461233d565b6111d7565b34801561058f57600080fd5b5061031b6112a5565b3480156105a457600080fd5b506005546001600160a01b03166102e3565b3480156105c257600080fd5b506102b66112db565b3480156105d757600080fd5b5061032e60085481565b3480156105ed57600080fd5b5061032e6105fc36600461233d565b600c6020526000908152604090205481565b34801561061a57600080fd5b5061031b610629366004612555565b6112ea565b34801561063a57600080fd5b5060095461028c90610100900460ff1681565b34801561065957600080fd5b5061032e600a5481565b34801561066f57600080fd5b5061032e60075481565b34801561068557600080fd5b5061031b6106943660046124a8565b6113af565b3480156106a557600080fd5b5061031b6106b4366004612653565b6113e7565b3480156106c557600080fd5b5061031b6106d43660046125a9565b611416565b61031b6106e7366004612701565b6114b5565b3480156106f857600080fd5b506102b6610707366004612653565b6116a5565b34801561071857600080fd5b5061031b610727366004612606565b6117c8565b34801561073857600080fd5b5061031b610747366004612653565b61181a565b34801561075857600080fd5b5061028c610767366004612358565b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205460ff1690565b3480156107a157600080fd5b5061031b6107b03660046125ea565b611849565b3480156107c157600080fd5b5061031b6107d036600461233d565b611897565b3480156107e157600080fd5b5061031b6107f036600461238b565b61192f565b60006001600160e01b0319821663780e9d6360e01b148061081a575061081a82611971565b92915050565b60606000805461082f90612b6a565b80601f016020809104026020016040519081016040528092919081815260200182805461085b90612b6a565b80156108a85780601f1061087d576101008083540402835291602001916108a8565b820191906000526020600020905b81548152906001019060200180831161088b57829003601f168201915b5050505050905090565b60006108bd826119c1565b6109235760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600360205260409020546001600160a01b031690565b600061094a82611011565b9050806001600160a01b0316836001600160a01b031614156109b85760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161091a565b336001600160a01b03821614806109d457506109d48133610767565b610a465760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161091a565b610a508383611a0b565b505050565b6005546001600160a01b03163314610a7f5760405162461bcd60e51b815260040161091a90612a26565b600855565b610a8f335b82611a79565b610aab5760405162461bcd60e51b815260040161091a90612a5b565b610a50838383611b63565b600254600954610100900460ff16610b105760405162461bcd60e51b815260206004820152601760248201527f5075626c69632073616c65206e6f742073746172746564000000000000000000604482015260640161091a565b612710610b1d8383612adc565b1115610b3b5760405162461bcd60e51b815260040161091a9061295c565b336000908152600c6020526040902054600754610b589190612b27565b821115610ba75760405162461bcd60e51b815260206004820152601760248201527f45786365656473206d6178207065722077616c6c65742e000000000000000000604482015260640161091a565b3460085483610bb69190612b08565b14610bfd5760405162461bcd60e51b815260206004820152601760248201527624b73b30b634b210333ab7323990383937bb34b232b21760491b604482015260640161091a565b336000908152600c602052604081208054849290610c1c908490612adc565b90915550600090505b82811015610a5057610c41335b610c3c8385612adc565b611cb9565b80610c4b81612ba5565b915050610c25565b6000610c5e836111d7565b8210610c7c5760405162461bcd60e51b815260040161091a90612989565b6000805b600254811015610ced5760028181548110610c9d57610c9d612c00565b6000918252602090912001546001600160a01b0386811691161415610cdb5783821415610ccd57915061081a9050565b81610cd781612ba5565b9250505b80610ce581612ba5565b915050610c80565b5060405162461bcd60e51b815260040161091a90612989565b6000610d1a6005546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d8060008114610d64576040519150601f19603f3d011682016040523d82523d6000602084013e610d69565b606091505b5050905080610dac5760405162461bcd60e51b815260206004820152600f60248201526e2330b4b632b2103a379039b2b7321760891b604482015260640161091a565b50565b610a50838383604051806020016040528060008152506113af565b610dd333610a89565b610e175760405162461bcd60e51b81526020600482015260156024820152742737ba1030b8383937bb32b2103a3790313ab9371760591b604482015260640161091a565b610dac81611d35565b60606000610e2d836111d7565b905080610e4e5760408051600080825260208201909252905b509392505050565b6000816001600160401b03811115610e6857610e68612c16565b604051908082528060200260200182016040528015610e91578160200160208202803683370190505b50905060005b82811015610e4657610ea98582610c53565b828281518110610ebb57610ebb612c00565b602090810291909101015280610ed081612ba5565b915050610e97565b6000805b82811015610f4d57846001600160a01b03166002858584818110610f0257610f02612c00565b9050602002013581548110610f1957610f19612c00565b6000918252602090912001546001600160a01b031614610f3d576000915050610f53565b610f4681612ba5565b9050610edc565b50600190505b9392505050565b6002546000908210610fc35760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b606482015260840161091a565b5090565b60005b825181101561100a57610ff88585858481518110610fea57610fea612c00565b6020026020010151856113af565b8061100281612ba5565b915050610fca565b5050505050565b6000806002838154811061102757611027612c00565b6000918252602090912001546001600160a01b031690508061081a5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161091a565b604080513360601b6bffffffffffffffffffffffff191660208201528151601481830301815260349091019091526000906111146110db8683611db7565b858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250611dea92505050565b6111305760405162461bcd60e51b815260040161091a90612919565b5050336000908152600b60205260409020549392505050565b6006805461115690612b6a565b80601f016020809104026020016040519081016040528092919081815260200182805461118290612b6a565b80156111cf5780601f106111a4576101008083540402835291602001916111cf565b820191906000526020600020905b8154815290600101906020018083116111b257829003601f168201915b505050505081565b60006001600160a01b0382166112425760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161091a565b6000805b60025481101561129e576002818154811061126357611263612c00565b6000918252602090912001546001600160a01b038581169116141561128e5761128b82612ba5565b91505b61129781612ba5565b9050611246565b5092915050565b6005546001600160a01b031633146112cf5760405162461bcd60e51b815260040161091a90612a26565b6112d96000611df9565b565b60606001805461082f90612b6a565b6001600160a01b0382163314156113435760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161091a565b3360008181526004602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6113b93383611a79565b6113d55760405162461bcd60e51b815260040161091a90612a5b565b6113e184848484611e4b565b50505050565b6005546001600160a01b031633146114115760405162461bcd60e51b815260040161091a90612a26565b600a55565b6005546001600160a01b031633146114405760405162461bcd60e51b815260040161091a90612a26565b6002546127106114508383612adc565b111561146e5760405162461bcd60e51b815260040161091a9061295c565b60005b828110156113e1576114a384848381811061148e5761148e612c00565b9050602002016020810190610c32919061233d565b806114ad81612ba5565b915050611471565b60025460095460ff166115015760405162461bcd60e51b81526020600482015260146024820152731c1c99481cd85b19481b9bdd081cdd185c9d195960621b604482015260640161091a565b61271061150e8683612adc565b111561152c5760405162461bcd60e51b815260040161091a9061295c565b604080513360601b6bffffffffffffffffffffffff1916602082015281516014818303018152603490910190915261156f6110db61156987611e7e565b83611db7565b61158b5760405162461bcd60e51b815260040161091a90612919565b336000908152600b602052604090205485906115a8908890612adc565b11156115f65760405162461bcd60e51b815260206004820152601860248201527f457863656564732077686974656c69737420737570706c790000000000000000604482015260640161091a565b34600854876116059190612b08565b1461164c5760405162461bcd60e51b815260206004820152601760248201527624b73b30b634b210333ab7323990383937bb34b232b21760491b604482015260640161091a565b336000908152600b60205260408120805488929061166b908490612adc565b90915550600090505b8681101561169c5761168a33610c3c8386612adc565b8061169481612ba5565b915050611674565b50505050505050565b60606116b0826119c1565b6116f45760405162461bcd60e51b81526020600482015260156024820152742a37b5b2b7103237b2b9903737ba1032bc34b9ba1760591b604482015260640161091a565b60095462010000900460ff16611796576006805461171190612b6a565b80601f016020809104026020016040519081016040528092919081815260200182805461173d90612b6a565b801561178a5780601f1061175f5761010080835404028352916020019161178a565b820191906000526020600020905b81548152906001019060200180831161176d57829003601f168201915b50505050509050919050565b60066117a183611e7e565b6040516020016117b29291906127ca565b6040516020818303038152906040529050919050565b6005546001600160a01b031633146117f25760405162461bcd60e51b815260040161091a90612a26565b6009805462ff0000191662010000841515021790558051610a50906006906020840190612142565b6005546001600160a01b031633146118445760405162461bcd60e51b815260040161091a90612a26565b600755565b6005546001600160a01b031633146118735760405162461bcd60e51b815260040161091a90612a26565b6009805461ffff191692151561ff0019169290921761010091151591909102179055565b6005546001600160a01b031633146118c15760405162461bcd60e51b815260040161091a90612a26565b6001600160a01b0381166119265760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161091a565b610dac81611df9565b60005b81518110156113e15761195f848484848151811061195257611952612c00565b6020026020010151610a84565b8061196981612ba5565b915050611932565b60006001600160e01b031982166380ac58cd60e01b14806119a257506001600160e01b03198216635b5e139f60e01b145b8061081a57506301ffc9a760e01b6001600160e01b031983161461081a565b6002546000908210801561081a575060006001600160a01b0316600283815481106119ee576119ee612c00565b6000918252602090912001546001600160a01b0316141592915050565b600081815260036020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611a4082611011565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611a84826119c1565b611ae55760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161091a565b6000611af083611011565b9050806001600160a01b0316846001600160a01b03161480611b2b5750836001600160a01b0316611b20846108b2565b6001600160a01b0316145b80611b5b57506001600160a01b0380821660009081526004602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611b7682611011565b6001600160a01b031614611bde5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b606482015260840161091a565b6001600160a01b038216611c405760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161091a565b611c4b600082611a0b565b8160028281548110611c5f57611c5f612c00565b6000918252602082200180546001600160a01b0319166001600160a01b03938416179055604051839285811692908716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9190a4505050565b6002805460018101825560009182527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0180546001600160a01b0319166001600160a01b0385169081179091556040518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000611d4082611011565b9050611d4d600083611a0b565b600060028381548110611d6257611d62612c00565b6000918252602082200180546001600160a01b0319166001600160a01b0393841617905560405184928416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b60008183604051602001611dcc92919061279b565b60405160208183030381529060405280519060200120905092915050565b6000610f5382600a5485611f7b565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b611e56848484611b63565b611e6284848484611f91565b6113e15760405162461bcd60e51b815260040161091a906129d4565b606081611ea25750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611ecc5780611eb681612ba5565b9150611ec59050600a83612af4565b9150611ea6565b6000816001600160401b03811115611ee657611ee6612c16565b6040519080825280601f01601f191660200182016040528015611f10576020820181803683370190505b5090505b8415611b5b57611f25600183612b27565b9150611f32600a86612bc0565b611f3d906030612adc565b60f81b818381518110611f5257611f52612c00565b60200101906001600160f81b031916908160001a905350611f74600a86612af4565b9450611f14565b600082611f88858461209e565b14949350505050565b60006001600160a01b0384163b1561209357604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611fd5903390899088908890600401612885565b602060405180830381600087803b158015611fef57600080fd5b505af192505050801561201f575060408051601f3d908101601f1916820190925261201c91810190612689565b60015b612079573d80801561204d576040519150601f19603f3d011682016040523d82523d6000602084013e612052565b606091505b5080516120715760405162461bcd60e51b815260040161091a906129d4565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611b5b565b506001949350505050565b600081815b8451811015610e465760008582815181106120c0576120c0612c00565b6020026020010151905080831161210257604080516020810185905290810182905260600160405160208183030381529060405280519060200120925061212f565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b508061213a81612ba5565b9150506120a3565b82805461214e90612b6a565b90600052602060002090601f01602090048101928261217057600085556121b6565b82601f1061218957805160ff19168380011785556121b6565b828001600101855582156121b6579182015b828111156121b657825182559160200191906001019061219b565b50610fc39291505b80821115610fc357600081556001016121be565b80356001600160a01b03811681146121e957600080fd5b919050565b60008083601f84011261220057600080fd5b5081356001600160401b0381111561221757600080fd5b6020830191508360208260051b850101111561223257600080fd5b9250929050565b600082601f83011261224a57600080fd5b813560206001600160401b0382111561226557612265612c16565b8160051b612274828201612aac565b83815282810190868401838801850189101561228f57600080fd5b600093505b858410156122b2578035835260019390930192918401918401612294565b50979650505050505050565b803580151581146121e957600080fd5b600082601f8301126122df57600080fd5b81356001600160401b038111156122f8576122f8612c16565b61230b601f8201601f1916602001612aac565b81815284602083860101111561232057600080fd5b816020850160208301376000918101602001919091529392505050565b60006020828403121561234f57600080fd5b610f53826121d2565b6000806040838503121561236b57600080fd5b612374836121d2565b9150612382602084016121d2565b90509250929050565b6000806000606084860312156123a057600080fd5b6123a9846121d2565b92506123b7602085016121d2565b915060408401356001600160401b038111156123d257600080fd5b6123de86828701612239565b9150509250925092565b600080600080608085870312156123fe57600080fd5b612407856121d2565b9350612415602086016121d2565b925060408501356001600160401b038082111561243157600080fd5b61243d88838901612239565b9350606087013591508082111561245357600080fd5b50612460878288016122ce565b91505092959194509250565b60008060006060848603121561248157600080fd5b61248a846121d2565b9250612498602085016121d2565b9150604084013590509250925092565b600080600080608085870312156124be57600080fd5b6124c7856121d2565b93506124d5602086016121d2565b92506040850135915060608501356001600160401b038111156124f757600080fd5b612460878288016122ce565b60008060006040848603121561251857600080fd5b612521846121d2565b925060208401356001600160401b0381111561253c57600080fd5b612548868287016121ee565b9497909650939450505050565b6000806040838503121561256857600080fd5b612571836121d2565b9150612382602084016122be565b6000806040838503121561259257600080fd5b61259b836121d2565b946020939093013593505050565b600080602083850312156125bc57600080fd5b82356001600160401b038111156125d257600080fd5b6125de858286016121ee565b90969095509350505050565b600080604083850312156125fd57600080fd5b612571836122be565b6000806040838503121561261957600080fd5b612622836122be565b915060208301356001600160401b0381111561263d57600080fd5b612649858286016122ce565b9150509250929050565b60006020828403121561266557600080fd5b5035919050565b60006020828403121561267e57600080fd5b8135610f5381612c2c565b60006020828403121561269b57600080fd5b8151610f5381612c2c565b6000806000604084860312156126bb57600080fd5b83356001600160401b03808211156126d257600080fd5b6126de878388016122ce565b945060208601359150808211156126f457600080fd5b50612548868287016121ee565b6000806000806060858703121561271757600080fd5b843593506020850135925060408501356001600160401b0381111561273b57600080fd5b612747878288016121ee565b95989497509550505050565b6000815180845261276b816020860160208601612b3e565b601f01601f19169290920160200192915050565b60008151612791818560208601612b3e565b9290920192915050565b600083516127ad818460208801612b3e565b8351908301906127c1818360208801612b3e565b01949350505050565b600080845481600182811c9150808316806127e657607f831692505b602080841082141561280657634e487b7160e01b86526022600452602486fd5b81801561281a576001811461282b57612858565b60ff19861689528489019650612858565b60008b81526020902060005b868110156128505781548b820152908501908301612837565b505084890196505b50505050505061287c61286b828661277f565b64173539b7b760d91b815260050190565b95945050505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906128b890830184612753565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156128fa578351835292840192918401916001016128de565b50909695505050505050565b602081526000610f536020830184612753565b60208082526023908201527f496e76616c6964204d65726b6c6520547265652070726f6f6620737570706c6960408201526232b21760e91b606082015260800190565b60208082526013908201527222bc31b2b232b99036b0bc1039bab838363c9760691b604082015260600190565b6020808252602b908201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560408201526a74206f6620626f756e647360a81b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b604051601f8201601f191681016001600160401b0381118282101715612ad457612ad4612c16565b604052919050565b60008219821115612aef57612aef612bd4565b500190565b600082612b0357612b03612bea565b500490565b6000816000190483118215151615612b2257612b22612bd4565b500290565b600082821015612b3957612b39612bd4565b500390565b60005b83811015612b59578181015183820152602001612b41565b838111156113e15750506000910152565b600181811c90821680612b7e57607f821691505b60208210811415612b9f57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612bb957612bb9612bd4565b5060010190565b600082612bcf57612bcf612bea565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610dac57600080fdfea26469706673582212204b171a62352e6e0dd4414a3a346b39aa7ed90afd30eb34ccff33145d93464ee264736f6c6343000807003300000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000037697066733a2f2f2f516d5a38374e65704c50596a7770323936715369734459506d696577556179366e717668744556694142365464722f000000000000000000

Deployed Bytecode

0x6080604052600436106102675760003560e01c80636c0360eb11610144578063b88d4fde116100b6578063dd504bb71161007a578063dd504bb71461070c578063e268e4d31461072c578063e985e9c51461074c578063ee82e5a014610795578063f2fde38b146107b5578063f3993d11146107d557600080fd5b8063b88d4fde14610679578063bd32fb6614610699578063c0d4c307146106b9578063c4be5b59146106d9578063c87b56dd146106ec57600080fd5b80639d1b464a116101085780639d1b464a146105cb5780639ec00c95146105e1578063a22cb4651461060e578063a5a865dc1461062e578063aa98e0c61461064d578063b228d9251461066357600080fd5b80636c0360eb1461054e57806370a0823114610563578063715018a6146105835780638da5cb5b1461059857806395d89b41146105b657600080fd5b806342842e0e116101dd5780634f6ccce7116101a15780634f6ccce71461048157806354214f69146104a15780635a4fee30146104c15780636352211e146104e15780636364fa671461050157806366fddfa91461052e57600080fd5b806342842e0e146103da57806342966c68146103fa578063438b63001461041a5780634ced4734146104475780634d44660c1461046157600080fd5b806318b200711161022f57806318b200711461033c57806323b872dd1461035c5780632db115441461037c5780632f745c591461038f57806332cb6b0c146103af5780633ccfd60b146103c557600080fd5b806301ffc9a71461026c57806306fdde03146102a1578063081812fc146102c3578063095ea7b3146102fb57806318160ddd1461031d575b600080fd5b34801561027857600080fd5b5061028c61028736600461266c565b6107f5565b60405190151581526020015b60405180910390f35b3480156102ad57600080fd5b506102b6610820565b6040516102989190612906565b3480156102cf57600080fd5b506102e36102de366004612653565b6108b2565b6040516001600160a01b039091168152602001610298565b34801561030757600080fd5b5061031b61031636600461257f565b61093f565b005b34801561032957600080fd5b506002545b604051908152602001610298565b34801561034857600080fd5b5061031b610357366004612653565b610a55565b34801561036857600080fd5b5061031b61037736600461246c565b610a84565b61031b61038a366004612653565b610ab6565b34801561039b57600080fd5b5061032e6103aa36600461257f565b610c53565b3480156103bb57600080fd5b5061032e61271081565b3480156103d157600080fd5b5061031b610d06565b3480156103e657600080fd5b5061031b6103f536600461246c565b610daf565b34801561040657600080fd5b5061031b610415366004612653565b610dca565b34801561042657600080fd5b5061043a61043536600461233d565b610e20565b60405161029891906128c2565b34801561045357600080fd5b5060095461028c9060ff1681565b34801561046d57600080fd5b5061028c61047c366004612503565b610ed8565b34801561048d57600080fd5b5061032e61049c366004612653565b610f5a565b3480156104ad57600080fd5b5060095461028c9062010000900460ff1681565b3480156104cd57600080fd5b5061031b6104dc3660046123e8565b610fc7565b3480156104ed57600080fd5b506102e36104fc366004612653565b611011565b34801561050d57600080fd5b5061032e61051c36600461233d565b600b6020526000908152604090205481565b34801561053a57600080fd5b5061032e6105493660046126a6565b61109d565b34801561055a57600080fd5b506102b6611149565b34801561056f57600080fd5b5061032e61057e36600461233d565b6111d7565b34801561058f57600080fd5b5061031b6112a5565b3480156105a457600080fd5b506005546001600160a01b03166102e3565b3480156105c257600080fd5b506102b66112db565b3480156105d757600080fd5b5061032e60085481565b3480156105ed57600080fd5b5061032e6105fc36600461233d565b600c6020526000908152604090205481565b34801561061a57600080fd5b5061031b610629366004612555565b6112ea565b34801561063a57600080fd5b5060095461028c90610100900460ff1681565b34801561065957600080fd5b5061032e600a5481565b34801561066f57600080fd5b5061032e60075481565b34801561068557600080fd5b5061031b6106943660046124a8565b6113af565b3480156106a557600080fd5b5061031b6106b4366004612653565b6113e7565b3480156106c557600080fd5b5061031b6106d43660046125a9565b611416565b61031b6106e7366004612701565b6114b5565b3480156106f857600080fd5b506102b6610707366004612653565b6116a5565b34801561071857600080fd5b5061031b610727366004612606565b6117c8565b34801561073857600080fd5b5061031b610747366004612653565b61181a565b34801561075857600080fd5b5061028c610767366004612358565b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205460ff1690565b3480156107a157600080fd5b5061031b6107b03660046125ea565b611849565b3480156107c157600080fd5b5061031b6107d036600461233d565b611897565b3480156107e157600080fd5b5061031b6107f036600461238b565b61192f565b60006001600160e01b0319821663780e9d6360e01b148061081a575061081a82611971565b92915050565b60606000805461082f90612b6a565b80601f016020809104026020016040519081016040528092919081815260200182805461085b90612b6a565b80156108a85780601f1061087d576101008083540402835291602001916108a8565b820191906000526020600020905b81548152906001019060200180831161088b57829003601f168201915b5050505050905090565b60006108bd826119c1565b6109235760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600360205260409020546001600160a01b031690565b600061094a82611011565b9050806001600160a01b0316836001600160a01b031614156109b85760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161091a565b336001600160a01b03821614806109d457506109d48133610767565b610a465760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161091a565b610a508383611a0b565b505050565b6005546001600160a01b03163314610a7f5760405162461bcd60e51b815260040161091a90612a26565b600855565b610a8f335b82611a79565b610aab5760405162461bcd60e51b815260040161091a90612a5b565b610a50838383611b63565b600254600954610100900460ff16610b105760405162461bcd60e51b815260206004820152601760248201527f5075626c69632073616c65206e6f742073746172746564000000000000000000604482015260640161091a565b612710610b1d8383612adc565b1115610b3b5760405162461bcd60e51b815260040161091a9061295c565b336000908152600c6020526040902054600754610b589190612b27565b821115610ba75760405162461bcd60e51b815260206004820152601760248201527f45786365656473206d6178207065722077616c6c65742e000000000000000000604482015260640161091a565b3460085483610bb69190612b08565b14610bfd5760405162461bcd60e51b815260206004820152601760248201527624b73b30b634b210333ab7323990383937bb34b232b21760491b604482015260640161091a565b336000908152600c602052604081208054849290610c1c908490612adc565b90915550600090505b82811015610a5057610c41335b610c3c8385612adc565b611cb9565b80610c4b81612ba5565b915050610c25565b6000610c5e836111d7565b8210610c7c5760405162461bcd60e51b815260040161091a90612989565b6000805b600254811015610ced5760028181548110610c9d57610c9d612c00565b6000918252602090912001546001600160a01b0386811691161415610cdb5783821415610ccd57915061081a9050565b81610cd781612ba5565b9250505b80610ce581612ba5565b915050610c80565b5060405162461bcd60e51b815260040161091a90612989565b6000610d1a6005546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d8060008114610d64576040519150601f19603f3d011682016040523d82523d6000602084013e610d69565b606091505b5050905080610dac5760405162461bcd60e51b815260206004820152600f60248201526e2330b4b632b2103a379039b2b7321760891b604482015260640161091a565b50565b610a50838383604051806020016040528060008152506113af565b610dd333610a89565b610e175760405162461bcd60e51b81526020600482015260156024820152742737ba1030b8383937bb32b2103a3790313ab9371760591b604482015260640161091a565b610dac81611d35565b60606000610e2d836111d7565b905080610e4e5760408051600080825260208201909252905b509392505050565b6000816001600160401b03811115610e6857610e68612c16565b604051908082528060200260200182016040528015610e91578160200160208202803683370190505b50905060005b82811015610e4657610ea98582610c53565b828281518110610ebb57610ebb612c00565b602090810291909101015280610ed081612ba5565b915050610e97565b6000805b82811015610f4d57846001600160a01b03166002858584818110610f0257610f02612c00565b9050602002013581548110610f1957610f19612c00565b6000918252602090912001546001600160a01b031614610f3d576000915050610f53565b610f4681612ba5565b9050610edc565b50600190505b9392505050565b6002546000908210610fc35760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b606482015260840161091a565b5090565b60005b825181101561100a57610ff88585858481518110610fea57610fea612c00565b6020026020010151856113af565b8061100281612ba5565b915050610fca565b5050505050565b6000806002838154811061102757611027612c00565b6000918252602090912001546001600160a01b031690508061081a5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161091a565b604080513360601b6bffffffffffffffffffffffff191660208201528151601481830301815260349091019091526000906111146110db8683611db7565b858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250611dea92505050565b6111305760405162461bcd60e51b815260040161091a90612919565b5050336000908152600b60205260409020549392505050565b6006805461115690612b6a565b80601f016020809104026020016040519081016040528092919081815260200182805461118290612b6a565b80156111cf5780601f106111a4576101008083540402835291602001916111cf565b820191906000526020600020905b8154815290600101906020018083116111b257829003601f168201915b505050505081565b60006001600160a01b0382166112425760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161091a565b6000805b60025481101561129e576002818154811061126357611263612c00565b6000918252602090912001546001600160a01b038581169116141561128e5761128b82612ba5565b91505b61129781612ba5565b9050611246565b5092915050565b6005546001600160a01b031633146112cf5760405162461bcd60e51b815260040161091a90612a26565b6112d96000611df9565b565b60606001805461082f90612b6a565b6001600160a01b0382163314156113435760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161091a565b3360008181526004602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6113b93383611a79565b6113d55760405162461bcd60e51b815260040161091a90612a5b565b6113e184848484611e4b565b50505050565b6005546001600160a01b031633146114115760405162461bcd60e51b815260040161091a90612a26565b600a55565b6005546001600160a01b031633146114405760405162461bcd60e51b815260040161091a90612a26565b6002546127106114508383612adc565b111561146e5760405162461bcd60e51b815260040161091a9061295c565b60005b828110156113e1576114a384848381811061148e5761148e612c00565b9050602002016020810190610c32919061233d565b806114ad81612ba5565b915050611471565b60025460095460ff166115015760405162461bcd60e51b81526020600482015260146024820152731c1c99481cd85b19481b9bdd081cdd185c9d195960621b604482015260640161091a565b61271061150e8683612adc565b111561152c5760405162461bcd60e51b815260040161091a9061295c565b604080513360601b6bffffffffffffffffffffffff1916602082015281516014818303018152603490910190915261156f6110db61156987611e7e565b83611db7565b61158b5760405162461bcd60e51b815260040161091a90612919565b336000908152600b602052604090205485906115a8908890612adc565b11156115f65760405162461bcd60e51b815260206004820152601860248201527f457863656564732077686974656c69737420737570706c790000000000000000604482015260640161091a565b34600854876116059190612b08565b1461164c5760405162461bcd60e51b815260206004820152601760248201527624b73b30b634b210333ab7323990383937bb34b232b21760491b604482015260640161091a565b336000908152600b60205260408120805488929061166b908490612adc565b90915550600090505b8681101561169c5761168a33610c3c8386612adc565b8061169481612ba5565b915050611674565b50505050505050565b60606116b0826119c1565b6116f45760405162461bcd60e51b81526020600482015260156024820152742a37b5b2b7103237b2b9903737ba1032bc34b9ba1760591b604482015260640161091a565b60095462010000900460ff16611796576006805461171190612b6a565b80601f016020809104026020016040519081016040528092919081815260200182805461173d90612b6a565b801561178a5780601f1061175f5761010080835404028352916020019161178a565b820191906000526020600020905b81548152906001019060200180831161176d57829003601f168201915b50505050509050919050565b60066117a183611e7e565b6040516020016117b29291906127ca565b6040516020818303038152906040529050919050565b6005546001600160a01b031633146117f25760405162461bcd60e51b815260040161091a90612a26565b6009805462ff0000191662010000841515021790558051610a50906006906020840190612142565b6005546001600160a01b031633146118445760405162461bcd60e51b815260040161091a90612a26565b600755565b6005546001600160a01b031633146118735760405162461bcd60e51b815260040161091a90612a26565b6009805461ffff191692151561ff0019169290921761010091151591909102179055565b6005546001600160a01b031633146118c15760405162461bcd60e51b815260040161091a90612a26565b6001600160a01b0381166119265760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161091a565b610dac81611df9565b60005b81518110156113e15761195f848484848151811061195257611952612c00565b6020026020010151610a84565b8061196981612ba5565b915050611932565b60006001600160e01b031982166380ac58cd60e01b14806119a257506001600160e01b03198216635b5e139f60e01b145b8061081a57506301ffc9a760e01b6001600160e01b031983161461081a565b6002546000908210801561081a575060006001600160a01b0316600283815481106119ee576119ee612c00565b6000918252602090912001546001600160a01b0316141592915050565b600081815260036020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611a4082611011565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611a84826119c1565b611ae55760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161091a565b6000611af083611011565b9050806001600160a01b0316846001600160a01b03161480611b2b5750836001600160a01b0316611b20846108b2565b6001600160a01b0316145b80611b5b57506001600160a01b0380821660009081526004602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611b7682611011565b6001600160a01b031614611bde5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b606482015260840161091a565b6001600160a01b038216611c405760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161091a565b611c4b600082611a0b565b8160028281548110611c5f57611c5f612c00565b6000918252602082200180546001600160a01b0319166001600160a01b03938416179055604051839285811692908716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9190a4505050565b6002805460018101825560009182527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0180546001600160a01b0319166001600160a01b0385169081179091556040518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000611d4082611011565b9050611d4d600083611a0b565b600060028381548110611d6257611d62612c00565b6000918252602082200180546001600160a01b0319166001600160a01b0393841617905560405184928416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b60008183604051602001611dcc92919061279b565b60405160208183030381529060405280519060200120905092915050565b6000610f5382600a5485611f7b565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b611e56848484611b63565b611e6284848484611f91565b6113e15760405162461bcd60e51b815260040161091a906129d4565b606081611ea25750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611ecc5780611eb681612ba5565b9150611ec59050600a83612af4565b9150611ea6565b6000816001600160401b03811115611ee657611ee6612c16565b6040519080825280601f01601f191660200182016040528015611f10576020820181803683370190505b5090505b8415611b5b57611f25600183612b27565b9150611f32600a86612bc0565b611f3d906030612adc565b60f81b818381518110611f5257611f52612c00565b60200101906001600160f81b031916908160001a905350611f74600a86612af4565b9450611f14565b600082611f88858461209e565b14949350505050565b60006001600160a01b0384163b1561209357604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611fd5903390899088908890600401612885565b602060405180830381600087803b158015611fef57600080fd5b505af192505050801561201f575060408051601f3d908101601f1916820190925261201c91810190612689565b60015b612079573d80801561204d576040519150601f19603f3d011682016040523d82523d6000602084013e612052565b606091505b5080516120715760405162461bcd60e51b815260040161091a906129d4565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611b5b565b506001949350505050565b600081815b8451811015610e465760008582815181106120c0576120c0612c00565b6020026020010151905080831161210257604080516020810185905290810182905260600160405160208183030381529060405280519060200120925061212f565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b508061213a81612ba5565b9150506120a3565b82805461214e90612b6a565b90600052602060002090601f01602090048101928261217057600085556121b6565b82601f1061218957805160ff19168380011785556121b6565b828001600101855582156121b6579182015b828111156121b657825182559160200191906001019061219b565b50610fc39291505b80821115610fc357600081556001016121be565b80356001600160a01b03811681146121e957600080fd5b919050565b60008083601f84011261220057600080fd5b5081356001600160401b0381111561221757600080fd5b6020830191508360208260051b850101111561223257600080fd5b9250929050565b600082601f83011261224a57600080fd5b813560206001600160401b0382111561226557612265612c16565b8160051b612274828201612aac565b83815282810190868401838801850189101561228f57600080fd5b600093505b858410156122b2578035835260019390930192918401918401612294565b50979650505050505050565b803580151581146121e957600080fd5b600082601f8301126122df57600080fd5b81356001600160401b038111156122f8576122f8612c16565b61230b601f8201601f1916602001612aac565b81815284602083860101111561232057600080fd5b816020850160208301376000918101602001919091529392505050565b60006020828403121561234f57600080fd5b610f53826121d2565b6000806040838503121561236b57600080fd5b612374836121d2565b9150612382602084016121d2565b90509250929050565b6000806000606084860312156123a057600080fd5b6123a9846121d2565b92506123b7602085016121d2565b915060408401356001600160401b038111156123d257600080fd5b6123de86828701612239565b9150509250925092565b600080600080608085870312156123fe57600080fd5b612407856121d2565b9350612415602086016121d2565b925060408501356001600160401b038082111561243157600080fd5b61243d88838901612239565b9350606087013591508082111561245357600080fd5b50612460878288016122ce565b91505092959194509250565b60008060006060848603121561248157600080fd5b61248a846121d2565b9250612498602085016121d2565b9150604084013590509250925092565b600080600080608085870312156124be57600080fd5b6124c7856121d2565b93506124d5602086016121d2565b92506040850135915060608501356001600160401b038111156124f757600080fd5b612460878288016122ce565b60008060006040848603121561251857600080fd5b612521846121d2565b925060208401356001600160401b0381111561253c57600080fd5b612548868287016121ee565b9497909650939450505050565b6000806040838503121561256857600080fd5b612571836121d2565b9150612382602084016122be565b6000806040838503121561259257600080fd5b61259b836121d2565b946020939093013593505050565b600080602083850312156125bc57600080fd5b82356001600160401b038111156125d257600080fd5b6125de858286016121ee565b90969095509350505050565b600080604083850312156125fd57600080fd5b612571836122be565b6000806040838503121561261957600080fd5b612622836122be565b915060208301356001600160401b0381111561263d57600080fd5b612649858286016122ce565b9150509250929050565b60006020828403121561266557600080fd5b5035919050565b60006020828403121561267e57600080fd5b8135610f5381612c2c565b60006020828403121561269b57600080fd5b8151610f5381612c2c565b6000806000604084860312156126bb57600080fd5b83356001600160401b03808211156126d257600080fd5b6126de878388016122ce565b945060208601359150808211156126f457600080fd5b50612548868287016121ee565b6000806000806060858703121561271757600080fd5b843593506020850135925060408501356001600160401b0381111561273b57600080fd5b612747878288016121ee565b95989497509550505050565b6000815180845261276b816020860160208601612b3e565b601f01601f19169290920160200192915050565b60008151612791818560208601612b3e565b9290920192915050565b600083516127ad818460208801612b3e565b8351908301906127c1818360208801612b3e565b01949350505050565b600080845481600182811c9150808316806127e657607f831692505b602080841082141561280657634e487b7160e01b86526022600452602486fd5b81801561281a576001811461282b57612858565b60ff19861689528489019650612858565b60008b81526020902060005b868110156128505781548b820152908501908301612837565b505084890196505b50505050505061287c61286b828661277f565b64173539b7b760d91b815260050190565b95945050505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906128b890830184612753565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156128fa578351835292840192918401916001016128de565b50909695505050505050565b602081526000610f536020830184612753565b60208082526023908201527f496e76616c6964204d65726b6c6520547265652070726f6f6620737570706c6960408201526232b21760e91b606082015260800190565b60208082526013908201527222bc31b2b232b99036b0bc1039bab838363c9760691b604082015260600190565b6020808252602b908201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560408201526a74206f6620626f756e647360a81b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b604051601f8201601f191681016001600160401b0381118282101715612ad457612ad4612c16565b604052919050565b60008219821115612aef57612aef612bd4565b500190565b600082612b0357612b03612bea565b500490565b6000816000190483118215151615612b2257612b22612bd4565b500290565b600082821015612b3957612b39612bd4565b500390565b60005b83811015612b59578181015183820152602001612b41565b838111156113e15750506000910152565b600181811c90821680612b7e57607f821691505b60208210811415612b9f57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612bb957612bb9612bd4565b5060010190565b600082612bcf57612bcf612bea565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610dac57600080fdfea26469706673582212204b171a62352e6e0dd4414a3a346b39aa7ed90afd30eb34ccff33145d93464ee264736f6c63430008070033

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

00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000037697066733a2f2f2f516d5a38374e65704c50596a7770323936715369734459506d696577556179366e717668744556694142365464722f000000000000000000

-----Decoded View---------------
Arg [0] : _baseURI (string): ipfs:///QmZ87NepLPYjwp296qSisDYPmiewUay6nqvhtEViAB6Tdr/

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000037
Arg [2] : 697066733a2f2f2f516d5a38374e65704c50596a777032393671536973445950
Arg [3] : 6d696577556179366e717668744556694142365464722f000000000000000000


Deployed Bytecode Sourcemap

31434:6144:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25344:300;;;;;;;;;;-1:-1:-1;25344:300:0;;;;;:::i;:::-;;:::i;:::-;;;13332:14:1;;13325:22;13307:41;;13295:2;13280:18;25344:300:0;;;;;;;;13988:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;14800:308::-;;;;;;;;;;-1:-1:-1;14800:308:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;11993:32:1;;;11975:51;;11963:2;11948:18;14800:308:0;11829:203:1;14323:411:0;;;;;;;;;;-1:-1:-1;14323:411:0;;;;;:::i;:::-;;:::i;:::-;;25720:110;;;;;;;;;;-1:-1:-1;25808:7:0;:14;25720:110;;;13505:25:1;;;13493:2;13478:18;25720:110:0;13359:177:1;32357:112:0;;;;;;;;;;-1:-1:-1;32357:112:0;;;;;:::i;:::-;;:::i;15859:376::-;;;;;;;;;;-1:-1:-1;15859:376:0;;;;;:::i;:::-;;:::i;33832:590::-;;;;;;:::i;:::-;;:::i;26283:588::-;;;;;;;;;;-1:-1:-1;26283:588:0;;;;;:::i;:::-;;:::i;31521:42::-;;;;;;;;;;;;31558:5;31521:42;;35508:190;;;;;;;;;;;;;:::i;16306:185::-;;;;;;;;;;-1:-1:-1;16306:185:0;;;;;:::i;:::-;;:::i;35306:194::-;;;;;;;;;;-1:-1:-1;35306:194:0;;;;;:::i;:::-;;:::i;35706:432::-;;;;;;;;;;-1:-1:-1;35706:432:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;31662:29::-;;;;;;;;;;-1:-1:-1;31662:29:0;;;;;;;;36714:289;;;;;;;;;;-1:-1:-1;36714:289:0;;;;;:::i;:::-;;:::i;25907:292::-;;;;;;;;;;-1:-1:-1;25907:292:0;;;;;:::i;:::-;;:::i;31737:30::-;;;;;;;;;;-1:-1:-1;31737:30:0;;;;;;;;;;;36408:298;;;;;;;;;;-1:-1:-1;36408:298:0;;;;;:::i;:::-;;:::i;13595:326::-;;;;;;;;;;-1:-1:-1;13595:326:0;;;;;:::i;:::-;;:::i;31823:59::-;;;;;;;;;;-1:-1:-1;31823:59:0;;;;;:::i;:::-;;;;;;;;;;;;;;32780:409;;;;;;;;;;-1:-1:-1;32780:409:0;;;;;:::i;:::-;;:::i;31491:21::-;;;;;;;;;;;;;:::i;13113:420::-;;;;;;;;;;-1:-1:-1;13113:420:0;;;;;:::i;:::-;;:::i;28473:103::-;;;;;;;;;;;;;:::i;27822:87::-;;;;;;;;;;-1:-1:-1;27895:6:0;;-1:-1:-1;;;;;27895:6:0;27822:87;;14157:104;;;;;;;;;;;;;:::i;31618:37::-;;;;;;;;;;;;;;;;31889:50;;;;;;;;;;-1:-1:-1;31889:50:0;;;;;:::i;:::-;;;;;;;;;;;;;;15180:327;;;;;;;;;;-1:-1:-1;15180:327:0;;;;;:::i;:::-;;:::i;31698:32::-;;;;;;;;;;-1:-1:-1;31698:32:0;;;;;;;;;;;31776:34;;;;;;;;;;;;;;;;31576:35;;;;;;;;;;;;;;;;16562:365;;;;;;;;;;-1:-1:-1;16562:365:0;;;;;:::i;:::-;;:::i;32607:165::-;;;;;;;;;;-1:-1:-1;32607:165:0;;;;;:::i;:::-;;:::i;33535:287::-;;;;;;;;;;-1:-1:-1;33535:287:0;;;;;:::i;:::-;;:::i;34430:868::-;;;;;;:::i;:::-;;:::i;33203:322::-;;;;;;;;;;-1:-1:-1;33203:322:0;;;;;:::i;:::-;;:::i;32064:140::-;;;;;;;;;;-1:-1:-1;32064:140:0;;;;;:::i;:::-;;:::i;32475:124::-;;;;;;;;;;-1:-1:-1;32475:124:0;;;;;:::i;:::-;;:::i;15578:214::-;;;;;;;;;;-1:-1:-1;15578:214:0;;;;;:::i;:::-;-1:-1:-1;;;;;15749:25:0;;;15720:4;15749:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;15578:214;32212:139;;;;;;;;;;-1:-1:-1;32212:139:0;;;;;:::i;:::-;;:::i;28731:238::-;;;;;;;;;;-1:-1:-1;28731:238:0;;;;;:::i;:::-;;:::i;36146:254::-;;;;;;;;;;-1:-1:-1;36146:254:0;;;;;:::i;:::-;;:::i;25344:300::-;25491:4;-1:-1:-1;;;;;;25533:50:0;;-1:-1:-1;;;25533:50:0;;:103;;;25600:36;25624:11;25600:23;:36::i;:::-;25513:123;25344:300;-1:-1:-1;;25344:300:0:o;13988:100::-;14042:13;14075:5;14068:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13988:100;:::o;14800:308::-;14921:7;14968:16;14976:7;14968;:16::i;:::-;14946:110;;;;-1:-1:-1;;;14946:110:0;;20478:2:1;14946:110:0;;;20460:21:1;20517:2;20497:18;;;20490:30;20556:34;20536:18;;;20529:62;-1:-1:-1;;;20607:18:1;;;20600:42;20659:19;;14946:110:0;;;;;;;;;-1:-1:-1;15076:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;15076:24:0;;14800:308::o;14323:411::-;14404:13;14420:23;14435:7;14420:14;:23::i;:::-;14404:39;;14468:5;-1:-1:-1;;;;;14462:11:0;:2;-1:-1:-1;;;;;14462:11:0;;;14454:57;;;;-1:-1:-1;;;14454:57:0;;22361:2:1;14454:57:0;;;22343:21:1;22400:2;22380:18;;;22373:30;22439:34;22419:18;;;22412:62;-1:-1:-1;;;22490:18:1;;;22483:31;22531:19;;14454:57:0;22159:397:1;14454:57:0;11835:10;-1:-1:-1;;;;;14546:21:0;;;;:62;;-1:-1:-1;14571:37:0;14588:5;11835:10;15578:214;:::i;14571:37::-;14524:168;;;;-1:-1:-1;;;14524:168:0;;18530:2:1;14524:168:0;;;18512:21:1;18569:2;18549:18;;;18542:30;18608:34;18588:18;;;18581:62;18679:26;18659:18;;;18652:54;18723:19;;14524:168:0;18328:420:1;14524:168:0;14705:21;14714:2;14718:7;14705:8;:21::i;:::-;14393:341;14323:411;;:::o;32357:112::-;27895:6;;-1:-1:-1;;;;;27895:6:0;11835:10;28042:23;28034:68;;;;-1:-1:-1;;;28034:68:0;;;;;;;:::i;:::-;32433:12:::1;:28:::0;32357:112::o;15859:376::-;16068:41;11835:10;16087:12;16101:7;16068:18;:41::i;:::-;16046:140;;;;-1:-1:-1;;;16046:140:0;;;;;;;:::i;:::-;16199:28;16209:4;16215:2;16219:7;16199:9;:28::i;33832:590::-;33915:7;:14;33948:12;;;;;;;33940:48;;;;-1:-1:-1;;;33940:48:0;;17765:2:1;33940:48:0;;;17747:21:1;17804:2;17784:18;;;17777:30;17843:25;17823:18;;;17816:53;17886:18;;33940:48:0;17563:347:1;33940:48:0;31558:5;34007:19;34021:5;34007:11;:19;:::i;:::-;:33;;33999:65;;;;-1:-1:-1;;;33999:65:0;;;;;;;:::i;:::-;11835:10;34111:29;;;;:15;:29;;;;;;34092:16;;:48;;34111:29;34092:48;:::i;:::-;34083:5;:57;;34075:93;;;;-1:-1:-1;;;34075:93:0;;16654:2:1;34075:93:0;;;16636:21:1;16693:2;16673:18;;;16666:30;16732:25;16712:18;;;16705:53;16775:18;;34075:93:0;16452:347:1;34075:93:0;34211:9;34195:12;;34187:5;:20;;;;:::i;:::-;:33;34179:69;;;;-1:-1:-1;;;34179:69:0;;19776:2:1;34179:69:0;;;19758:21:1;19815:2;19795:18;;;19788:30;-1:-1:-1;;;19834:18:1;;;19827:53;19897:18;;34179:69:0;19574:347:1;34179:69:0;11835:10;34269:29;;;;:15;:29;;;;;:38;;34302:5;;34269:29;:38;;34302:5;;34269:38;:::i;:::-;;;;-1:-1:-1;34325:9:0;;-1:-1:-1;34320:95:0;34340:5;34336:1;:9;34320:95;;;34367:36;11835:10;34373:12;34387:15;34401:1;34387:11;:15;:::i;:::-;34367:5;:36::i;:::-;34347:3;;;;:::i;:::-;;;;34320:95;;26283:588;26425:15;26488:16;26498:5;26488:9;:16::i;:::-;26480:5;:24;26458:117;;;;-1:-1:-1;;;26458:117:0;;;;;;;:::i;:::-;26588:13;26617:9;26612:186;26632:7;:14;26628:18;;26612:186;;;26681:7;26689:1;26681:10;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;26672:19:0;;;26681:10;;26672:19;26668:119;;;26725:5;26716;:14;26712:59;;;26739:1;-1:-1:-1;26732:8:0;;-1:-1:-1;26732:8:0;26712:59;26764:7;;;;:::i;:::-;;;;26712:59;26648:3;;;;:::i;:::-;;;;26612:186;;;;26810:53;;-1:-1:-1;;;26810:53:0;;;;;;;:::i;35508:190::-;35547:12;35573:7;27895:6;;-1:-1:-1;;;;;27895:6:0;;27822:87;35573:7;-1:-1:-1;;;;;35565:21:0;35594;35565:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35546:98;;;35663:7;35655:35;;;;-1:-1:-1;;;35655:35:0;;15957:2:1;35655:35:0;;;15939:21:1;15996:2;15976:18;;;15969:30;-1:-1:-1;;;16015:18:1;;;16008:45;16070:18;;35655:35:0;15755:339:1;35655:35:0;35535:163;35508:190::o;16306:185::-;16444:39;16461:4;16467:2;16471:7;16444:39;;;;;;;;;;;;:16;:39::i;35306:194::-;35377:41;11835:10;35396:12;11755:98;35377:41;35355:112;;;;-1:-1:-1;;;35355:112:0;;22011:2:1;35355:112:0;;;21993:21:1;22050:2;22030:18;;;22023:30;-1:-1:-1;;;22069:18:1;;;22062:51;22130:18;;35355:112:0;21809:345:1;35355:112:0;35478:14;35484:7;35478:5;:14::i;35706:432::-;35793:16;35827:18;35848:17;35858:6;35848:9;:17::i;:::-;35827:38;-1:-1:-1;35880:15:0;35876:44;;35904:16;;;35918:1;35904:16;;;;;;;;;;;-1:-1:-1;35897:23:0;35706:432;-1:-1:-1;;;35706:432:0:o;35876:44::-;35933:25;35975:10;-1:-1:-1;;;;;35961:25:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35961:25:0;;35933:53;;36002:9;35997:108;36017:10;36013:1;:14;35997:108;;;36063:30;36083:6;36091:1;36063:19;:30::i;:::-;36049:8;36058:1;36049:11;;;;;;;;:::i;:::-;;;;;;;;;;:44;36029:3;;;;:::i;:::-;;;;35997:108;;36714:289;36830:4;36857:9;36852:120;36868:20;;;36852:120;;;36939:7;-1:-1:-1;;;;;36914:32:0;:7;36922:9;;36932:1;36922:12;;;;;;;:::i;:::-;;;;;;;36914:21;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;36914:21:0;:32;36910:50;;36955:5;36948:12;;;;;36910:50;36890:3;;;:::i;:::-;;;36852:120;;;;36991:4;36984:11;;36714:289;;;;;;:::o;25907:292::-;26082:7;:14;26027:7;;26074:22;;26052:116;;;;-1:-1:-1;;;26052:116:0;;23181:2:1;26052:116:0;;;23163:21:1;23220:2;23200:18;;;23193:30;23259:34;23239:18;;;23232:62;-1:-1:-1;;;23310:18:1;;;23303:42;23362:19;;26052:116:0;22979:408:1;26052:116:0;-1:-1:-1;26186:5:0;25907:292::o;36408:298::-;36581:9;36576:123;36600:9;:16;36596:1;:20;36576:123;;;36638:49;36655:5;36662:3;36667:9;36677:1;36667:12;;;;;;;;:::i;:::-;;;;;;;36681:5;36638:16;:49::i;:::-;36618:3;;;;:::i;:::-;;;;36576:123;;;;36408:298;;;;:::o;13595:326::-;13712:7;13737:13;13753:7;13761;13753:16;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;13753:16:0;;-1:-1:-1;13802:19:0;13780:110;;;;-1:-1:-1;;;13780:110:0;;19366:2:1;13780:110:0;;;19348:21:1;19405:2;19385:18;;;19378:30;19444:34;19424:18;;;19417:62;-1:-1:-1;;;19495:18:1;;;19488:39;19544:19;;13780:110:0;19164:405:1;32780:409:0;32957:30;;;11835:10;9501:2:1;9497:15;-1:-1:-1;;9493:53:1;32957:30:0;;;9481:66:1;32957:30:0;;;;;;;;;9563:12:1;;;;32957:30:0;;;32901:7;;33021:41;33029:25;33035:9;32957:30;33029:5;:25::i;:::-;33056:5;;33021:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33021:7:0;;-1:-1:-1;;;33021:41:0:i;:::-;32999:126;;;;-1:-1:-1;;;32999:126:0;;;;;;;:::i;:::-;-1:-1:-1;;11835:10:0;33143:38;;;;:24;:38;;;;;;;;-1:-1:-1;;;32780:409:0:o;31491:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;13113:420::-;13230:7;-1:-1:-1;;;;;13277:19:0;;13255:111;;;;-1:-1:-1;;;13255:111:0;;18955:2:1;13255:111:0;;;18937:21:1;18994:2;18974:18;;;18967:30;19033:34;19013:18;;;19006:62;-1:-1:-1;;;19084:18:1;;;19077:40;19134:19;;13255:111:0;18753:406:1;13255:111:0;13379:13;13408:9;13403:100;13423:7;:14;13419:18;;13403:100;;;13472:7;13480:1;13472:10;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;13463:19:0;;;13472:10;;13463:19;13459:32;;;13484:7;;;:::i;:::-;;;13459:32;13439:3;;;:::i;:::-;;;13403:100;;;-1:-1:-1;13520:5:0;13113:420;-1:-1:-1;;13113:420:0:o;28473:103::-;27895:6;;-1:-1:-1;;;;;27895:6:0;11835:10;28042:23;28034:68;;;;-1:-1:-1;;;28034:68:0;;;;;;;:::i;:::-;28538:30:::1;28565:1;28538:18;:30::i;:::-;28473:103::o:0;14157:104::-;14213:13;14246:7;14239:14;;;;;:::i;15180:327::-;-1:-1:-1;;;;;15315:24:0;;11835:10;15315:24;;15307:62;;;;-1:-1:-1;;;15307:62:0;;17411:2:1;15307:62:0;;;17393:21:1;17450:2;17430:18;;;17423:30;17489:27;17469:18;;;17462:55;17534:18;;15307:62:0;17209:349:1;15307:62:0;11835:10;15382:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;15382:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;15382:53:0;;;;;;;;;;15451:48;;13307:41:1;;;15382:42:0;;11835:10;15451:48;;13280:18:1;15451:48:0;;;;;;;15180:327;;:::o;16562:365::-;16751:41;11835:10;16784:7;16751:18;:41::i;:::-;16729:140;;;;-1:-1:-1;;;16729:140:0;;;;;;;:::i;:::-;16880:39;16894:4;16900:2;16904:7;16913:5;16880:13;:39::i;:::-;16562:365;;;;:::o;32607:165::-;27895:6;;-1:-1:-1;;;;;27895:6:0;11835:10;28042:23;28034:68;;;;-1:-1:-1;;;28034:68:0;;;;;;;:::i;:::-;32722:19:::1;:42:::0;32607:165::o;33535:287::-;27895:6;;-1:-1:-1;;;;;27895:6:0;11835:10;28042:23;28034:68;;;;-1:-1:-1;;;28034:68:0;;;;;;;:::i;:::-;33632:7:::1;:14:::0;31558:5:::1;33665:27;33679:6:::0;33632:14;33665:27:::1;:::i;:::-;:41;;33657:73;;;;-1:-1:-1::0;;;33657:73:0::1;;;;;;;:::i;:::-;33746:9;33741:73;33757:17:::0;;::::1;33741:73;;;33781:33;33787:6;;33794:1;33787:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;33781:33::-;33776:3:::0;::::1;::::0;::::1;:::i;:::-;;;;33741:73;;34430:868:::0;34595:7;:14;34628:9;;;;34620:42;;;;-1:-1:-1;;;34620:42:0;;21252:2:1;34620:42:0;;;21234:21:1;21291:2;21271:18;;;21264:30;-1:-1:-1;;;21310:18:1;;;21303:50;21370:18;;34620:42:0;21050:344:1;34620:42:0;31558:5;34681:19;34695:5;34681:11;:19;:::i;:::-;:33;;34673:65;;;;-1:-1:-1;;;34673:65:0;;;;;;;:::i;:::-;34780:30;;;11835:10;9501:2:1;9497:15;-1:-1:-1;;9493:53:1;34780:30:0;;;9481:66:1;34780:30:0;;;;;;;;;9563:12:1;;;;34780:30:0;;;34830:59;34838:43;34844:27;34861:9;34844:16;:27::i;:::-;34873:7;34838:5;:43::i;34830:59::-;34822:106;;;;-1:-1:-1;;;34822:106:0;;;;;;;:::i;:::-;11835:10;34947:38;;;;:24;:38;;;;;;34997:9;;34947:46;;34988:5;;34947:46;:::i;:::-;:59;;34939:96;;;;-1:-1:-1;;;34939:96:0;;16301:2:1;34939:96:0;;;16283:21:1;16340:2;16320:18;;;16313:30;16379:26;16359:18;;;16352:54;16423:18;;34939:96:0;16099:348:1;34939:96:0;35078:9;35062:12;;35054:5;:20;;;;:::i;:::-;:33;35046:69;;;;-1:-1:-1;;;35046:69:0;;19776:2:1;35046:69:0;;;19758:21:1;19815:2;19795:18;;;19788:30;-1:-1:-1;;;19834:18:1;;;19827:53;19897:18;;35046:69:0;19574:347:1;35046:69:0;11835:10;35128:38;;;;:24;:38;;;;;:47;;35170:5;;35128:38;:47;;35170:5;;35128:47;:::i;:::-;;;;-1:-1:-1;35201:9:0;;-1:-1:-1;35196:95:0;35216:5;35212:1;:9;35196:95;;;35243:36;11835:10;35263:15;35277:1;35263:11;:15;:::i;35243:36::-;35223:3;;;;:::i;:::-;;;;35196:95;;;;34562:736;;34430:868;;;;:::o;33203:322::-;33305:13;33344:17;33352:8;33344:7;:17::i;:::-;33336:51;;;;-1:-1:-1;;;33336:51:0;;20128:2:1;33336:51:0;;;20110:21:1;20167:2;20147:18;;;20140:30;-1:-1:-1;;;20186:18:1;;;20179:51;20247:18;;33336:51:0;19926:345:1;33336:51:0;33403:10;;;;;;;33398:31;;33422:7;33415:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33203:322;;;:::o;33398:31::-;33471:7;33480:26;33497:8;33480:16;:26::i;:::-;33454:62;;;;;;;;;:::i;:::-;;;;;;;;;;;;;33440:77;;33203:322;;;:::o;32064:140::-;27895:6;;-1:-1:-1;;;;;27895:6:0;11835:10;28042:23;28034:68;;;;-1:-1:-1;;;28034:68:0;;;;;;;:::i;:::-;32148:10:::1;:19:::0;;-1:-1:-1;;32148:19:0::1;::::0;;::::1;;;;::::0;;32178:18;;::::1;::::0;:7:::1;::::0;:18:::1;::::0;::::1;::::0;::::1;:::i;32475:124::-:0;27895:6;;-1:-1:-1;;;;;27895:6:0;11835:10;28042:23;28034:68;;;;-1:-1:-1;;;28034:68:0;;;;;;;:::i;:::-;32555:16:::1;:36:::0;32475:124::o;32212:139::-;27895:6;;-1:-1:-1;;;;;27895:6:0;11835:10;28042:23;28034:68;;;;-1:-1:-1;;;28034:68:0;;;;;;;:::i;:::-;32288:9:::1;:19:::0;;-1:-1:-1;;32318:25:0;32288:19;::::1;;-1:-1:-1::0;;32318:25:0;;;;;32288:19:::1;32318:25:::0;::::1;;::::0;;;::::1;;::::0;;32212:139::o;28731:238::-;27895:6;;-1:-1:-1;;;;;27895:6:0;11835:10;28042:23;28034:68;;;;-1:-1:-1;;;28034:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;28834:22:0;::::1;28812:110;;;::::0;-1:-1:-1;;;28812:110:0;;15550:2:1;28812:110:0::1;::::0;::::1;15532:21:1::0;15589:2;15569:18;;;15562:30;15628:34;15608:18;;;15601:62;-1:-1:-1;;;15679:18:1;;;15672:36;15725:19;;28812:110:0::1;15348:402:1::0;28812:110:0::1;28933:28;28952:8;28933:18;:28::i;36146:254::-:0;36286:9;36281:112;36305:9;:16;36301:1;:20;36281:112;;;36343:38;36356:5;36363:3;36368:9;36378:1;36368:12;;;;;;;;:::i;:::-;;;;;;;36343;:38::i;:::-;36323:3;;;;:::i;:::-;;;;36281:112;;12694:355;12841:4;-1:-1:-1;;;;;;12883:40:0;;-1:-1:-1;;;12883:40:0;;:105;;-1:-1:-1;;;;;;;12940:48:0;;-1:-1:-1;;;12940:48:0;12883:105;:158;;;-1:-1:-1;;;;;;;;;;4774:40:0;;;13005:36;4615:207;18474:155;18573:7;:14;18539:4;;18563:24;;:58;;;;;18619:1;-1:-1:-1;;;;;18591:30:0;:7;18599;18591:16;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;18591:16:0;:30;;18556:65;18474:155;-1:-1:-1;;18474:155:0:o;22499:174::-;22574:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;22574:29:0;-1:-1:-1;;;;;22574:29:0;;;;;;;;:24;;22628:23;22574:24;22628:14;:23::i;:::-;-1:-1:-1;;;;;22619:46:0;;;;;;;;;;;22499:174;;:::o;18796:452::-;18925:4;18969:16;18977:7;18969;:16::i;:::-;18947:110;;;;-1:-1:-1;;;18947:110:0;;18117:2:1;18947:110:0;;;18099:21:1;18156:2;18136:18;;;18129:30;18195:34;18175:18;;;18168:62;-1:-1:-1;;;18246:18:1;;;18239:42;18298:19;;18947:110:0;17915:408:1;18947:110:0;19068:13;19084:23;19099:7;19084:14;:23::i;:::-;19068:39;;19137:5;-1:-1:-1;;;;;19126:16:0;:7;-1:-1:-1;;;;;19126:16:0;;:64;;;;19183:7;-1:-1:-1;;;;;19159:31:0;:20;19171:7;19159:11;:20::i;:::-;-1:-1:-1;;;;;19159:31:0;;19126:64;:113;;;-1:-1:-1;;;;;;15749:25:0;;;15720:4;15749:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;19207:32;19118:122;18796:452;-1:-1:-1;;;;18796:452:0:o;21828:553::-;22001:4;-1:-1:-1;;;;;21974:31:0;:23;21989:7;21974:14;:23::i;:::-;-1:-1:-1;;;;;21974:31:0;;21952:122;;;;-1:-1:-1;;;21952:122:0;;21601:2:1;21952:122:0;;;21583:21:1;21640:2;21620:18;;;21613:30;21679:34;21659:18;;;21652:62;-1:-1:-1;;;21730:18:1;;;21723:39;21779:19;;21952:122:0;21399:405:1;21952:122:0;-1:-1:-1;;;;;22093:16:0;;22085:65;;;;-1:-1:-1;;;22085:65:0;;17006:2:1;22085:65:0;;;16988:21:1;17045:2;17025:18;;;17018:30;17084:34;17064:18;;;17057:62;-1:-1:-1;;;17135:18:1;;;17128:34;17179:19;;22085:65:0;16804:400:1;22085:65:0;22267:29;22284:1;22288:7;22267:8;:29::i;:::-;22326:2;22307:7;22315;22307:16;;;;;;;;:::i;:::-;;;;;;;;;:21;;-1:-1:-1;;;;;;22307:21:0;-1:-1:-1;;;;;22307:21:0;;;;;;22346:27;;22365:7;;22346:27;;;;;;;;;;22307:16;22346:27;21828:553;;;:::o;37011:154::-;37092:7;:16;;;;;;;-1:-1:-1;37092:16:0;;;;;;;-1:-1:-1;;;;;;37092:16:0;-1:-1:-1;;;;;37092:16:0;;;;;;;;37124:33;;37149:7;;-1:-1:-1;37124:33:0;;-1:-1:-1;;37124:33:0;37011:154;;:::o;21159:332::-;21219:13;21235:23;21250:7;21235:14;:23::i;:::-;21219:39;;21360:29;21377:1;21381:7;21360:8;:29::i;:::-;21427:1;21400:7;21408;21400:16;;;;;;;;:::i;:::-;;;;;;;;;:29;;-1:-1:-1;;;;;;21400:29:0;-1:-1:-1;;;;;21400:29:0;;;;;;21447:36;;21475:7;;21447:36;;;;;21400:16;;21447:36;21208:283;21159:332;:::o;37173:200::-;37286:7;37345;37354:9;37328:36;;;;;;;;;:::i;:::-;;;;;;;;;;;;;37318:47;;;;;;37311:54;;37173:200;;;;:::o;37381:194::-;37486:4;37515:52;37534:5;37541:19;;37562:4;37515:18;:52::i;29129:191::-;29222:6;;;-1:-1:-1;;;;;29239:17:0;;;-1:-1:-1;;;;;;29239:17:0;;;;;;;29272:40;;29222:6;;;29239:17;29222:6;;29272:40;;29203:16;;29272:40;29192:128;29129:191;:::o;17809:352::-;17966:28;17976:4;17982:2;17986:7;17966:9;:28::i;:::-;18027:48;18050:4;18056:2;18060:7;18069:5;18027:22;:48::i;:::-;18005:148;;;;-1:-1:-1;;;18005:148:0;;;;;;;:::i;514:723::-;570:13;791:10;787:53;;-1:-1:-1;;818:10:0;;;;;;;;;;;;-1:-1:-1;;;818:10:0;;;;;514:723::o;787:53::-;865:5;850:12;906:78;913:9;;906:78;;939:8;;;;:::i;:::-;;-1:-1:-1;962:10:0;;-1:-1:-1;970:2:0;962:10;;:::i;:::-;;;906:78;;;994:19;1026:6;-1:-1:-1;;;;;1016:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1016:17:0;;994:39;;1044:154;1051:10;;1044:154;;1078:11;1088:1;1078:11;;:::i;:::-;;-1:-1:-1;1147:10:0;1155:2;1147:5;:10;:::i;:::-;1134:24;;:2;:24;:::i;:::-;1121:39;;1104:6;1111;1104:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;1104:56:0;;;;;;;;-1:-1:-1;1175:11:0;1184:2;1175:11;;:::i;:::-;;;1044:154;;30062:190;30187:4;30240;30211:25;30224:5;30231:4;30211:12;:25::i;:::-;:33;;30062:190;-1:-1:-1;;;;30062:190:0:o;23238:980::-;23393:4;-1:-1:-1;;;;;23414:13:0;;217:20;265:8;23410:801;;23467:175;;-1:-1:-1;;;23467:175:0;;-1:-1:-1;;;;;23467:36:0;;;;;:175;;11835:10;;23561:4;;23588:7;;23618:5;;23467:175;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23467:175:0;;;;;;;;-1:-1:-1;;23467:175:0;;;;;;;;;;;;:::i;:::-;;;23446:710;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23825:13:0;;23821:320;;23868:108;;-1:-1:-1;;;23868:108:0;;;;;;;:::i;23821:320::-;24091:6;24085:13;24076:6;24072:2;24068:15;24061:38;23446:710;-1:-1:-1;;;;;;23706:51:0;-1:-1:-1;;;23706:51:0;;-1:-1:-1;23699:58:0;;23410:801;-1:-1:-1;24195:4:0;23238:980;;;;;;:::o;30614:813::-;30724:7;30772:4;30724:7;30787:603;30811:5;:12;30807:1;:16;30787:603;;;30845:20;30868:5;30874:1;30868:8;;;;;;;;:::i;:::-;;;;;;;30845:31;;30911:12;30895;:28;30891:488;;31070:44;;;;;;9743:19:1;;;9778:12;;;9771:28;;;9815:12;;31070:44:0;;;;;;;;;;;;31038:95;;;;;;31023:110;;30891:488;;;31300:44;;;;;;9743:19:1;;;9778:12;;;9771:28;;;9815:12;;31300:44:0;;;;;;;;;;;;31268:95;;;;;;31253:110;;30891:488;-1:-1:-1;30825:3:0;;;;:::i;:::-;;;;30787:603;;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:173:1;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:367::-;255:8;265:6;319:3;312:4;304:6;300:17;296:27;286:55;;337:1;334;327:12;286:55;-1:-1:-1;360:20:1;;-1:-1:-1;;;;;392:30:1;;389:50;;;435:1;432;425:12;389:50;472:4;464:6;460:17;448:29;;532:3;525:4;515:6;512:1;508:14;500:6;496:27;492:38;489:47;486:67;;;549:1;546;539:12;486:67;192:367;;;;;:::o;564:723::-;618:5;671:3;664:4;656:6;652:17;648:27;638:55;;689:1;686;679:12;638:55;725:6;712:20;751:4;-1:-1:-1;;;;;770:2:1;767:26;764:52;;;796:18;;:::i;:::-;842:2;839:1;835:10;865:28;889:2;885;881:11;865:28;:::i;:::-;927:15;;;958:12;;;;990:15;;;1024;;;1020:24;;1017:33;-1:-1:-1;1014:53:1;;;1063:1;1060;1053:12;1014:53;1085:1;1076:10;;1095:163;1109:2;1106:1;1103:9;1095:163;;;1166:17;;1154:30;;1127:1;1120:9;;;;;1204:12;;;;1236;;1095:163;;;-1:-1:-1;1276:5:1;564:723;-1:-1:-1;;;;;;;564:723:1:o;1292:160::-;1357:20;;1413:13;;1406:21;1396:32;;1386:60;;1442:1;1439;1432:12;1457:530;1499:5;1552:3;1545:4;1537:6;1533:17;1529:27;1519:55;;1570:1;1567;1560:12;1519:55;1606:6;1593:20;-1:-1:-1;;;;;1628:2:1;1625:26;1622:52;;;1654:18;;:::i;:::-;1698:55;1741:2;1722:13;;-1:-1:-1;;1718:27:1;1747:4;1714:38;1698:55;:::i;:::-;1778:2;1769:7;1762:19;1824:3;1817:4;1812:2;1804:6;1800:15;1796:26;1793:35;1790:55;;;1841:1;1838;1831:12;1790:55;1906:2;1899:4;1891:6;1887:17;1880:4;1871:7;1867:18;1854:55;1954:1;1929:16;;;1947:4;1925:27;1918:38;;;;1933:7;1457:530;-1:-1:-1;;;1457:530:1:o;1992:186::-;2051:6;2104:2;2092:9;2083:7;2079:23;2075:32;2072:52;;;2120:1;2117;2110:12;2072:52;2143:29;2162:9;2143:29;:::i;2183:260::-;2251:6;2259;2312:2;2300:9;2291:7;2287:23;2283:32;2280:52;;;2328:1;2325;2318:12;2280:52;2351:29;2370:9;2351:29;:::i;:::-;2341:39;;2399:38;2433:2;2422:9;2418:18;2399:38;:::i;:::-;2389:48;;2183:260;;;;;:::o;2448:496::-;2550:6;2558;2566;2619:2;2607:9;2598:7;2594:23;2590:32;2587:52;;;2635:1;2632;2625:12;2587:52;2658:29;2677:9;2658:29;:::i;:::-;2648:39;;2706:38;2740:2;2729:9;2725:18;2706:38;:::i;:::-;2696:48;;2795:2;2784:9;2780:18;2767:32;-1:-1:-1;;;;;2814:6:1;2811:30;2808:50;;;2854:1;2851;2844:12;2808:50;2877:61;2930:7;2921:6;2910:9;2906:22;2877:61;:::i;:::-;2867:71;;;2448:496;;;;;:::o;2949:716::-;3069:6;3077;3085;3093;3146:3;3134:9;3125:7;3121:23;3117:33;3114:53;;;3163:1;3160;3153:12;3114:53;3186:29;3205:9;3186:29;:::i;:::-;3176:39;;3234:38;3268:2;3257:9;3253:18;3234:38;:::i;:::-;3224:48;;3323:2;3312:9;3308:18;3295:32;-1:-1:-1;;;;;3387:2:1;3379:6;3376:14;3373:34;;;3403:1;3400;3393:12;3373:34;3426:61;3479:7;3470:6;3459:9;3455:22;3426:61;:::i;:::-;3416:71;;3540:2;3529:9;3525:18;3512:32;3496:48;;3569:2;3559:8;3556:16;3553:36;;;3585:1;3582;3575:12;3553:36;;3608:51;3651:7;3640:8;3629:9;3625:24;3608:51;:::i;:::-;3598:61;;;2949:716;;;;;;;:::o;3670:328::-;3747:6;3755;3763;3816:2;3804:9;3795:7;3791:23;3787:32;3784:52;;;3832:1;3829;3822:12;3784:52;3855:29;3874:9;3855:29;:::i;:::-;3845:39;;3903:38;3937:2;3926:9;3922:18;3903:38;:::i;:::-;3893:48;;3988:2;3977:9;3973:18;3960:32;3950:42;;3670:328;;;;;:::o;4003:537::-;4098:6;4106;4114;4122;4175:3;4163:9;4154:7;4150:23;4146:33;4143:53;;;4192:1;4189;4182:12;4143:53;4215:29;4234:9;4215:29;:::i;:::-;4205:39;;4263:38;4297:2;4286:9;4282:18;4263:38;:::i;:::-;4253:48;;4348:2;4337:9;4333:18;4320:32;4310:42;;4403:2;4392:9;4388:18;4375:32;-1:-1:-1;;;;;4422:6:1;4419:30;4416:50;;;4462:1;4459;4452:12;4416:50;4485:49;4526:7;4517:6;4506:9;4502:22;4485:49;:::i;4545:511::-;4640:6;4648;4656;4709:2;4697:9;4688:7;4684:23;4680:32;4677:52;;;4725:1;4722;4715:12;4677:52;4748:29;4767:9;4748:29;:::i;:::-;4738:39;;4828:2;4817:9;4813:18;4800:32;-1:-1:-1;;;;;4847:6:1;4844:30;4841:50;;;4887:1;4884;4877:12;4841:50;4926:70;4988:7;4979:6;4968:9;4964:22;4926:70;:::i;:::-;4545:511;;5015:8;;-1:-1:-1;4900:96:1;;-1:-1:-1;;;;4545:511:1:o;5061:254::-;5126:6;5134;5187:2;5175:9;5166:7;5162:23;5158:32;5155:52;;;5203:1;5200;5193:12;5155:52;5226:29;5245:9;5226:29;:::i;:::-;5216:39;;5274:35;5305:2;5294:9;5290:18;5274:35;:::i;5320:254::-;5388:6;5396;5449:2;5437:9;5428:7;5424:23;5420:32;5417:52;;;5465:1;5462;5455:12;5417:52;5488:29;5507:9;5488:29;:::i;:::-;5478:39;5564:2;5549:18;;;;5536:32;;-1:-1:-1;;;5320:254:1:o;5579:437::-;5665:6;5673;5726:2;5714:9;5705:7;5701:23;5697:32;5694:52;;;5742:1;5739;5732:12;5694:52;5782:9;5769:23;-1:-1:-1;;;;;5807:6:1;5804:30;5801:50;;;5847:1;5844;5837:12;5801:50;5886:70;5948:7;5939:6;5928:9;5924:22;5886:70;:::i;:::-;5975:8;;5860:96;;-1:-1:-1;5579:437:1;-1:-1:-1;;;;5579:437:1:o;6021:248::-;6083:6;6091;6144:2;6132:9;6123:7;6119:23;6115:32;6112:52;;;6160:1;6157;6150:12;6112:52;6183:26;6199:9;6183:26;:::i;6274:389::-;6349:6;6357;6410:2;6398:9;6389:7;6385:23;6381:32;6378:52;;;6426:1;6423;6416:12;6378:52;6449:26;6465:9;6449:26;:::i;:::-;6439:36;;6526:2;6515:9;6511:18;6498:32;-1:-1:-1;;;;;6545:6:1;6542:30;6539:50;;;6585:1;6582;6575:12;6539:50;6608:49;6649:7;6640:6;6629:9;6625:22;6608:49;:::i;:::-;6598:59;;;6274:389;;;;;:::o;6668:180::-;6727:6;6780:2;6768:9;6759:7;6755:23;6751:32;6748:52;;;6796:1;6793;6786:12;6748:52;-1:-1:-1;6819:23:1;;6668:180;-1:-1:-1;6668:180:1:o;6853:245::-;6911:6;6964:2;6952:9;6943:7;6939:23;6935:32;6932:52;;;6980:1;6977;6970:12;6932:52;7019:9;7006:23;7038:30;7062:5;7038:30;:::i;7103:249::-;7172:6;7225:2;7213:9;7204:7;7200:23;7196:32;7193:52;;;7241:1;7238;7231:12;7193:52;7273:9;7267:16;7292:30;7316:5;7292:30;:::i;7357:657::-;7462:6;7470;7478;7531:2;7519:9;7510:7;7506:23;7502:32;7499:52;;;7547:1;7544;7537:12;7499:52;7587:9;7574:23;-1:-1:-1;;;;;7657:2:1;7649:6;7646:14;7643:34;;;7673:1;7670;7663:12;7643:34;7696:49;7737:7;7728:6;7717:9;7713:22;7696:49;:::i;:::-;7686:59;;7798:2;7787:9;7783:18;7770:32;7754:48;;7827:2;7817:8;7814:16;7811:36;;;7843:1;7840;7833:12;7811:36;;7882:72;7946:7;7935:8;7924:9;7920:24;7882:72;:::i;8204:573::-;8308:6;8316;8324;8332;8385:2;8373:9;8364:7;8360:23;8356:32;8353:52;;;8401:1;8398;8391:12;8353:52;8437:9;8424:23;8414:33;;8494:2;8483:9;8479:18;8466:32;8456:42;;8549:2;8538:9;8534:18;8521:32;-1:-1:-1;;;;;8568:6:1;8565:30;8562:50;;;8608:1;8605;8598:12;8562:50;8647:70;8709:7;8700:6;8689:9;8685:22;8647:70;:::i;:::-;8204:573;;;;-1:-1:-1;8736:8:1;-1:-1:-1;;;;8204:573:1:o;8782:257::-;8823:3;8861:5;8855:12;8888:6;8883:3;8876:19;8904:63;8960:6;8953:4;8948:3;8944:14;8937:4;8930:5;8926:16;8904:63;:::i;:::-;9021:2;9000:15;-1:-1:-1;;8996:29:1;8987:39;;;;9028:4;8983:50;;8782:257;-1:-1:-1;;8782:257:1:o;9044:185::-;9086:3;9124:5;9118:12;9139:52;9184:6;9179:3;9172:4;9165:5;9161:16;9139:52;:::i;:::-;9207:16;;;;;9044:185;-1:-1:-1;;9044:185:1:o;9838:470::-;10017:3;10055:6;10049:13;10071:53;10117:6;10112:3;10105:4;10097:6;10093:17;10071:53;:::i;:::-;10187:13;;10146:16;;;;10209:57;10187:13;10146:16;10243:4;10231:17;;10209:57;:::i;:::-;10282:20;;9838:470;-1:-1:-1;;;;9838:470:1:o;10313:1301::-;10590:3;10619:1;10652:6;10646:13;10682:3;10704:1;10732:9;10728:2;10724:18;10714:28;;10792:2;10781:9;10777:18;10814;10804:61;;10858:4;10850:6;10846:17;10836:27;;10804:61;10884:2;10932;10924:6;10921:14;10901:18;10898:38;10895:165;;;-1:-1:-1;;;10959:33:1;;11015:4;11012:1;11005:15;11045:4;10966:3;11033:17;10895:165;11076:18;11103:104;;;;11221:1;11216:320;;;;11069:467;;11103:104;-1:-1:-1;;11136:24:1;;11124:37;;11181:16;;;;-1:-1:-1;11103:104:1;;11216:320;23927:1;23920:14;;;23964:4;23951:18;;11311:1;11325:165;11339:6;11336:1;11333:13;11325:165;;;11417:14;;11404:11;;;11397:35;11460:16;;;;11354:10;;11325:165;;;11329:3;;11519:6;11514:3;11510:16;11503:23;;11069:467;;;;;;;11552:56;11577:30;11603:3;11595:6;11577:30;:::i;:::-;-1:-1:-1;;;9294:20:1;;9339:1;9330:11;;9234:113;11552:56;11545:63;10313:1301;-1:-1:-1;;;;;10313:1301:1:o;12037:488::-;-1:-1:-1;;;;;12306:15:1;;;12288:34;;12358:15;;12353:2;12338:18;;12331:43;12405:2;12390:18;;12383:34;;;12453:3;12448:2;12433:18;;12426:31;;;12231:4;;12474:45;;12499:19;;12491:6;12474:45;:::i;:::-;12466:53;12037:488;-1:-1:-1;;;;;;12037:488:1:o;12530:632::-;12701:2;12753:21;;;12823:13;;12726:18;;;12845:22;;;12672:4;;12701:2;12924:15;;;;12898:2;12883:18;;;12672:4;12967:169;12981:6;12978:1;12975:13;12967:169;;;13042:13;;13030:26;;13111:15;;;;13076:12;;;;13003:1;12996:9;12967:169;;;-1:-1:-1;13153:3:1;;12530:632;-1:-1:-1;;;;;;12530:632:1:o;13541:219::-;13690:2;13679:9;13672:21;13653:4;13710:44;13750:2;13739:9;13735:18;13727:6;13710:44;:::i;13765:399::-;13967:2;13949:21;;;14006:2;13986:18;;;13979:30;14045:34;14040:2;14025:18;;14018:62;-1:-1:-1;;;14111:2:1;14096:18;;14089:33;14154:3;14139:19;;13765:399::o;14169:343::-;14371:2;14353:21;;;14410:2;14390:18;;;14383:30;-1:-1:-1;;;14444:2:1;14429:18;;14422:49;14503:2;14488:18;;14169:343::o;14517:407::-;14719:2;14701:21;;;14758:2;14738:18;;;14731:30;14797:34;14792:2;14777:18;;14770:62;-1:-1:-1;;;14863:2:1;14848:18;;14841:41;14914:3;14899:19;;14517:407::o;14929:414::-;15131:2;15113:21;;;15170:2;15150:18;;;15143:30;15209:34;15204:2;15189:18;;15182:62;-1:-1:-1;;;15275:2:1;15260:18;;15253:48;15333:3;15318:19;;14929:414::o;20689:356::-;20891:2;20873:21;;;20910:18;;;20903:30;20969:34;20964:2;20949:18;;20942:62;21036:2;21021:18;;20689:356::o;22561:413::-;22763:2;22745:21;;;22802:2;22782:18;;;22775:30;22841:34;22836:2;22821:18;;22814:62;-1:-1:-1;;;22907:2:1;22892:18;;22885:47;22964:3;22949:19;;22561:413::o;23574:275::-;23645:2;23639:9;23710:2;23691:13;;-1:-1:-1;;23687:27:1;23675:40;;-1:-1:-1;;;;;23730:34:1;;23766:22;;;23727:62;23724:88;;;23792:18;;:::i;:::-;23828:2;23821:22;23574:275;;-1:-1:-1;23574:275:1:o;23980:128::-;24020:3;24051:1;24047:6;24044:1;24041:13;24038:39;;;24057:18;;:::i;:::-;-1:-1:-1;24093:9:1;;23980:128::o;24113:120::-;24153:1;24179;24169:35;;24184:18;;:::i;:::-;-1:-1:-1;24218:9:1;;24113:120::o;24238:168::-;24278:7;24344:1;24340;24336:6;24332:14;24329:1;24326:21;24321:1;24314:9;24307:17;24303:45;24300:71;;;24351:18;;:::i;:::-;-1:-1:-1;24391:9:1;;24238:168::o;24411:125::-;24451:4;24479:1;24476;24473:8;24470:34;;;24484:18;;:::i;:::-;-1:-1:-1;24521:9:1;;24411:125::o;24541:258::-;24613:1;24623:113;24637:6;24634:1;24631:13;24623:113;;;24713:11;;;24707:18;24694:11;;;24687:39;24659:2;24652:10;24623:113;;;24754:6;24751:1;24748:13;24745:48;;;-1:-1:-1;;24789:1:1;24771:16;;24764:27;24541:258::o;24804:380::-;24883:1;24879:12;;;;24926;;;24947:61;;25001:4;24993:6;24989:17;24979:27;;24947:61;25054:2;25046:6;25043:14;25023:18;25020:38;25017:161;;;25100:10;25095:3;25091:20;25088:1;25081:31;25135:4;25132:1;25125:15;25163:4;25160:1;25153:15;25017:161;;24804:380;;;:::o;25189:135::-;25228:3;-1:-1:-1;;25249:17:1;;25246:43;;;25269:18;;:::i;:::-;-1:-1:-1;25316:1:1;25305:13;;25189:135::o;25329:112::-;25361:1;25387;25377:35;;25392:18;;:::i;:::-;-1:-1:-1;25426:9:1;;25329:112::o;25446:127::-;25507:10;25502:3;25498:20;25495:1;25488:31;25538:4;25535:1;25528:15;25562:4;25559:1;25552:15;25578:127;25639:10;25634:3;25630:20;25627:1;25620:31;25670:4;25667:1;25660:15;25694:4;25691:1;25684:15;25710:127;25771:10;25766:3;25762:20;25759:1;25752:31;25802:4;25799:1;25792:15;25826:4;25823:1;25816:15;25842:127;25903:10;25898:3;25894:20;25891:1;25884:31;25934:4;25931:1;25924:15;25958:4;25955:1;25948:15;25974:131;-1:-1:-1;;;;;;26048:32:1;;26038:43;;26028:71;;26095:1;26092;26085:12

Swarm Source

ipfs://4b171a62352e6e0dd4414a3a346b39aa7ed90afd30eb34ccff33145d93464ee2
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.