ETH Price: $2,348.42 (-0.38%)

Token

Voxel Chimps Club (VCC)
 

Overview

Max Total Supply

426 VCC

Holders

100

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
joewmj.eth
Balance
10 VCC
0xa76b15be3bc14fdbee7c02dc79dc2bf0756353db
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:
VoxelChimpsClub

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 2021-10-31
*/

// SPDX-License-Identifier: MIT

// File: @openzeppelin/contracts/utils/math/SafeMath.sol"
pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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




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

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol
pragma solidity ^0.8.0;
/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

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

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

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

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

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

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

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

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

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

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

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


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

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

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


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

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



pragma solidity ^0.8.0;

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

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

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

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

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

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



pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

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



pragma solidity ^0.8.0;


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

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

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

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



pragma solidity ^0.8.0;

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

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

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


// File: @openzeppelin/contracts/token/ERC721/ERC721.sol
pragma solidity ^0.8.0;
/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

    // Mapping from token ID to approved address
    mapping(uint256 => address) private _tokenApprovals;

    // Mapping from owner to operator approvals
    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");
        return _balances[owner];
    }

    /**
     * @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 {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

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

        _balances[to] += 1;
        _owners[tokenId] = 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);

        _balances[owner] -= 1;
        delete _owners[tokenId];

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

        _balances[from] -= 1;
        _balances[to] += 1;
        _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 {}
}

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



pragma solidity ^0.8.0;



/**
 * @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.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

    /**
     * @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-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

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

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

    /**
     * @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` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * 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 override {
        super._beforeTokenTransfer(from, to, tokenId);

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}


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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _setOwner(_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 {
        _setOwner(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");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}


// File: VoxelChimpsClub.sol
pragma solidity ^0.8.0;

contract VoxelChimpsClub is ERC721Enumerable, Ownable {
    using SafeMath for uint256;
    using Address for address;

    string public baseURI;
    string public baseExtension = ".json";
    uint16 public counter = 215;
    uint8 public giveaway = 10;
    uint256 public price = 0.05 ether;
    uint8 public constant maxPublicPurchase = 5;
    uint16 public maxChimps = 999;
    uint16 public softLimit = 225; 

    struct LegacyChimps{
        uint8 totalChimps;
        uint8 mintedChimps;
        uint8 [] chimpsIds;
    }

    mapping(address => uint256) addressBlockBought;
    mapping(address => LegacyChimps) legacyOwner;

    constructor(string memory tokenBaseUri) ERC721("Voxel Chimps Club", "VCC")  {
        // starting tokens from 1
        counter = counter + 1;

        setBaseURI(tokenBaseUri);
        mintChimpsForGiveaway();
    }

    /**
     * Mint migrated Chimps
     */
    
    function mintMigratedChimps(uint8 numberOfTokens) public {
        require(numberOfTokens <= legacyOwner[msg.sender].chimpsIds.length, 
        "Number of chimps requested exceeds legacy chimps");
        require(legacyOwner[msg.sender].mintedChimps != legacyOwner[msg.sender].chimpsIds.length, 
        "The address is not approved to mint Migrated Chimps Or address has already minted all");
        
        for (uint8 i = legacyOwner[msg.sender].mintedChimps; i < legacyOwner[msg.sender].chimpsIds.length; i++){
            if (numberOfTokens > 0){
                _safeMint(msg.sender, legacyOwner[msg.sender].chimpsIds[i]);
                legacyOwner[msg.sender].mintedChimps = legacyOwner[msg.sender].mintedChimps + 1;
                numberOfTokens = numberOfTokens - 1;
            }
            
        }
        
    }
    
    /**
     * Mint special Chimps
     */
    function mintSpecialChimps(uint8 numberOfTokens) public onlyOwner {        
        for (uint8 i = 0; i < numberOfTokens; i++) {
             _safeMint(msg.sender, counter);
            counter = counter + 1;
        }
    }

    /**
     * mint Chimps
     */
    function mintChimps(uint8 numberOfTokens) public payable {
        uint256 supply = totalSupply();

        require(addressBlockBought[msg.sender] < block.timestamp, "Not allowed to Mint on the same Block");
        require(!Address.isContract(msg.sender),"Contracts are not allowed to mint");
        require(msg.value >= price * numberOfTokens, "Payment is Insufficient");
        require(numberOfTokens <= maxPublicPurchase, "You can mint a maximum of 5 Chimps");
        require(supply + numberOfTokens <= maxChimps, "Exceeds maximum Chimps supply" );
        require(supply + numberOfTokens <= softLimit, "Exceeds maximum Chimps Limits for current drop" );

        addressBlockBought[msg.sender] = block.timestamp;

        for(uint8 i; i < numberOfTokens; i++){
            _safeMint(msg.sender, counter);
            counter = counter + 1;
        }
    }

    /**
     * reserve Chimps for giveaways
     */
    function mintChimpsForGiveaway() public onlyOwner {
        require(giveaway > 0, "Giveaway has been minted!");

        for (uint8 i = 0; i < giveaway; i++) {
            _safeMint(msg.sender, counter);
            counter = counter + 1;
        }

        giveaway -= giveaway;
    }

    /**
     * Returns Chimps of the Caller
     */
    function chimpsOfOwner(address _owner) public view returns(uint256[] memory) {
        uint256 tokenCount = balanceOf(_owner);

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

    function setNextSoftLimit(uint16 newSoftLimit) public onlyOwner {
        softLimit = newSoftLimit;
    }

    function setPrice(uint256 newPrice) public onlyOwner {
        price = newPrice;    
    }

    function _baseURI() internal view virtual override returns (string memory) {
        return baseURI;
    }

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

    function tokenURI(uint256 tokenId)
    public
    view
    virtual
    override
    returns (string memory)
    {
        require( _exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
        
        string memory tokenIdString = uint2str(tokenId);
        string memory currentBaseURI = _baseURI();
        
        return bytes(currentBaseURI).length > 0 ? string(abi.encodePacked(currentBaseURI,  tokenIdString, baseExtension))
        : "";
    }

    function addLegacyOwner(address _ownerAddress, uint8 _totalChimps, uint8 _mintedChimps, uint8 [] memory _chimpsIds) public onlyOwner{
        legacyOwner[_ownerAddress].totalChimps = _totalChimps;
        legacyOwner[_ownerAddress].mintedChimps = _mintedChimps;
        legacyOwner[_ownerAddress].chimpsIds = _chimpsIds;
    }
     
    function chimpsOfLegacyOwner(address _ownerAddress) public view returns (uint8 [] memory chimps){
        return legacyOwner[_ownerAddress].chimpsIds;
    }
    /**
     * Withdraw Ether
     */
    function withdraw() public onlyOwner {
        uint256 balance = address(this).balance;
        require(balance > 0, "No balance to withdraw");

        (bool success, ) = msg.sender.call{value: balance}("");
        require(success, "Failed to withdraw payment");
    }

    function uint2str(uint _i) internal pure returns (string memory _uintAsString) {
        if (_i == 0) {
            return "0";
        }
        uint j = _i;
        uint len;
        while (j != 0) {
            len++;
            j /= 10;
        }
        bytes memory bstr = new bytes(len);
        uint k = len;
        while (_i != 0) {
            k = k-1;
            uint8 temp = (48 + uint8(_i - _i / 10 * 10));
            bytes1 b1 = bytes1(temp);
            bstr[k] = b1;
            _i /= 10;
        }
        return string(bstr);
    }
    
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"tokenBaseUri","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":[{"internalType":"address","name":"_ownerAddress","type":"address"},{"internalType":"uint8","name":"_totalChimps","type":"uint8"},{"internalType":"uint8","name":"_mintedChimps","type":"uint8"},{"internalType":"uint8[]","name":"_chimpsIds","type":"uint8[]"}],"name":"addLegacyOwner","outputs":[],"stateMutability":"nonpayable","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":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_ownerAddress","type":"address"}],"name":"chimpsOfLegacyOwner","outputs":[{"internalType":"uint8[]","name":"chimps","type":"uint8[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"chimpsOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"counter","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"giveaway","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxChimps","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPublicPurchase","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"numberOfTokens","type":"uint8"}],"name":"mintChimps","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintChimpsForGiveaway","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"numberOfTokens","type":"uint8"}],"name":"mintMigratedChimps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"numberOfTokens","type":"uint8"}],"name":"mintSpecialChimps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"newSoftLimit","type":"uint16"}],"name":"setNextSoftLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"softLimit","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","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":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60c06040526005608081905264173539b7b760d91b60a09081526200002891600c9190620009d8565b50600d805462ffffff1916620a00d717905566b1a2bc2ec50000600e55600f805463ffffffff191662e103e71790553480156200006457600080fd5b5060405162003ad438038062003ad4833981016040819052620000879162000ab1565b60408051808201825260118152702b37bc32b61021b434b6b8399021b63ab160791b60208083019182528351808501909452600384526256434360e81b908401528151919291620000db91600091620009d8565b508051620000f1906001906020840190620009d8565b5050506200010e620001086200015460201b60201c565b62000158565b600d54620001229061ffff16600162000bbf565b600d805461ffff191661ffff929092169190911790556200014381620001aa565b6200014d62000212565b5062000d2e565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600a546001600160a01b03163314620001f95760405162461bcd60e51b8152602060048201819052602482015260008051602062003ab483398151915260448201526064015b60405180910390fd5b80516200020e90600b906020840190620009d8565b5050565b600a546001600160a01b031633146200025d5760405162461bcd60e51b8152602060048201819052602482015260008051602062003ab48339815191526044820152606401620001f0565b600d5462010000900460ff16620002b75760405162461bcd60e51b815260206004820152601960248201527f476976656177617920686173206265656e206d696e74656421000000000000006044820152606401620001f0565b60005b600d5460ff62010000909104811690821610156200032557600d54620002e690339061ffff166200035c565b600d54620002fa9061ffff16600162000bbf565b600d805461ffff191661ffff92909216919091179055806200031c8162000cb3565b915050620002ba565b50600d805462010000900460ff1690600262000342838062000c1d565b92506101000a81548160ff021916908360ff160217905550565b6200020e8282604051806020016040528060008152506200037e60201b60201c565b6200038a8383620003f6565b6200039960008484846200054c565b620003f15760405162461bcd60e51b8152602060048201526032602482015260008051602062003a9483398151915260448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b6064820152608401620001f0565b505050565b6001600160a01b0382166200044e5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401620001f0565b6000818152600260205260409020546001600160a01b031615620004b55760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401620001f0565b620004c360008383620006b5565b6001600160a01b0382166000908152600360205260408120805460019290620004ee90849062000be8565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006200056d846001600160a01b03166200079160201b6200196c1760201c565b15620006a957604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290620005a790339089908890889060040162000b69565b602060405180830381600087803b158015620005c257600080fd5b505af1925050508015620005f5575060408051601f3d908101601f19168201909252620005f29181019062000a7e565b60015b6200068e573d80801562000626576040519150601f19603f3d011682016040523d82523d6000602084013e6200062b565b606091505b508051620006865760405162461bcd60e51b8152602060048201526032602482015260008051602062003a9483398151915260448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b6064820152608401620001f0565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050620006ad565b5060015b949350505050565b620006cd838383620003f160201b62000a0a1760201c565b6001600160a01b0383166200072b576200072581600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b62000751565b816001600160a01b0316836001600160a01b031614620007515762000751838262000797565b6001600160a01b0382166200076b57620003f18162000844565b826001600160a01b0316826001600160a01b031614620003f157620003f18282620008fe565b3b151590565b60006001620007b1846200094f60201b620012161760201c565b620007bd919062000c03565b60008381526007602052604090205490915080821462000811576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090620008589060019062000c03565b6000838152600960205260408120546008805493945090928490811062000883576200088362000d02565b906000526020600020015490508060088381548110620008a757620008a762000d02565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480620008e257620008e262000cec565b6001900381819060005260206000200160009055905550505050565b600062000916836200094f60201b620012161760201c565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b60006001600160a01b038216620009bc5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401620001f0565b506001600160a01b031660009081526003602052604090205490565b828054620009e69062000c76565b90600052602060002090601f01602090048101928262000a0a576000855562000a55565b82601f1062000a2557805160ff191683800117855562000a55565b8280016001018555821562000a55579182015b8281111562000a5557825182559160200191906001019062000a38565b5062000a6392915062000a67565b5090565b5b8082111562000a63576000815560010162000a68565b60006020828403121562000a9157600080fd5b81516001600160e01b03198116811462000aaa57600080fd5b9392505050565b60006020828403121562000ac457600080fd5b81516001600160401b038082111562000adc57600080fd5b818401915084601f83011262000af157600080fd5b81518181111562000b065762000b0662000d18565b604051601f8201601f19908116603f0116810190838211818310171562000b315762000b3162000d18565b8160405282815287602084870101111562000b4b57600080fd5b62000b5e83602083016020880162000c43565b979650505050505050565b600060018060a01b03808716835280861660208401525083604083015260806060830152825180608084015262000ba88160a085016020870162000c43565b601f01601f19169190910160a00195945050505050565b600061ffff80831681851680830382111562000bdf5762000bdf62000cd6565b01949350505050565b6000821982111562000bfe5762000bfe62000cd6565b500190565b60008282101562000c185762000c1862000cd6565b500390565b600060ff821660ff84168082101562000c3a5762000c3a62000cd6565b90039392505050565b60005b8381101562000c6057818101518382015260200162000c46565b8381111562000c70576000848401525b50505050565b600181811c9082168062000c8b57607f821691505b6020821081141562000cad57634e487b7160e01b600052602260045260246000fd5b50919050565b600060ff821660ff81141562000ccd5762000ccd62000cd6565b60010192915050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b612d568062000d3e6000396000f3fe6080604052600436106102255760003560e01c80636c0360eb11610123578063a22cb465116100ab578063c87b56dd1161006f578063c87b56dd1461064a578063db552b311461066a578063e985e9c51461068a578063f2fde38b146106d3578063f9850b72146106f357600080fd5b8063a22cb465146105a8578063b42a88c6146105c8578063b88d4fde146105e8578063b9bf064d14610608578063c66828621461063557600080fd5b80638da5cb5b116100f25780638da5cb5b1461051257806391b7f5ed1461053057806395d89b41146105505780639a7bd5fa14610565578063a035b1fe1461059257600080fd5b80636c0360eb146104a757806370a08231146104bc578063715018a6146104dc5780637cd5a676146104f157600080fd5b80632f745c59116101b157806355f804b31161017557806355f804b31461040557806361bc221a146104255780636352211e14610440578063635d2a571461046057806364a49b1b1461048057600080fd5b80632f745c59146103625780633ccfd60b1461038257806342842e0e146103975780634f6ccce7146103b757806350bb9eeb146103d757600080fd5b8063095ea7b3116101f8578063095ea7b3146102db5780630c60cc53146102fb57806318160ddd1461031057806323b872dd1461032f5780632c7125251461034f57600080fd5b806301ffc9a71461022a578063057abb0b1461025f57806306fdde0314610281578063081812fc146102a3575b600080fd5b34801561023657600080fd5b5061024a61024536600461278f565b610713565b60405190151581526020015b60405180910390f35b34801561026b57600080fd5b5061027f61027a36600461284f565b61073e565b005b34801561028d57600080fd5b506102966107d2565b6040516102569190612a16565b3480156102af57600080fd5b506102c36102be366004612836565b610864565b6040516001600160a01b039091168152602001610256565b3480156102e757600080fd5b5061027f6102f636600461267f565b6108f9565b34801561030757600080fd5b5061027f610a0f565b34801561031c57600080fd5b506008545b604051908152602001610256565b34801561033b57600080fd5b5061027f61034a36600461258b565b610b2c565b61027f61035d36600461284f565b610b5d565b34801561036e57600080fd5b5061032161037d36600461267f565b610e3d565b34801561038e57600080fd5b5061027f610ed3565b3480156103a357600080fd5b5061027f6103b236600461258b565b610fdc565b3480156103c357600080fd5b506103216103d2366004612836565b610ff7565b3480156103e357600080fd5b50600f546103f29061ffff1681565b60405161ffff9091168152602001610256565b34801561041157600080fd5b5061027f6104203660046127c9565b61108a565b34801561043157600080fd5b50600d546103f29061ffff1681565b34801561044c57600080fd5b506102c361045b366004612836565b6110c7565b34801561046c57600080fd5b5061027f61047b366004612812565b61113e565b34801561048c57600080fd5b50610495600581565b60405160ff9091168152602001610256565b3480156104b357600080fd5b50610296611188565b3480156104c857600080fd5b506103216104d7366004612536565b611216565b3480156104e857600080fd5b5061027f61129d565b3480156104fd57600080fd5b50600f546103f29062010000900461ffff1681565b34801561051e57600080fd5b50600a546001600160a01b03166102c3565b34801561053c57600080fd5b5061027f61054b366004612836565b6112d3565b34801561055c57600080fd5b50610296611302565b34801561057157600080fd5b50610585610580366004612536565b611311565b6040516102569190612997565b34801561059e57600080fd5b50610321600e5481565b3480156105b457600080fd5b5061027f6105c3366004612643565b6113b3565b3480156105d457600080fd5b5061027f6105e33660046126a9565b611478565b3480156105f457600080fd5b5061027f6106033660046125c7565b6114f1565b34801561061457600080fd5b50610628610623366004612536565b611529565b60405161025691906129db565b34801561064157600080fd5b506102966115b6565b34801561065657600080fd5b50610296610665366004612836565b6115c3565b34801561067657600080fd5b5061027f61068536600461284f565b6116a7565b34801561069657600080fd5b5061024a6106a5366004612558565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156106df57600080fd5b5061027f6106ee366004612536565b6118d1565b3480156106ff57600080fd5b50600d546104959062010000900460ff1681565b60006001600160e01b0319821663780e9d6360e01b1480610738575061073882611972565b92915050565b600a546001600160a01b031633146107715760405162461bcd60e51b815260040161076890612a7b565b60405180910390fd5b60005b8160ff168160ff1610156107ce57600d5461079490339061ffff166119c2565b600d546107a69061ffff166001612b32565b600d805461ffff191661ffff92909216919091179055806107c681612c92565b915050610774565b5050565b6060600080546107e190612c3c565b80601f016020809104026020016040519081016040528092919081815260200182805461080d90612c3c565b801561085a5780601f1061082f5761010080835404028352916020019161085a565b820191906000526020600020905b81548152906001019060200180831161083d57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166108dd5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610768565b506000908152600460205260409020546001600160a01b031690565b6000610904826110c7565b9050806001600160a01b0316836001600160a01b031614156109725760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610768565b336001600160a01b038216148061098e575061098e81336106a5565b610a005760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610768565b610a0a83836119dc565b505050565b600a546001600160a01b03163314610a395760405162461bcd60e51b815260040161076890612a7b565b600d5462010000900460ff16610a915760405162461bcd60e51b815260206004820152601960248201527f476976656177617920686173206265656e206d696e74656421000000000000006044820152606401610768565b60005b600d5460ff6201000090910481169082161015610af757600d54610abd90339061ffff166119c2565b600d54610acf9061ffff166001612b32565b600d805461ffff191661ffff9290921691909117905580610aef81612c92565b915050610a94565b50600d805462010000900460ff16906002610b128380612bed565b92506101000a81548160ff021916908360ff160217905550565b610b363382611a4a565b610b525760405162461bcd60e51b815260040161076890612ab0565b610a0a838383611b3d565b6000610b6860085490565b336000908152601060205260409020549091504211610bd75760405162461bcd60e51b815260206004820152602560248201527f4e6f7420616c6c6f77656420746f204d696e74206f6e207468652073616d6520604482015264426c6f636b60d81b6064820152608401610768565b333b15610c305760405162461bcd60e51b815260206004820152602160248201527f436f6e74726163747320617265206e6f7420616c6c6f77656420746f206d696e6044820152601d60fa1b6064820152608401610768565b8160ff16600e54610c419190612bb7565b341015610c905760405162461bcd60e51b815260206004820152601760248201527f5061796d656e7420697320496e73756666696369656e740000000000000000006044820152606401610768565b600560ff83161115610cef5760405162461bcd60e51b815260206004820152602260248201527f596f752063616e206d696e742061206d6178696d756d206f662035204368696d604482015261707360f01b6064820152608401610768565b600f5461ffff16610d0360ff841683612b58565b1115610d515760405162461bcd60e51b815260206004820152601d60248201527f45786365656473206d6178696d756d204368696d707320737570706c790000006044820152606401610768565b600f5462010000900461ffff16610d6b60ff841683612b58565b1115610dd05760405162461bcd60e51b815260206004820152602e60248201527f45786365656473206d6178696d756d204368696d7073204c696d69747320666f60448201526d0722063757272656e742064726f760941b6064820152608401610768565b3360009081526010602052604081204290555b8260ff168160ff161015610a0a57600d54610e0390339061ffff166119c2565b600d54610e159061ffff166001612b32565b600d805461ffff191661ffff9290921691909117905580610e3581612c92565b915050610de3565b6000610e4883611216565b8210610eaa5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610768565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600a546001600160a01b03163314610efd5760405162461bcd60e51b815260040161076890612a7b565b4780610f445760405162461bcd60e51b81526020600482015260166024820152754e6f2062616c616e636520746f20776974686472617760501b6044820152606401610768565b604051600090339083908381818185875af1925050503d8060008114610f86576040519150601f19603f3d011682016040523d82523d6000602084013e610f8b565b606091505b50509050806107ce5760405162461bcd60e51b815260206004820152601a60248201527f4661696c656420746f207769746864726177207061796d656e740000000000006044820152606401610768565b610a0a838383604051806020016040528060008152506114f1565b600061100260085490565b82106110655760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610768565b6008828154811061107857611078612cde565b90600052602060002001549050919050565b600a546001600160a01b031633146110b45760405162461bcd60e51b815260040161076890612a7b565b80516107ce90600b90602084019061237b565b6000818152600260205260408120546001600160a01b0316806107385760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610768565b600a546001600160a01b031633146111685760405162461bcd60e51b815260040161076890612a7b565b600f805461ffff909216620100000263ffff000019909216919091179055565b600b805461119590612c3c565b80601f01602080910402602001604051908101604052809291908181526020018280546111c190612c3c565b801561120e5780601f106111e35761010080835404028352916020019161120e565b820191906000526020600020905b8154815290600101906020018083116111f157829003601f168201915b505050505081565b60006001600160a01b0382166112815760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610768565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b031633146112c75760405162461bcd60e51b815260040161076890612a7b565b6112d16000611ce8565b565b600a546001600160a01b031633146112fd5760405162461bcd60e51b815260040161076890612a7b565b600e55565b6060600180546107e190612c3c565b6060600061131e83611216565b905060008167ffffffffffffffff81111561133b5761133b612cf4565b604051908082528060200260200182016040528015611364578160200160208202803683370190505b50905060005b828110156113ab5761137c8582610e3d565b82828151811061138e5761138e612cde565b6020908102919091010152806113a381612c77565b91505061136a565b509392505050565b6001600160a01b03821633141561140c5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610768565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600a546001600160a01b031633146114a25760405162461bcd60e51b815260040161076890612a7b565b6001600160a01b0384166000908152601160209081526040909120805460ff8581166101000261ffff199092169087161717815582516114ea926001909201918401906123ff565b5050505050565b6114fb3383611a4a565b6115175760405162461bcd60e51b815260040161076890612ab0565b61152384848484611d3a565b50505050565b6001600160a01b0381166000908152601160209081526040918290206001018054835181840281018401909452808452606093928301828280156115aa57602002820191906000526020600020906000905b825461010083900a900460ff1681526020600192830181810494850194909303909202910180841161157b5790505b50505050509050919050565b600c805461119590612c3c565b6000818152600260205260409020546060906001600160a01b03166116425760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610768565b600061164d83611d6d565b90506000611659611e96565b90506000815111611679576040518060200160405280600081525061169f565b8082600c60405160200161168f93929190612896565b6040516020818303038152906040525b949350505050565b3360009081526011602052604090206001015460ff821611156117255760405162461bcd60e51b815260206004820152603060248201527f4e756d626572206f66206368696d70732072657175657374656420657863656560448201526f6473206c6567616379206368696d707360801b6064820152608401610768565b33600090815260116020526040902060018101549054610100900460ff1614156117d55760405162461bcd60e51b815260206004820152605560248201527f5468652061646472657373206973206e6f7420617070726f76656420746f206d60448201527f696e74204d69677261746564204368696d7073204f7220616464726573732068606482015274185cc8185b1c9958591e481b5a5b9d195908185b1b605a1b608482015260a401610768565b33600090815260116020526040902054610100900460ff165b3360009081526011602052604090206001015460ff821610156107ce5760ff8216156118bf57336000818152601160205260409020600101805461186692919060ff851690811061184157611841612cde565b60009182526020918290209181049091015460ff601f9092166101000a9004166119c2565b3360009081526011602052604090205461188990610100900460ff166001612b70565b336000908152601160205260409020805460ff929092166101000261ff00199092169190911790556118bc600183612bed565b91505b806118c981612c92565b9150506117ee565b600a546001600160a01b031633146118fb5760405162461bcd60e51b815260040161076890612a7b565b6001600160a01b0381166119605760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610768565b61196981611ce8565b50565b3b151590565b60006001600160e01b031982166380ac58cd60e01b14806119a357506001600160e01b03198216635b5e139f60e01b145b8061073857506301ffc9a760e01b6001600160e01b0319831614610738565b6107ce828260405180602001604052806000815250611ea5565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611a11826110c7565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316611ac35760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610768565b6000611ace836110c7565b9050806001600160a01b0316846001600160a01b03161480611b095750836001600160a01b0316611afe84610864565b6001600160a01b0316145b8061169f57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff1661169f565b826001600160a01b0316611b50826110c7565b6001600160a01b031614611bb85760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610768565b6001600160a01b038216611c1a5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610768565b611c25838383611ed8565b611c306000826119dc565b6001600160a01b0383166000908152600360205260408120805460019290611c59908490612bd6565b90915550506001600160a01b0382166000908152600360205260408120805460019290611c87908490612b58565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b611d45848484611b3d565b611d5184848484611f90565b6115235760405162461bcd60e51b815260040161076890612a29565b606081611d915750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611dbb5780611da581612c77565b9150611db49050600a83612b95565b9150611d95565b60008167ffffffffffffffff811115611dd657611dd6612cf4565b6040519080825280601f01601f191660200182016040528015611e00576020820181803683370190505b509050815b8515611e8d57611e16600182612bd6565b90506000611e25600a88612b95565b611e3090600a612bb7565b611e3a9088612bd6565b611e45906030612b70565b905060008160f81b905080848481518110611e6257611e62612cde565b60200101906001600160f81b031916908160001a905350611e84600a89612b95565b97505050611e05565b50949350505050565b6060600b80546107e190612c3c565b611eaf838361209d565b611ebc6000848484611f90565b610a0a5760405162461bcd60e51b815260040161076890612a29565b6001600160a01b038316611f3357611f2e81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b611f56565b816001600160a01b0316836001600160a01b031614611f5657611f5683826121eb565b6001600160a01b038216611f6d57610a0a81612288565b826001600160a01b0316826001600160a01b031614610a0a57610a0a8282612337565b60006001600160a01b0384163b1561209257604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611fd490339089908890889060040161295a565b602060405180830381600087803b158015611fee57600080fd5b505af192505050801561201e575060408051601f3d908101601f1916820190925261201b918101906127ac565b60015b612078573d80801561204c576040519150601f19603f3d011682016040523d82523d6000602084013e612051565b606091505b5080516120705760405162461bcd60e51b815260040161076890612a29565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061169f565b506001949350505050565b6001600160a01b0382166120f35760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610768565b6000818152600260205260409020546001600160a01b0316156121585760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610768565b61216460008383611ed8565b6001600160a01b038216600090815260036020526040812080546001929061218d908490612b58565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600060016121f884611216565b6122029190612bd6565b600083815260076020526040902054909150808214612255576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061229a90600190612bd6565b600083815260096020526040812054600880549394509092849081106122c2576122c2612cde565b9060005260206000200154905080600883815481106122e3576122e3612cde565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061231b5761231b612cc8565b6001900381819060005260206000200160009055905550505050565b600061234283611216565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b82805461238790612c3c565b90600052602060002090601f0160209004810192826123a957600085556123ef565b82601f106123c257805160ff19168380011785556123ef565b828001600101855582156123ef579182015b828111156123ef5782518255916020019190600101906123d4565b506123fb92915061249c565b5090565b82805482825590600052602060002090601f016020900481019282156123ef5791602002820160005b8382111561246657835183826101000a81548160ff021916908360ff1602179055509260200192600101602081600001049283019260010302612428565b80156124935782816101000a81549060ff0219169055600101602081600001049283019260010302612466565b50506123fb9291505b5b808211156123fb576000815560010161249d565b600067ffffffffffffffff8311156124cb576124cb612cf4565b6124de601f8401601f1916602001612b01565b90508281528383830111156124f257600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b038116811461252057600080fd5b919050565b803560ff8116811461252057600080fd5b60006020828403121561254857600080fd5b61255182612509565b9392505050565b6000806040838503121561256b57600080fd5b61257483612509565b915061258260208401612509565b90509250929050565b6000806000606084860312156125a057600080fd5b6125a984612509565b92506125b760208501612509565b9150604084013590509250925092565b600080600080608085870312156125dd57600080fd5b6125e685612509565b93506125f460208601612509565b925060408501359150606085013567ffffffffffffffff81111561261757600080fd5b8501601f8101871361262857600080fd5b612637878235602084016124b1565b91505092959194509250565b6000806040838503121561265657600080fd5b61265f83612509565b91506020830135801515811461267457600080fd5b809150509250929050565b6000806040838503121561269257600080fd5b61269b83612509565b946020939093013593505050565b600080600080608085870312156126bf57600080fd5b6126c885612509565b935060206126d7818701612525565b93506126e560408701612525565b9250606086013567ffffffffffffffff8082111561270257600080fd5b818801915088601f83011261271657600080fd5b81358181111561272857612728612cf4565b8060051b9150612739848301612b01565b8181528481019084860184860187018d101561275457600080fd5b600095505b8386101561277e5761276a81612525565b835260019590950194918601918601612759565b50989b979a50959850505050505050565b6000602082840312156127a157600080fd5b813561255181612d0a565b6000602082840312156127be57600080fd5b815161255181612d0a565b6000602082840312156127db57600080fd5b813567ffffffffffffffff8111156127f257600080fd5b8201601f8101841361280357600080fd5b61169f848235602084016124b1565b60006020828403121561282457600080fd5b813561ffff8116811461255157600080fd5b60006020828403121561284857600080fd5b5035919050565b60006020828403121561286157600080fd5b61255182612525565b60008151808452612882816020860160208601612c10565b601f01601f19169290920160200192915050565b6000845160206128a98285838a01612c10565b8551918401916128bc8184848a01612c10565b8554920191600090600181811c90808316806128d957607f831692505b8583108114156128f757634e487b7160e01b85526022600452602485fd5b80801561290b576001811461291c57612949565b60ff19851688528388019550612949565b60008b81526020902060005b858110156129415781548a820152908401908801612928565b505083880195505b50939b9a5050505050505050505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061298d9083018461286a565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156129cf578351835292840192918401916001016129b3565b50909695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156129cf57835160ff16835292840192918401916001016129f7565b602081526000612551602083018461286a565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b604051601f8201601f1916810167ffffffffffffffff81118282101715612b2a57612b2a612cf4565b604052919050565b600061ffff808316818516808303821115612b4f57612b4f612cb2565b01949350505050565b60008219821115612b6b57612b6b612cb2565b500190565b600060ff821660ff84168060ff03821115612b8d57612b8d612cb2565b019392505050565b600082612bb257634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615612bd157612bd1612cb2565b500290565b600082821015612be857612be8612cb2565b500390565b600060ff821660ff841680821015612c0757612c07612cb2565b90039392505050565b60005b83811015612c2b578181015183820152602001612c13565b838111156115235750506000910152565b600181811c90821680612c5057607f821691505b60208210811415612c7157634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612c8b57612c8b612cb2565b5060010190565b600060ff821660ff811415612ca957612ca9612cb2565b60010192915050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461196957600080fdfea2646970667358221220dd591c0dcf9678ddbaa1dfe52a3ea4f0d90b68e858adbba8784fd57ad64cb7e864736f6c634300080700334552433732313a207472616e7366657220746f206e6f6e2045524337323152654f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657200000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d5850764241703475315675507443776a6e5679694e586669323442616a3163774c3148344b723671777074522f00000000000000000000

Deployed Bytecode

0x6080604052600436106102255760003560e01c80636c0360eb11610123578063a22cb465116100ab578063c87b56dd1161006f578063c87b56dd1461064a578063db552b311461066a578063e985e9c51461068a578063f2fde38b146106d3578063f9850b72146106f357600080fd5b8063a22cb465146105a8578063b42a88c6146105c8578063b88d4fde146105e8578063b9bf064d14610608578063c66828621461063557600080fd5b80638da5cb5b116100f25780638da5cb5b1461051257806391b7f5ed1461053057806395d89b41146105505780639a7bd5fa14610565578063a035b1fe1461059257600080fd5b80636c0360eb146104a757806370a08231146104bc578063715018a6146104dc5780637cd5a676146104f157600080fd5b80632f745c59116101b157806355f804b31161017557806355f804b31461040557806361bc221a146104255780636352211e14610440578063635d2a571461046057806364a49b1b1461048057600080fd5b80632f745c59146103625780633ccfd60b1461038257806342842e0e146103975780634f6ccce7146103b757806350bb9eeb146103d757600080fd5b8063095ea7b3116101f8578063095ea7b3146102db5780630c60cc53146102fb57806318160ddd1461031057806323b872dd1461032f5780632c7125251461034f57600080fd5b806301ffc9a71461022a578063057abb0b1461025f57806306fdde0314610281578063081812fc146102a3575b600080fd5b34801561023657600080fd5b5061024a61024536600461278f565b610713565b60405190151581526020015b60405180910390f35b34801561026b57600080fd5b5061027f61027a36600461284f565b61073e565b005b34801561028d57600080fd5b506102966107d2565b6040516102569190612a16565b3480156102af57600080fd5b506102c36102be366004612836565b610864565b6040516001600160a01b039091168152602001610256565b3480156102e757600080fd5b5061027f6102f636600461267f565b6108f9565b34801561030757600080fd5b5061027f610a0f565b34801561031c57600080fd5b506008545b604051908152602001610256565b34801561033b57600080fd5b5061027f61034a36600461258b565b610b2c565b61027f61035d36600461284f565b610b5d565b34801561036e57600080fd5b5061032161037d36600461267f565b610e3d565b34801561038e57600080fd5b5061027f610ed3565b3480156103a357600080fd5b5061027f6103b236600461258b565b610fdc565b3480156103c357600080fd5b506103216103d2366004612836565b610ff7565b3480156103e357600080fd5b50600f546103f29061ffff1681565b60405161ffff9091168152602001610256565b34801561041157600080fd5b5061027f6104203660046127c9565b61108a565b34801561043157600080fd5b50600d546103f29061ffff1681565b34801561044c57600080fd5b506102c361045b366004612836565b6110c7565b34801561046c57600080fd5b5061027f61047b366004612812565b61113e565b34801561048c57600080fd5b50610495600581565b60405160ff9091168152602001610256565b3480156104b357600080fd5b50610296611188565b3480156104c857600080fd5b506103216104d7366004612536565b611216565b3480156104e857600080fd5b5061027f61129d565b3480156104fd57600080fd5b50600f546103f29062010000900461ffff1681565b34801561051e57600080fd5b50600a546001600160a01b03166102c3565b34801561053c57600080fd5b5061027f61054b366004612836565b6112d3565b34801561055c57600080fd5b50610296611302565b34801561057157600080fd5b50610585610580366004612536565b611311565b6040516102569190612997565b34801561059e57600080fd5b50610321600e5481565b3480156105b457600080fd5b5061027f6105c3366004612643565b6113b3565b3480156105d457600080fd5b5061027f6105e33660046126a9565b611478565b3480156105f457600080fd5b5061027f6106033660046125c7565b6114f1565b34801561061457600080fd5b50610628610623366004612536565b611529565b60405161025691906129db565b34801561064157600080fd5b506102966115b6565b34801561065657600080fd5b50610296610665366004612836565b6115c3565b34801561067657600080fd5b5061027f61068536600461284f565b6116a7565b34801561069657600080fd5b5061024a6106a5366004612558565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156106df57600080fd5b5061027f6106ee366004612536565b6118d1565b3480156106ff57600080fd5b50600d546104959062010000900460ff1681565b60006001600160e01b0319821663780e9d6360e01b1480610738575061073882611972565b92915050565b600a546001600160a01b031633146107715760405162461bcd60e51b815260040161076890612a7b565b60405180910390fd5b60005b8160ff168160ff1610156107ce57600d5461079490339061ffff166119c2565b600d546107a69061ffff166001612b32565b600d805461ffff191661ffff92909216919091179055806107c681612c92565b915050610774565b5050565b6060600080546107e190612c3c565b80601f016020809104026020016040519081016040528092919081815260200182805461080d90612c3c565b801561085a5780601f1061082f5761010080835404028352916020019161085a565b820191906000526020600020905b81548152906001019060200180831161083d57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166108dd5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610768565b506000908152600460205260409020546001600160a01b031690565b6000610904826110c7565b9050806001600160a01b0316836001600160a01b031614156109725760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610768565b336001600160a01b038216148061098e575061098e81336106a5565b610a005760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610768565b610a0a83836119dc565b505050565b600a546001600160a01b03163314610a395760405162461bcd60e51b815260040161076890612a7b565b600d5462010000900460ff16610a915760405162461bcd60e51b815260206004820152601960248201527f476976656177617920686173206265656e206d696e74656421000000000000006044820152606401610768565b60005b600d5460ff6201000090910481169082161015610af757600d54610abd90339061ffff166119c2565b600d54610acf9061ffff166001612b32565b600d805461ffff191661ffff9290921691909117905580610aef81612c92565b915050610a94565b50600d805462010000900460ff16906002610b128380612bed565b92506101000a81548160ff021916908360ff160217905550565b610b363382611a4a565b610b525760405162461bcd60e51b815260040161076890612ab0565b610a0a838383611b3d565b6000610b6860085490565b336000908152601060205260409020549091504211610bd75760405162461bcd60e51b815260206004820152602560248201527f4e6f7420616c6c6f77656420746f204d696e74206f6e207468652073616d6520604482015264426c6f636b60d81b6064820152608401610768565b333b15610c305760405162461bcd60e51b815260206004820152602160248201527f436f6e74726163747320617265206e6f7420616c6c6f77656420746f206d696e6044820152601d60fa1b6064820152608401610768565b8160ff16600e54610c419190612bb7565b341015610c905760405162461bcd60e51b815260206004820152601760248201527f5061796d656e7420697320496e73756666696369656e740000000000000000006044820152606401610768565b600560ff83161115610cef5760405162461bcd60e51b815260206004820152602260248201527f596f752063616e206d696e742061206d6178696d756d206f662035204368696d604482015261707360f01b6064820152608401610768565b600f5461ffff16610d0360ff841683612b58565b1115610d515760405162461bcd60e51b815260206004820152601d60248201527f45786365656473206d6178696d756d204368696d707320737570706c790000006044820152606401610768565b600f5462010000900461ffff16610d6b60ff841683612b58565b1115610dd05760405162461bcd60e51b815260206004820152602e60248201527f45786365656473206d6178696d756d204368696d7073204c696d69747320666f60448201526d0722063757272656e742064726f760941b6064820152608401610768565b3360009081526010602052604081204290555b8260ff168160ff161015610a0a57600d54610e0390339061ffff166119c2565b600d54610e159061ffff166001612b32565b600d805461ffff191661ffff9290921691909117905580610e3581612c92565b915050610de3565b6000610e4883611216565b8210610eaa5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610768565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600a546001600160a01b03163314610efd5760405162461bcd60e51b815260040161076890612a7b565b4780610f445760405162461bcd60e51b81526020600482015260166024820152754e6f2062616c616e636520746f20776974686472617760501b6044820152606401610768565b604051600090339083908381818185875af1925050503d8060008114610f86576040519150601f19603f3d011682016040523d82523d6000602084013e610f8b565b606091505b50509050806107ce5760405162461bcd60e51b815260206004820152601a60248201527f4661696c656420746f207769746864726177207061796d656e740000000000006044820152606401610768565b610a0a838383604051806020016040528060008152506114f1565b600061100260085490565b82106110655760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610768565b6008828154811061107857611078612cde565b90600052602060002001549050919050565b600a546001600160a01b031633146110b45760405162461bcd60e51b815260040161076890612a7b565b80516107ce90600b90602084019061237b565b6000818152600260205260408120546001600160a01b0316806107385760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610768565b600a546001600160a01b031633146111685760405162461bcd60e51b815260040161076890612a7b565b600f805461ffff909216620100000263ffff000019909216919091179055565b600b805461119590612c3c565b80601f01602080910402602001604051908101604052809291908181526020018280546111c190612c3c565b801561120e5780601f106111e35761010080835404028352916020019161120e565b820191906000526020600020905b8154815290600101906020018083116111f157829003601f168201915b505050505081565b60006001600160a01b0382166112815760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610768565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b031633146112c75760405162461bcd60e51b815260040161076890612a7b565b6112d16000611ce8565b565b600a546001600160a01b031633146112fd5760405162461bcd60e51b815260040161076890612a7b565b600e55565b6060600180546107e190612c3c565b6060600061131e83611216565b905060008167ffffffffffffffff81111561133b5761133b612cf4565b604051908082528060200260200182016040528015611364578160200160208202803683370190505b50905060005b828110156113ab5761137c8582610e3d565b82828151811061138e5761138e612cde565b6020908102919091010152806113a381612c77565b91505061136a565b509392505050565b6001600160a01b03821633141561140c5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610768565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600a546001600160a01b031633146114a25760405162461bcd60e51b815260040161076890612a7b565b6001600160a01b0384166000908152601160209081526040909120805460ff8581166101000261ffff199092169087161717815582516114ea926001909201918401906123ff565b5050505050565b6114fb3383611a4a565b6115175760405162461bcd60e51b815260040161076890612ab0565b61152384848484611d3a565b50505050565b6001600160a01b0381166000908152601160209081526040918290206001018054835181840281018401909452808452606093928301828280156115aa57602002820191906000526020600020906000905b825461010083900a900460ff1681526020600192830181810494850194909303909202910180841161157b5790505b50505050509050919050565b600c805461119590612c3c565b6000818152600260205260409020546060906001600160a01b03166116425760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610768565b600061164d83611d6d565b90506000611659611e96565b90506000815111611679576040518060200160405280600081525061169f565b8082600c60405160200161168f93929190612896565b6040516020818303038152906040525b949350505050565b3360009081526011602052604090206001015460ff821611156117255760405162461bcd60e51b815260206004820152603060248201527f4e756d626572206f66206368696d70732072657175657374656420657863656560448201526f6473206c6567616379206368696d707360801b6064820152608401610768565b33600090815260116020526040902060018101549054610100900460ff1614156117d55760405162461bcd60e51b815260206004820152605560248201527f5468652061646472657373206973206e6f7420617070726f76656420746f206d60448201527f696e74204d69677261746564204368696d7073204f7220616464726573732068606482015274185cc8185b1c9958591e481b5a5b9d195908185b1b605a1b608482015260a401610768565b33600090815260116020526040902054610100900460ff165b3360009081526011602052604090206001015460ff821610156107ce5760ff8216156118bf57336000818152601160205260409020600101805461186692919060ff851690811061184157611841612cde565b60009182526020918290209181049091015460ff601f9092166101000a9004166119c2565b3360009081526011602052604090205461188990610100900460ff166001612b70565b336000908152601160205260409020805460ff929092166101000261ff00199092169190911790556118bc600183612bed565b91505b806118c981612c92565b9150506117ee565b600a546001600160a01b031633146118fb5760405162461bcd60e51b815260040161076890612a7b565b6001600160a01b0381166119605760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610768565b61196981611ce8565b50565b3b151590565b60006001600160e01b031982166380ac58cd60e01b14806119a357506001600160e01b03198216635b5e139f60e01b145b8061073857506301ffc9a760e01b6001600160e01b0319831614610738565b6107ce828260405180602001604052806000815250611ea5565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611a11826110c7565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316611ac35760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610768565b6000611ace836110c7565b9050806001600160a01b0316846001600160a01b03161480611b095750836001600160a01b0316611afe84610864565b6001600160a01b0316145b8061169f57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff1661169f565b826001600160a01b0316611b50826110c7565b6001600160a01b031614611bb85760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610768565b6001600160a01b038216611c1a5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610768565b611c25838383611ed8565b611c306000826119dc565b6001600160a01b0383166000908152600360205260408120805460019290611c59908490612bd6565b90915550506001600160a01b0382166000908152600360205260408120805460019290611c87908490612b58565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b611d45848484611b3d565b611d5184848484611f90565b6115235760405162461bcd60e51b815260040161076890612a29565b606081611d915750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611dbb5780611da581612c77565b9150611db49050600a83612b95565b9150611d95565b60008167ffffffffffffffff811115611dd657611dd6612cf4565b6040519080825280601f01601f191660200182016040528015611e00576020820181803683370190505b509050815b8515611e8d57611e16600182612bd6565b90506000611e25600a88612b95565b611e3090600a612bb7565b611e3a9088612bd6565b611e45906030612b70565b905060008160f81b905080848481518110611e6257611e62612cde565b60200101906001600160f81b031916908160001a905350611e84600a89612b95565b97505050611e05565b50949350505050565b6060600b80546107e190612c3c565b611eaf838361209d565b611ebc6000848484611f90565b610a0a5760405162461bcd60e51b815260040161076890612a29565b6001600160a01b038316611f3357611f2e81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b611f56565b816001600160a01b0316836001600160a01b031614611f5657611f5683826121eb565b6001600160a01b038216611f6d57610a0a81612288565b826001600160a01b0316826001600160a01b031614610a0a57610a0a8282612337565b60006001600160a01b0384163b1561209257604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611fd490339089908890889060040161295a565b602060405180830381600087803b158015611fee57600080fd5b505af192505050801561201e575060408051601f3d908101601f1916820190925261201b918101906127ac565b60015b612078573d80801561204c576040519150601f19603f3d011682016040523d82523d6000602084013e612051565b606091505b5080516120705760405162461bcd60e51b815260040161076890612a29565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061169f565b506001949350505050565b6001600160a01b0382166120f35760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610768565b6000818152600260205260409020546001600160a01b0316156121585760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610768565b61216460008383611ed8565b6001600160a01b038216600090815260036020526040812080546001929061218d908490612b58565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600060016121f884611216565b6122029190612bd6565b600083815260076020526040902054909150808214612255576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061229a90600190612bd6565b600083815260096020526040812054600880549394509092849081106122c2576122c2612cde565b9060005260206000200154905080600883815481106122e3576122e3612cde565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061231b5761231b612cc8565b6001900381819060005260206000200160009055905550505050565b600061234283611216565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b82805461238790612c3c565b90600052602060002090601f0160209004810192826123a957600085556123ef565b82601f106123c257805160ff19168380011785556123ef565b828001600101855582156123ef579182015b828111156123ef5782518255916020019190600101906123d4565b506123fb92915061249c565b5090565b82805482825590600052602060002090601f016020900481019282156123ef5791602002820160005b8382111561246657835183826101000a81548160ff021916908360ff1602179055509260200192600101602081600001049283019260010302612428565b80156124935782816101000a81549060ff0219169055600101602081600001049283019260010302612466565b50506123fb9291505b5b808211156123fb576000815560010161249d565b600067ffffffffffffffff8311156124cb576124cb612cf4565b6124de601f8401601f1916602001612b01565b90508281528383830111156124f257600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b038116811461252057600080fd5b919050565b803560ff8116811461252057600080fd5b60006020828403121561254857600080fd5b61255182612509565b9392505050565b6000806040838503121561256b57600080fd5b61257483612509565b915061258260208401612509565b90509250929050565b6000806000606084860312156125a057600080fd5b6125a984612509565b92506125b760208501612509565b9150604084013590509250925092565b600080600080608085870312156125dd57600080fd5b6125e685612509565b93506125f460208601612509565b925060408501359150606085013567ffffffffffffffff81111561261757600080fd5b8501601f8101871361262857600080fd5b612637878235602084016124b1565b91505092959194509250565b6000806040838503121561265657600080fd5b61265f83612509565b91506020830135801515811461267457600080fd5b809150509250929050565b6000806040838503121561269257600080fd5b61269b83612509565b946020939093013593505050565b600080600080608085870312156126bf57600080fd5b6126c885612509565b935060206126d7818701612525565b93506126e560408701612525565b9250606086013567ffffffffffffffff8082111561270257600080fd5b818801915088601f83011261271657600080fd5b81358181111561272857612728612cf4565b8060051b9150612739848301612b01565b8181528481019084860184860187018d101561275457600080fd5b600095505b8386101561277e5761276a81612525565b835260019590950194918601918601612759565b50989b979a50959850505050505050565b6000602082840312156127a157600080fd5b813561255181612d0a565b6000602082840312156127be57600080fd5b815161255181612d0a565b6000602082840312156127db57600080fd5b813567ffffffffffffffff8111156127f257600080fd5b8201601f8101841361280357600080fd5b61169f848235602084016124b1565b60006020828403121561282457600080fd5b813561ffff8116811461255157600080fd5b60006020828403121561284857600080fd5b5035919050565b60006020828403121561286157600080fd5b61255182612525565b60008151808452612882816020860160208601612c10565b601f01601f19169290920160200192915050565b6000845160206128a98285838a01612c10565b8551918401916128bc8184848a01612c10565b8554920191600090600181811c90808316806128d957607f831692505b8583108114156128f757634e487b7160e01b85526022600452602485fd5b80801561290b576001811461291c57612949565b60ff19851688528388019550612949565b60008b81526020902060005b858110156129415781548a820152908401908801612928565b505083880195505b50939b9a5050505050505050505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061298d9083018461286a565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156129cf578351835292840192918401916001016129b3565b50909695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156129cf57835160ff16835292840192918401916001016129f7565b602081526000612551602083018461286a565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b604051601f8201601f1916810167ffffffffffffffff81118282101715612b2a57612b2a612cf4565b604052919050565b600061ffff808316818516808303821115612b4f57612b4f612cb2565b01949350505050565b60008219821115612b6b57612b6b612cb2565b500190565b600060ff821660ff84168060ff03821115612b8d57612b8d612cb2565b019392505050565b600082612bb257634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615612bd157612bd1612cb2565b500290565b600082821015612be857612be8612cb2565b500390565b600060ff821660ff841680821015612c0757612c07612cb2565b90039392505050565b60005b83811015612c2b578181015183820152602001612c13565b838111156115235750506000910152565b600181811c90821680612c5057607f821691505b60208210811415612c7157634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612c8b57612c8b612cb2565b5060010190565b600060ff821660ff811415612ca957612ca9612cb2565b60010192915050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461196957600080fdfea2646970667358221220dd591c0dcf9678ddbaa1dfe52a3ea4f0d90b68e858adbba8784fd57ad64cb7e864736f6c63430008070033

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

00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d5850764241703475315675507443776a6e5679694e586669323442616a3163774c3148344b723671777074522f00000000000000000000

-----Decoded View---------------
Arg [0] : tokenBaseUri (string): ipfs://QmXPvBAp4u1VuPtCwjnVyiNXfi24Baj1cwL1H4Kr6qwptR/

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [2] : 697066733a2f2f516d5850764241703475315675507443776a6e5679694e5866
Arg [3] : 69323442616a3163774c3148344b723671777074522f00000000000000000000


Deployed Bytecode Sourcemap

50097:6115:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41620:224;;;;;;;;;;-1:-1:-1;41620:224:0;;;;;:::i;:::-;;:::i;:::-;;;9773:14:1;;9766:22;9748:41;;9736:2;9721:18;41620:224:0;;;;;;;;51943:229;;;;;;;;;;-1:-1:-1;51943:229:0;;;;;:::i;:::-;;:::i;:::-;;29512:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;31071:221::-;;;;;;;;;;-1:-1:-1;31071:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;7790:32:1;;;7772:51;;7760:2;7745:18;31071:221:0;7626:203:1;30594:411:0;;;;;;;;;;-1:-1:-1;30594:411:0;;;;;:::i;:::-;;:::i;53160:294::-;;;;;;;;;;;;;:::i;42260:113::-;;;;;;;;;;-1:-1:-1;42348:10:0;:17;42260:113;;;21877:25:1;;;21865:2;21850:18;42260:113:0;21731:177:1;31961:339:0;;;;;;;;;;-1:-1:-1;31961:339:0;;;;;:::i;:::-;;:::i;52218:879::-;;;;;;:::i;:::-;;:::i;41928:256::-;;;;;;;;;;-1:-1:-1;41928:256:0;;;;;:::i;:::-;;:::i;55346:276::-;;;;;;;;;;;;;:::i;32371:185::-;;;;;;;;;;-1:-1:-1;32371:185:0;;;;;:::i;:::-;;:::i;42450:233::-;;;;;;;;;;-1:-1:-1;42450:233:0;;;;;:::i;:::-;;:::i;50454:29::-;;;;;;;;;;-1:-1:-1;50454:29:0;;;;;;;;;;;21712:6:1;21700:19;;;21682:38;;21670:2;21655:18;50454:29:0;21538:188:1;54198:102:0;;;;;;;;;;-1:-1:-1;54198:102:0;;;;;:::i;:::-;;:::i;50297:27::-;;;;;;;;;;-1:-1:-1;50297:27:0;;;;;;;;29206:239;;;;;;;;;;-1:-1:-1;29206:239:0;;;;;:::i;:::-;;:::i;53867:107::-;;;;;;;;;;-1:-1:-1;53867:107:0;;;;;:::i;:::-;;:::i;50404:43::-;;;;;;;;;;;;50446:1;50404:43;;;;;22085:4:1;22073:17;;;22055:36;;22043:2;22028:18;50404:43:0;21913:184:1;50225:21:0;;;;;;;;;;;;;:::i;28936:208::-;;;;;;;;;;-1:-1:-1;28936:208:0;;;;;:::i;:::-;;:::i;49409:94::-;;;;;;;;;;;;;:::i;50490:29::-;;;;;;;;;;-1:-1:-1;50490:29:0;;;;;;;;;;;48758:87;;;;;;;;;;-1:-1:-1;48831:6:0;;-1:-1:-1;;;;;48831:6:0;48758:87;;53982:92;;;;;;;;;;-1:-1:-1;53982:92:0;;;;;:::i;:::-;;:::i;29681:104::-;;;;;;;;;;;;;:::i;53517:342::-;;;;;;;;;;-1:-1:-1;53517:342:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;50364:33::-;;;;;;;;;;;;;;;;31364:295;;;;;;;;;;-1:-1:-1;31364:295:0;;;;;:::i;:::-;;:::i;54798:330::-;;;;;;;;;;-1:-1:-1;54798:330:0;;;;;:::i;:::-;;:::i;32627:328::-;;;;;;;;;;-1:-1:-1;32627:328:0;;;;;:::i;:::-;;:::i;55141:158::-;;;;;;;;;;-1:-1:-1;55141:158:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;50253:37::-;;;;;;;;;;;;;:::i;54308:482::-;;;;;;;;;;-1:-1:-1;54308:482:0;;;;;:::i;:::-;;:::i;51039:846::-;;;;;;;;;;-1:-1:-1;51039:846:0;;;;;:::i;:::-;;:::i;31730:164::-;;;;;;;;;;-1:-1:-1;31730:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;31851:25:0;;;31827:4;31851:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;31730:164;49658:192;;;;;;;;;;-1:-1:-1;49658:192:0;;;;;:::i;:::-;;:::i;50331:26::-;;;;;;;;;;-1:-1:-1;50331:26:0;;;;;;;;;;;41620:224;41722:4;-1:-1:-1;;;;;;41746:50:0;;-1:-1:-1;;;41746:50:0;;:90;;;41800:36;41824:11;41800:23;:36::i;:::-;41739:97;41620:224;-1:-1:-1;;41620:224:0:o;51943:229::-;48831:6;;-1:-1:-1;;;;;48831:6:0;27121:10;48978:23;48970:68;;;;-1:-1:-1;;;48970:68:0;;;;;;;:::i;:::-;;;;;;;;;52033:7:::1;52028:137;52050:14;52046:18;;:1;:18;;;52028:137;;;52109:7;::::0;52087:30:::1;::::0;52097:10:::1;::::0;52109:7:::1;;52087:9;:30::i;:::-;52142:7;::::0;:11:::1;::::0;:7:::1;;::::0;:11:::1;:::i;:::-;52132:7;:21:::0;;-1:-1:-1;;52132:21:0::1;;::::0;;;::::1;::::0;;;::::1;::::0;;52066:3;::::1;::::0;::::1;:::i;:::-;;;;52028:137;;;;51943:229:::0;:::o;29512:100::-;29566:13;29599:5;29592:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29512:100;:::o;31071:221::-;31147:7;34554:16;;;:7;:16;;;;;;-1:-1:-1;;;;;34554:16:0;31167:73;;;;-1:-1:-1;;;31167:73:0;;16126:2:1;31167:73:0;;;16108:21:1;16165:2;16145:18;;;16138:30;16204:34;16184:18;;;16177:62;-1:-1:-1;;;16255:18:1;;;16248:42;16307:19;;31167:73:0;15924:408:1;31167:73:0;-1:-1:-1;31260:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;31260:24:0;;31071:221::o;30594:411::-;30675:13;30691:23;30706:7;30691:14;:23::i;:::-;30675:39;;30739:5;-1:-1:-1;;;;;30733:11:0;:2;-1:-1:-1;;;;;30733:11:0;;;30725:57;;;;-1:-1:-1;;;30725:57:0;;18077:2:1;30725:57:0;;;18059:21:1;18116:2;18096:18;;;18089:30;18155:34;18135:18;;;18128:62;-1:-1:-1;;;18206:18:1;;;18199:31;18247:19;;30725:57:0;17875:397:1;30725:57:0;27121:10;-1:-1:-1;;;;;30817:21:0;;;;:62;;-1:-1:-1;30842:37:0;30859:5;27121:10;31730:164;:::i;30842:37::-;30795:168;;;;-1:-1:-1;;;30795:168:0;;14519:2:1;30795:168:0;;;14501:21:1;14558:2;14538:18;;;14531:30;14597:34;14577:18;;;14570:62;14668:26;14648:18;;;14641:54;14712:19;;30795:168:0;14317:420:1;30795:168:0;30976:21;30985:2;30989:7;30976:8;:21::i;:::-;30664:341;30594:411;;:::o;53160:294::-;48831:6;;-1:-1:-1;;;;;48831:6:0;27121:10;48978:23;48970:68;;;;-1:-1:-1;;;48970:68:0;;;;;;;:::i;:::-;53229:8:::1;::::0;;;::::1;;;53221:50;;;::::0;-1:-1:-1;;;53221:50:0;;12590:2:1;53221:50:0::1;::::0;::::1;12572:21:1::0;12629:2;12609:18;;;12602:30;12668:27;12648:18;;;12641:55;12713:18;;53221:50:0::1;12388:349:1::0;53221:50:0::1;53289:7;53284:130;53306:8;::::0;::::1;::::0;;;::::1;::::0;::::1;53302:12:::0;;::::1;;53284:130;;;53358:7;::::0;53336:30:::1;::::0;53346:10:::1;::::0;53358:7:::1;;53336:9;:30::i;:::-;53391:7;::::0;:11:::1;::::0;:7:::1;;::::0;:11:::1;:::i;:::-;53381:7;:21:::0;;-1:-1:-1;;53381:21:0::1;;::::0;;;::::1;::::0;;;::::1;::::0;;53316:3;::::1;::::0;::::1;:::i;:::-;;;;53284:130;;;-1:-1:-1::0;53438:8:0::1;::::0;;;;::::1;;;::::0;::::1;53426:20;53438:8:::0;;53426:20:::1;:::i;:::-;;;;;;;;;;;;;;;;;;;;;53160:294::o:0;31961:339::-;32156:41;27121:10;32189:7;32156:18;:41::i;:::-;32148:103;;;;-1:-1:-1;;;32148:103:0;;;;;;;:::i;:::-;32264:28;32274:4;32280:2;32284:7;32264:9;:28::i;52218:879::-;52286:14;52303:13;42348:10;:17;;42260:113;52303:13;52356:10;52337:30;;;;:18;:30;;;;;;52286;;-1:-1:-1;52370:15:0;-1:-1:-1;52329:98:0;;;;-1:-1:-1;;;52329:98:0;;20159:2:1;52329:98:0;;;20141:21:1;20198:2;20178:18;;;20171:30;20237:34;20217:18;;;20210:62;-1:-1:-1;;;20288:18:1;;;20281:35;20333:19;;52329:98:0;19957:401:1;52329:98:0;52466:10;17721:20;17769:8;52438:76;;;;-1:-1:-1;;;52438:76:0;;21338:2:1;52438:76:0;;;21320:21:1;21377:2;21357:18;;;21350:30;21416:34;21396:18;;;21389:62;-1:-1:-1;;;21467:18:1;;;21460:31;21508:19;;52438:76:0;21136:397:1;52438:76:0;52554:14;52546:22;;:5;;:22;;;;:::i;:::-;52533:9;:35;;52525:71;;;;-1:-1:-1;;;52525:71:0;;11474:2:1;52525:71:0;;;11456:21:1;11513:2;11493:18;;;11486:30;11552:25;11532:18;;;11525:53;11595:18;;52525:71:0;11272:347:1;52525:71:0;50446:1;52615:35;;;;;52607:82;;;;-1:-1:-1;;;52607:82:0;;13703:2:1;52607:82:0;;;13685:21:1;13742:2;13722:18;;;13715:30;13781:34;13761:18;;;13754:62;-1:-1:-1;;;13832:18:1;;;13825:32;13874:19;;52607:82:0;13501:398:1;52607:82:0;52735:9;;;;52708:23;;;;:6;:23;:::i;:::-;:36;;52700:79;;;;-1:-1:-1;;;52700:79:0;;20980:2:1;52700:79:0;;;20962:21:1;21019:2;20999:18;;;20992:30;21058:31;21038:18;;;21031:59;21107:18;;52700:79:0;20778:353:1;52700:79:0;52825:9;;;;;;;52798:23;;;;:6;:23;:::i;:::-;:36;;52790:96;;;;-1:-1:-1;;;52790:96:0;;20565:2:1;52790:96:0;;;20547:21:1;20604:2;20584:18;;;20577:30;20643:34;20623:18;;;20616:62;-1:-1:-1;;;20694:18:1;;;20687:44;20748:19;;52790:96:0;20363:410:1;52790:96:0;52918:10;52899:30;;;;:18;:30;;;;;52932:15;52899:48;;52960:130;52977:14;52973:18;;:1;:18;;;52960:130;;;53034:7;;53012:30;;53022:10;;53034:7;;53012:9;:30::i;:::-;53067:7;;:11;;:7;;;:11;:::i;:::-;53057:7;:21;;-1:-1:-1;;53057:21:0;;;;;;;;;;;;52993:3;;;;:::i;:::-;;;;52960:130;;41928:256;42025:7;42061:23;42078:5;42061:16;:23::i;:::-;42053:5;:31;42045:87;;;;-1:-1:-1;;;42045:87:0;;10643:2:1;42045:87:0;;;10625:21:1;10682:2;10662:18;;;10655:30;10721:34;10701:18;;;10694:62;-1:-1:-1;;;10772:18:1;;;10765:41;10823:19;;42045:87:0;10441:407:1;42045:87:0;-1:-1:-1;;;;;;42150:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;41928:256::o;55346:276::-;48831:6;;-1:-1:-1;;;;;48831:6:0;27121:10;48978:23;48970:68;;;;-1:-1:-1;;;48970:68:0;;;;;;;:::i;:::-;55412:21:::1;55452:11:::0;55444:46:::1;;;::::0;-1:-1:-1;;;55444:46:0;;17726:2:1;55444:46:0::1;::::0;::::1;17708:21:1::0;17765:2;17745:18;;;17738:30;-1:-1:-1;;;17784:18:1;;;17777:52;17846:18;;55444:46:0::1;17524:346:1::0;55444:46:0::1;55522:35;::::0;55504:12:::1;::::0;55522:10:::1;::::0;55545:7;;55504:12;55522:35;55504:12;55522:35;55545:7;55522:10;:35:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55503:54;;;55576:7;55568:46;;;::::0;-1:-1:-1;;;55568:46:0;;19804:2:1;55568:46:0::1;::::0;::::1;19786:21:1::0;19843:2;19823:18;;;19816:30;19882:28;19862:18;;;19855:56;19928:18;;55568:46:0::1;19602:350:1::0;32371:185:0;32509:39;32526:4;32532:2;32536:7;32509:39;;;;;;;;;;;;:16;:39::i;42450:233::-;42525:7;42561:30;42348:10;:17;;42260:113;42561:30;42553:5;:38;42545:95;;;;-1:-1:-1;;;42545:95:0;;19391:2:1;42545:95:0;;;19373:21:1;19430:2;19410:18;;;19403:30;19469:34;19449:18;;;19442:62;-1:-1:-1;;;19520:18:1;;;19513:42;19572:19;;42545:95:0;19189:408:1;42545:95:0;42658:10;42669:5;42658:17;;;;;;;;:::i;:::-;;;;;;;;;42651:24;;42450:233;;;:::o;54198:102::-;48831:6;;-1:-1:-1;;;;;48831:6:0;27121:10;48978:23;48970:68;;;;-1:-1:-1;;;48970:68:0;;;;;;;:::i;:::-;54272:20;;::::1;::::0;:7:::1;::::0;:20:::1;::::0;::::1;::::0;::::1;:::i;29206:239::-:0;29278:7;29314:16;;;:7;:16;;;;;;-1:-1:-1;;;;;29314:16:0;29349:19;29341:73;;;;-1:-1:-1;;;29341:73:0;;15355:2:1;29341:73:0;;;15337:21:1;15394:2;15374:18;;;15367:30;15433:34;15413:18;;;15406:62;-1:-1:-1;;;15484:18:1;;;15477:39;15533:19;;29341:73:0;15153:405:1;53867:107:0;48831:6;;-1:-1:-1;;;;;48831:6:0;27121:10;48978:23;48970:68;;;;-1:-1:-1;;;48970:68:0;;;;;;;:::i;:::-;53942:9:::1;:24:::0;;::::1;::::0;;::::1;::::0;::::1;-1:-1:-1::0;;53942:24:0;;::::1;::::0;;;::::1;::::0;;53867:107::o;50225:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;28936:208::-;29008:7;-1:-1:-1;;;;;29036:19:0;;29028:74;;;;-1:-1:-1;;;29028:74:0;;14944:2:1;29028:74:0;;;14926:21:1;14983:2;14963:18;;;14956:30;15022:34;15002:18;;;14995:62;-1:-1:-1;;;15073:18:1;;;15066:40;15123:19;;29028:74:0;14742:406:1;29028:74:0;-1:-1:-1;;;;;;29120:16:0;;;;;:9;:16;;;;;;;28936:208::o;49409:94::-;48831:6;;-1:-1:-1;;;;;48831:6:0;27121:10;48978:23;48970:68;;;;-1:-1:-1;;;48970:68:0;;;;;;;:::i;:::-;49474:21:::1;49492:1;49474:9;:21::i;:::-;49409:94::o:0;53982:92::-;48831:6;;-1:-1:-1;;;;;48831:6:0;27121:10;48978:23;48970:68;;;;-1:-1:-1;;;48970:68:0;;;;;;;:::i;:::-;54046:5:::1;:16:::0;53982:92::o;29681:104::-;29737:13;29770:7;29763:14;;;;;:::i;53517:342::-;53576:16;53605:18;53626:17;53636:6;53626:9;:17::i;:::-;53605:38;;53656:25;53698:10;53684:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53684:25:0;;53656:53;;53724:9;53720:106;53739:10;53735:1;:14;53720:106;;;53784:30;53804:6;53812:1;53784:19;:30::i;:::-;53770:8;53779:1;53770:11;;;;;;;;:::i;:::-;;;;;;;;;;:44;53751:3;;;;:::i;:::-;;;;53720:106;;;-1:-1:-1;53843:8:0;53517:342;-1:-1:-1;;;53517:342:0:o;31364:295::-;-1:-1:-1;;;;;31467:24:0;;27121:10;31467:24;;31459:62;;;;-1:-1:-1;;;31459:62:0;;13349:2:1;31459:62:0;;;13331:21:1;13388:2;13368:18;;;13361:30;13427:27;13407:18;;;13400:55;13472:18;;31459:62:0;13147:349:1;31459:62:0;27121:10;31534:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;31534:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;31534:53:0;;;;;;;;;;31603:48;;9748:41:1;;;31534:42:0;;27121:10;31603:48;;9721:18:1;31603:48:0;;;;;;;31364:295;;:::o;54798:330::-;48831:6;;-1:-1:-1;;;;;48831:6:0;27121:10;48978:23;48970:68;;;;-1:-1:-1;;;48970:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;54941:26:0;::::1;;::::0;;;:11:::1;:26;::::0;;;;;;;:53;;::::1;55005:55:::0;;::::1;54941:53;55005:55;-1:-1:-1::0;;55005:55:0;;;54941:53;;::::1;55005:55:::0;::::1;::::0;;55071:49;;::::1;::::0;54941:53;55071:36;;::::1;::::0;:49;::::1;::::0;::::1;:::i;:::-;;54798:330:::0;;;;:::o;32627:328::-;32802:41;27121:10;32835:7;32802:18;:41::i;:::-;32794:103;;;;-1:-1:-1;;;32794:103:0;;;;;;;:::i;:::-;32908:39;32922:4;32928:2;32932:7;32941:5;32908:13;:39::i;:::-;32627:328;;;;:::o;55141:158::-;-1:-1:-1;;;;;55255:26:0;;;;;;:11;:26;;;;;;;;;:36;;55248:43;;;;;;;;;;;;;;;;;55214:22;;55248:43;;;55255:36;55248:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55141:158;;;:::o;50253:37::-;;;;;;;:::i;54308:482::-;34530:4;34554:16;;;:7;:16;;;;;;54406:13;;-1:-1:-1;;;;;34554:16:0;54437:77;;;;-1:-1:-1;;;54437:77:0;;17310:2:1;54437:77:0;;;17292:21:1;17349:2;17329:18;;;17322:30;17388:34;17368:18;;;17361:62;-1:-1:-1;;;17439:18:1;;;17432:45;17494:19;;54437:77:0;17108:411:1;54437:77:0;54535:27;54565:17;54574:7;54565:8;:17::i;:::-;54535:47;;54593:28;54624:10;:8;:10::i;:::-;54593:41;;54693:1;54668:14;54662:28;:32;:120;;;;;;;;;;;;;;;;;54721:14;54738:13;54753;54704:63;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54662:120;54655:127;54308:482;-1:-1:-1;;;;54308:482:0:o;51039:846::-;51145:10;51133:23;;;;:11;:23;;;;;:33;;:40;51115:58;;;;;51107:129;;;;-1:-1:-1;;;51107:129:0;;10226:2:1;51107:129:0;;;10208:21:1;10265:2;10245:18;;;10238:30;10304:34;10284:18;;;10277:62;-1:-1:-1;;;10355:18:1;;;10348:46;10411:19;;51107:129:0;10024:412:1;51107:129:0;51307:10;51295:23;;;;:11;:23;;;;;:33;;;:40;51255:36;;;;;;;:80;;51247:188;;;;-1:-1:-1;;;51247:188:0;;18479:2:1;51247:188:0;;;18461:21:1;18518:2;18498:18;;;18491:30;18557:34;18537:18;;;18530:62;18628:34;18608:18;;;18601:62;-1:-1:-1;;;18679:19:1;;;18672:52;18741:19;;51247:188:0;18277:489:1;51247:188:0;51483:10;51461:7;51471:23;;;:11;:23;;;;;:36;;;;;;51456:412;51525:10;51513:23;;;;:11;:23;;;;;:33;;:40;51509:44;;;;51456:412;;;51578:18;;;;51574:269;;51626:10;51638:23;;;;:11;:23;;;;;:33;;:36;;51616:59;;51626:10;51638:33;:36;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;51616:9;:59::i;:::-;51745:10;51733:23;;;;:11;:23;;;;;:36;:40;;:36;;;;;;:40;:::i;:::-;51706:10;51694:23;;;;:11;:23;;;;;:79;;;;;;;;;-1:-1:-1;;51694:79:0;;;;;;;;;51809:18;51694:36;51809:14;:18;:::i;:::-;51792:35;;51574:269;51555:3;;;;:::i;:::-;;;;51456:412;;49658:192;48831:6;;-1:-1:-1;;;;;48831:6:0;27121:10;48978:23;48970:68;;;;-1:-1:-1;;;48970:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;49747:22:0;::::1;49739:73;;;::::0;-1:-1:-1;;;49739:73:0;;11826:2:1;49739:73:0::1;::::0;::::1;11808:21:1::0;11865:2;11845:18;;;11838:30;11904:34;11884:18;;;11877:62;-1:-1:-1;;;11955:18:1;;;11948:36;12001:19;;49739:73:0::1;11624:402:1::0;49739:73:0::1;49823:19;49833:8;49823:9;:19::i;:::-;49658:192:::0;:::o;17398:387::-;17721:20;17769:8;;;17398:387::o;28567:305::-;28669:4;-1:-1:-1;;;;;;28706:40:0;;-1:-1:-1;;;28706:40:0;;:105;;-1:-1:-1;;;;;;;28763:48:0;;-1:-1:-1;;;28763:48:0;28706:105;:158;;;-1:-1:-1;;;;;;;;;;14507:40:0;;;28828:36;14398:157;35449:110;35525:26;35535:2;35539:7;35525:26;;;;;;;;;;;;:9;:26::i;38447:174::-;38522:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;38522:29:0;-1:-1:-1;;;;;38522:29:0;;;;;;;;:24;;38576:23;38522:24;38576:14;:23::i;:::-;-1:-1:-1;;;;;38567:46:0;;;;;;;;;;;38447:174;;:::o;34759:348::-;34852:4;34554:16;;;:7;:16;;;;;;-1:-1:-1;;;;;34554:16:0;34869:73;;;;-1:-1:-1;;;34869:73:0;;14106:2:1;34869:73:0;;;14088:21:1;14145:2;14125:18;;;14118:30;14184:34;14164:18;;;14157:62;-1:-1:-1;;;14235:18:1;;;14228:42;14287:19;;34869:73:0;13904:408:1;34869:73:0;34953:13;34969:23;34984:7;34969:14;:23::i;:::-;34953:39;;35022:5;-1:-1:-1;;;;;35011:16:0;:7;-1:-1:-1;;;;;35011:16:0;;:51;;;;35055:7;-1:-1:-1;;;;;35031:31:0;:20;35043:7;35031:11;:20::i;:::-;-1:-1:-1;;;;;35031:31:0;;35011:51;:87;;;-1:-1:-1;;;;;;31851:25:0;;;31827:4;31851:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;35066:32;31730:164;37751:578;37910:4;-1:-1:-1;;;;;37883:31:0;:23;37898:7;37883:14;:23::i;:::-;-1:-1:-1;;;;;37883:31:0;;37875:85;;;;-1:-1:-1;;;37875:85:0;;16900:2:1;37875:85:0;;;16882:21:1;16939:2;16919:18;;;16912:30;16978:34;16958:18;;;16951:62;-1:-1:-1;;;17029:18:1;;;17022:39;17078:19;;37875:85:0;16698:405:1;37875:85:0;-1:-1:-1;;;;;37979:16:0;;37971:65;;;;-1:-1:-1;;;37971:65:0;;12944:2:1;37971:65:0;;;12926:21:1;12983:2;12963:18;;;12956:30;13022:34;13002:18;;;12995:62;-1:-1:-1;;;13073:18:1;;;13066:34;13117:19;;37971:65:0;12742:400:1;37971:65:0;38049:39;38070:4;38076:2;38080:7;38049:20;:39::i;:::-;38153:29;38170:1;38174:7;38153:8;:29::i;:::-;-1:-1:-1;;;;;38195:15:0;;;;;;:9;:15;;;;;:20;;38214:1;;38195:15;:20;;38214:1;;38195:20;:::i;:::-;;;;-1:-1:-1;;;;;;;38226:13:0;;;;;;:9;:13;;;;;:18;;38243:1;;38226:13;:18;;38243:1;;38226:18;:::i;:::-;;;;-1:-1:-1;;38255:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;38255:21:0;-1:-1:-1;;;;;38255:21:0;;;;;;;;;38294:27;;38255:16;;38294:27;;;;;;;37751:578;;;:::o;49858:173::-;49933:6;;;-1:-1:-1;;;;;49950:17:0;;;-1:-1:-1;;;;;;49950:17:0;;;;;;;49983:40;;49933:6;;;49950:17;49933:6;;49983:40;;49914:16;;49983:40;49903:128;49858:173;:::o;33837:315::-;33994:28;34004:4;34010:2;34014:7;33994:9;:28::i;:::-;34041:48;34064:4;34070:2;34074:7;34083:5;34041:22;:48::i;:::-;34033:111;;;;-1:-1:-1;;;34033:111:0;;;;;;;:::i;55630:573::-;55680:27;55724:7;55720:50;;-1:-1:-1;;55748:10:0;;;;;;;;;;;;-1:-1:-1;;;55748:10:0;;;;;55630:573::o;55720:50::-;55789:2;55780:6;55821:69;55828:6;;55821:69;;55851:5;;;;:::i;:::-;;-1:-1:-1;55871:7:0;;-1:-1:-1;55876:2:0;55871:7;;:::i;:::-;;;55821:69;;;55900:17;55930:3;55920:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55920:14:0;-1:-1:-1;55900:34:0;-1:-1:-1;55954:3:0;55968:198;55975:7;;55968:198;;56003:3;56005:1;56003;:3;:::i;:::-;55999:7;-1:-1:-1;56021:10:0;56051:7;56056:2;56051;:7;:::i;:::-;:12;;56061:2;56051:12;:::i;:::-;56046:17;;:2;:17;:::i;:::-;56035:29;;:2;:29;:::i;:::-;56021:44;;56080:9;56099:4;56092:12;;56080:24;;56129:2;56119:4;56124:1;56119:7;;;;;;;;:::i;:::-;;;;:12;-1:-1:-1;;;;;56119:12:0;;;;;;;;-1:-1:-1;56146:8:0;56152:2;56146:8;;:::i;:::-;;;55984:182;;55968:198;;;-1:-1:-1;56190:4:0;55630:573;-1:-1:-1;;;;55630:573:0:o;54082:108::-;54142:13;54175:7;54168:14;;;;;:::i;35786:321::-;35916:18;35922:2;35926:7;35916:5;:18::i;:::-;35967:54;35998:1;36002:2;36006:7;36015:5;35967:22;:54::i;:::-;35945:154;;;;-1:-1:-1;;;35945:154:0;;;;;;;:::i;43296:589::-;-1:-1:-1;;;;;43502:18:0;;43498:187;;43537:40;43569:7;44712:10;:17;;44685:24;;;;:15;:24;;;;;:44;;;44740:24;;;;;;;;;;;;44608:164;43537:40;43498:187;;;43607:2;-1:-1:-1;;;;;43599:10:0;:4;-1:-1:-1;;;;;43599:10:0;;43595:90;;43626:47;43659:4;43665:7;43626:32;:47::i;:::-;-1:-1:-1;;;;;43699:16:0;;43695:183;;43732:45;43769:7;43732:36;:45::i;43695:183::-;43805:4;-1:-1:-1;;;;;43799:10:0;:2;-1:-1:-1;;;;;43799:10:0;;43795:83;;43826:40;43854:2;43858:7;43826:27;:40::i;39186:799::-;39341:4;-1:-1:-1;;;;;39362:13:0;;17721:20;17769:8;39358:620;;39398:72;;-1:-1:-1;;;39398:72:0;;-1:-1:-1;;;;;39398:36:0;;;;;:72;;27121:10;;39449:4;;39455:7;;39464:5;;39398:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39398:72:0;;;;;;;;-1:-1:-1;;39398:72:0;;;;;;;;;;;;:::i;:::-;;;39394:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39640:13:0;;39636:272;;39683:60;;-1:-1:-1;;;39683:60:0;;;;;;;:::i;39636:272::-;39858:6;39852:13;39843:6;39839:2;39835:15;39828:38;39394:529;-1:-1:-1;;;;;;39521:51:0;-1:-1:-1;;;39521:51:0;;-1:-1:-1;39514:58:0;;39358:620;-1:-1:-1;39962:4:0;39186:799;;;;;;:::o;36443:382::-;-1:-1:-1;;;;;36523:16:0;;36515:61;;;;-1:-1:-1;;;36515:61:0;;15765:2:1;36515:61:0;;;15747:21:1;;;15784:18;;;15777:30;15843:34;15823:18;;;15816:62;15895:18;;36515:61:0;15563:356:1;36515:61:0;34530:4;34554:16;;;:7;:16;;;;;;-1:-1:-1;;;;;34554:16:0;:30;36587:58;;;;-1:-1:-1;;;36587:58:0;;12233:2:1;36587:58:0;;;12215:21:1;12272:2;12252:18;;;12245:30;12311;12291:18;;;12284:58;12359:18;;36587:58:0;12031:352:1;36587:58:0;36658:45;36687:1;36691:2;36695:7;36658:20;:45::i;:::-;-1:-1:-1;;;;;36716:13:0;;;;;;:9;:13;;;;;:18;;36733:1;;36716:13;:18;;36733:1;;36716:18;:::i;:::-;;;;-1:-1:-1;;36745:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;36745:21:0;-1:-1:-1;;;;;36745:21:0;;;;;;;;36784:33;;36745:16;;;36784:33;;36745:16;;36784:33;36443:382;;:::o;45399:988::-;45665:22;45715:1;45690:22;45707:4;45690:16;:22::i;:::-;:26;;;;:::i;:::-;45727:18;45748:26;;;:17;:26;;;;;;45665:51;;-1:-1:-1;45881:28:0;;;45877:328;;-1:-1:-1;;;;;45948:18:0;;45926:19;45948:18;;;:12;:18;;;;;;;;:34;;;;;;;;;45999:30;;;;;;:44;;;46116:30;;:17;:30;;;;;:43;;;45877:328;-1:-1:-1;46301:26:0;;;;:17;:26;;;;;;;;46294:33;;;-1:-1:-1;;;;;46345:18:0;;;;;:12;:18;;;;;:34;;;;;;;46338:41;45399:988::o;46682:1079::-;46960:10;:17;46935:22;;46960:21;;46980:1;;46960:21;:::i;:::-;46992:18;47013:24;;;:15;:24;;;;;;47386:10;:26;;46935:46;;-1:-1:-1;47013:24:0;;46935:46;;47386:26;;;;;;:::i;:::-;;;;;;;;;47364:48;;47450:11;47425:10;47436;47425:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;47530:28;;;:15;:28;;;;;;;:41;;;47702:24;;;;;47695:31;47737:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;46753:1008;;;46682:1079;:::o;44186:221::-;44271:14;44288:20;44305:2;44288:16;:20::i;:::-;-1:-1:-1;;;;;44319:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;44364:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;44186:221:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:406:1;78:5;112:18;104:6;101:30;98:56;;;134:18;;:::i;:::-;172:57;217:2;196:15;;-1:-1:-1;;192:29:1;223:4;188:40;172:57;:::i;:::-;163:66;;252:6;245:5;238:21;292:3;283:6;278:3;274:16;271:25;268:45;;;309:1;306;299:12;268:45;358:6;353:3;346:4;339:5;335:16;322:43;412:1;405:4;396:6;389:5;385:18;381:29;374:40;14:406;;;;;:::o;425:173::-;493:20;;-1:-1:-1;;;;;542:31:1;;532:42;;522:70;;588:1;585;578:12;522:70;425:173;;;:::o;603:156::-;669:20;;729:4;718:16;;708:27;;698:55;;749:1;746;739:12;764:186;823:6;876:2;864:9;855:7;851:23;847:32;844:52;;;892:1;889;882:12;844:52;915:29;934:9;915:29;:::i;:::-;905:39;764:186;-1:-1:-1;;;764:186:1:o;955:260::-;1023:6;1031;1084:2;1072:9;1063:7;1059:23;1055:32;1052:52;;;1100:1;1097;1090:12;1052:52;1123:29;1142:9;1123:29;:::i;:::-;1113:39;;1171:38;1205:2;1194:9;1190:18;1171:38;:::i;:::-;1161:48;;955:260;;;;;:::o;1220:328::-;1297:6;1305;1313;1366:2;1354:9;1345:7;1341:23;1337:32;1334:52;;;1382:1;1379;1372:12;1334:52;1405:29;1424:9;1405:29;:::i;:::-;1395:39;;1453:38;1487:2;1476:9;1472:18;1453:38;:::i;:::-;1443:48;;1538:2;1527:9;1523:18;1510:32;1500:42;;1220:328;;;;;:::o;1553:666::-;1648:6;1656;1664;1672;1725:3;1713:9;1704:7;1700:23;1696:33;1693:53;;;1742:1;1739;1732:12;1693:53;1765:29;1784:9;1765:29;:::i;:::-;1755:39;;1813:38;1847:2;1836:9;1832:18;1813:38;:::i;:::-;1803:48;;1898:2;1887:9;1883:18;1870:32;1860:42;;1953:2;1942:9;1938:18;1925:32;1980:18;1972:6;1969:30;1966:50;;;2012:1;2009;2002:12;1966:50;2035:22;;2088:4;2080:13;;2076:27;-1:-1:-1;2066:55:1;;2117:1;2114;2107:12;2066:55;2140:73;2205:7;2200:2;2187:16;2182:2;2178;2174:11;2140:73;:::i;:::-;2130:83;;;1553:666;;;;;;;:::o;2224:347::-;2289:6;2297;2350:2;2338:9;2329:7;2325:23;2321:32;2318:52;;;2366:1;2363;2356:12;2318:52;2389:29;2408:9;2389:29;:::i;:::-;2379:39;;2468:2;2457:9;2453:18;2440:32;2515:5;2508:13;2501:21;2494:5;2491:32;2481:60;;2537:1;2534;2527:12;2481:60;2560:5;2550:15;;;2224:347;;;;;:::o;2576:254::-;2644:6;2652;2705:2;2693:9;2684:7;2680:23;2676:32;2673:52;;;2721:1;2718;2711:12;2673:52;2744:29;2763:9;2744:29;:::i;:::-;2734:39;2820:2;2805:18;;;;2792:32;;-1:-1:-1;;;2576:254:1:o;2835:1174::-;2940:6;2948;2956;2964;3017:3;3005:9;2996:7;2992:23;2988:33;2985:53;;;3034:1;3031;3024:12;2985:53;3057:29;3076:9;3057:29;:::i;:::-;3047:39;;3105:2;3126:36;3158:2;3147:9;3143:18;3126:36;:::i;:::-;3116:46;;3181:36;3213:2;3202:9;3198:18;3181:36;:::i;:::-;3171:46;;3268:2;3257:9;3253:18;3240:32;3291:18;3332:2;3324:6;3321:14;3318:34;;;3348:1;3345;3338:12;3318:34;3386:6;3375:9;3371:22;3361:32;;3431:7;3424:4;3420:2;3416:13;3412:27;3402:55;;3453:1;3450;3443:12;3402:55;3489:2;3476:16;3511:2;3507;3504:10;3501:36;;;3517:18;;:::i;:::-;3563:2;3560:1;3556:10;3546:20;;3586:28;3610:2;3606;3602:11;3586:28;:::i;:::-;3648:15;;;3679:12;;;;3711:11;;;3741;;;3737:20;;3734:33;-1:-1:-1;3731:53:1;;;3780:1;3777;3770:12;3731:53;3802:1;3793:10;;3812:167;3826:2;3823:1;3820:9;3812:167;;;3883:21;3900:3;3883:21;:::i;:::-;3871:34;;3844:1;3837:9;;;;;3925:12;;;;3957;;3812:167;;;-1:-1:-1;2835:1174:1;;;;-1:-1:-1;2835:1174:1;;-1:-1:-1;;;;;;;2835:1174:1:o;4014:245::-;4072:6;4125:2;4113:9;4104:7;4100:23;4096:32;4093:52;;;4141:1;4138;4131:12;4093:52;4180:9;4167:23;4199:30;4223:5;4199:30;:::i;4264:249::-;4333:6;4386:2;4374:9;4365:7;4361:23;4357:32;4354:52;;;4402:1;4399;4392:12;4354:52;4434:9;4428:16;4453:30;4477:5;4453:30;:::i;4518:450::-;4587:6;4640:2;4628:9;4619:7;4615:23;4611:32;4608:52;;;4656:1;4653;4646:12;4608:52;4696:9;4683:23;4729:18;4721:6;4718:30;4715:50;;;4761:1;4758;4751:12;4715:50;4784:22;;4837:4;4829:13;;4825:27;-1:-1:-1;4815:55:1;;4866:1;4863;4856:12;4815:55;4889:73;4954:7;4949:2;4936:16;4931:2;4927;4923:11;4889:73;:::i;4973:272::-;5031:6;5084:2;5072:9;5063:7;5059:23;5055:32;5052:52;;;5100:1;5097;5090:12;5052:52;5139:9;5126:23;5189:6;5182:5;5178:18;5171:5;5168:29;5158:57;;5211:1;5208;5201:12;5250:180;5309:6;5362:2;5350:9;5341:7;5337:23;5333:32;5330:52;;;5378:1;5375;5368:12;5330:52;-1:-1:-1;5401:23:1;;5250:180;-1:-1:-1;5250:180:1:o;5435:182::-;5492:6;5545:2;5533:9;5524:7;5520:23;5516:32;5513:52;;;5561:1;5558;5551:12;5513:52;5584:27;5601:9;5584:27;:::i;5622:257::-;5663:3;5701:5;5695:12;5728:6;5723:3;5716:19;5744:63;5800:6;5793:4;5788:3;5784:14;5777:4;5770:5;5766:16;5744:63;:::i;:::-;5861:2;5840:15;-1:-1:-1;;5836:29:1;5827:39;;;;5868:4;5823:50;;5622:257;-1:-1:-1;;5622:257:1:o;5884:1527::-;6108:3;6146:6;6140:13;6172:4;6185:51;6229:6;6224:3;6219:2;6211:6;6207:15;6185:51;:::i;:::-;6299:13;;6258:16;;;;6321:55;6299:13;6258:16;6343:15;;;6321:55;:::i;:::-;6465:13;;6398:20;;;6438:1;;6525;6547:18;;;;6600;;;;6627:93;;6705:4;6695:8;6691:19;6679:31;;6627:93;6768:2;6758:8;6755:16;6735:18;6732:40;6729:167;;;-1:-1:-1;;;6795:33:1;;6851:4;6848:1;6841:15;6881:4;6802:3;6869:17;6729:167;6912:18;6939:110;;;;7063:1;7058:328;;;;6905:481;;6939:110;-1:-1:-1;;6974:24:1;;6960:39;;7019:20;;;;-1:-1:-1;6939:110:1;;7058:328;22455:1;22448:14;;;22492:4;22479:18;;7153:1;7167:169;7181:8;7178:1;7175:15;7167:169;;;7263:14;;7248:13;;;7241:37;7306:16;;;;7198:10;;7167:169;;;7171:3;;7367:8;7360:5;7356:20;7349:27;;6905:481;-1:-1:-1;7402:3:1;;5884:1527;-1:-1:-1;;;;;;;;;;;5884:1527:1:o;7834:488::-;-1:-1:-1;;;;;8103:15:1;;;8085:34;;8155:15;;8150:2;8135:18;;8128:43;8202:2;8187:18;;8180:34;;;8250:3;8245:2;8230:18;;8223:31;;;8028:4;;8271:45;;8296:19;;8288:6;8271:45;:::i;:::-;8263:53;7834:488;-1:-1:-1;;;;;;7834:488:1:o;8327:632::-;8498:2;8550:21;;;8620:13;;8523:18;;;8642:22;;;8469:4;;8498:2;8721:15;;;;8695:2;8680:18;;;8469:4;8764:169;8778:6;8775:1;8772:13;8764:169;;;8839:13;;8827:26;;8908:15;;;;8873:12;;;;8800:1;8793:9;8764:169;;;-1:-1:-1;8950:3:1;;8327:632;-1:-1:-1;;;;;;8327:632:1:o;8964:639::-;9131:2;9183:21;;;9253:13;;9156:18;;;9275:22;;;9102:4;;9131:2;9354:15;;;;9328:2;9313:18;;;9102:4;9397:180;9411:6;9408:1;9405:13;9397:180;;;9476:13;;9491:4;9472:24;9460:37;;9552:15;;;;9517:12;;;;9433:1;9426:9;9397:180;;9800:219;9949:2;9938:9;9931:21;9912:4;9969:44;10009:2;9998:9;9994:18;9986:6;9969:44;:::i;10853:414::-;11055:2;11037:21;;;11094:2;11074:18;;;11067:30;11133:34;11128:2;11113:18;;11106:62;-1:-1:-1;;;11199:2:1;11184:18;;11177:48;11257:3;11242:19;;10853:414::o;16337:356::-;16539:2;16521:21;;;16558:18;;;16551:30;16617:34;16612:2;16597:18;;16590:62;16684:2;16669:18;;16337:356::o;18771:413::-;18973:2;18955:21;;;19012:2;18992:18;;;18985:30;19051:34;19046:2;19031:18;;19024:62;-1:-1:-1;;;19117:2:1;19102:18;;19095:47;19174:3;19159:19;;18771:413::o;22102:275::-;22173:2;22167:9;22238:2;22219:13;;-1:-1:-1;;22215:27:1;22203:40;;22273:18;22258:34;;22294:22;;;22255:62;22252:88;;;22320:18;;:::i;:::-;22356:2;22349:22;22102:275;;-1:-1:-1;22102:275:1:o;22508:224::-;22547:3;22575:6;22608:2;22605:1;22601:10;22638:2;22635:1;22631:10;22669:3;22665:2;22661:12;22656:3;22653:21;22650:47;;;22677:18;;:::i;:::-;22713:13;;22508:224;-1:-1:-1;;;;22508:224:1:o;22737:128::-;22777:3;22808:1;22804:6;22801:1;22798:13;22795:39;;;22814:18;;:::i;:::-;-1:-1:-1;22850:9:1;;22737:128::o;22870:204::-;22908:3;22944:4;22941:1;22937:12;22976:4;22973:1;22969:12;23011:3;23005:4;23001:14;22996:3;22993:23;22990:49;;;23019:18;;:::i;:::-;23055:13;;22870:204;-1:-1:-1;;;22870:204:1:o;23079:217::-;23119:1;23145;23135:132;;23189:10;23184:3;23180:20;23177:1;23170:31;23224:4;23221:1;23214:15;23252:4;23249:1;23242:15;23135:132;-1:-1:-1;23281:9:1;;23079:217::o;23301:168::-;23341:7;23407:1;23403;23399:6;23395:14;23392:1;23389:21;23384:1;23377:9;23370:17;23366:45;23363:71;;;23414:18;;:::i;:::-;-1:-1:-1;23454:9:1;;23301:168::o;23474:125::-;23514:4;23542:1;23539;23536:8;23533:34;;;23547:18;;:::i;:::-;-1:-1:-1;23584:9:1;;23474:125::o;23604:195::-;23642:4;23679;23676:1;23672:12;23711:4;23708:1;23704:12;23736:3;23731;23728:12;23725:38;;;23743:18;;:::i;:::-;23780:13;;;23604:195;-1:-1:-1;;;23604:195:1:o;23804:258::-;23876:1;23886:113;23900:6;23897:1;23894:13;23886:113;;;23976:11;;;23970:18;23957:11;;;23950:39;23922:2;23915:10;23886:113;;;24017:6;24014:1;24011:13;24008:48;;;-1:-1:-1;;24052:1:1;24034:16;;24027:27;23804:258::o;24067:380::-;24146:1;24142:12;;;;24189;;;24210:61;;24264:4;24256:6;24252:17;24242:27;;24210:61;24317:2;24309:6;24306:14;24286:18;24283:38;24280:161;;;24363:10;24358:3;24354:20;24351:1;24344:31;24398:4;24395:1;24388:15;24426:4;24423:1;24416:15;24280:161;;24067:380;;;:::o;24452:135::-;24491:3;-1:-1:-1;;24512:17:1;;24509:43;;;24532:18;;:::i;:::-;-1:-1:-1;24579:1:1;24568:13;;24452:135::o;24592:175::-;24629:3;24673:4;24666:5;24662:16;24702:4;24693:7;24690:17;24687:43;;;24710:18;;:::i;:::-;24759:1;24746:15;;24592:175;-1:-1:-1;;24592:175:1:o;24772:127::-;24833:10;24828:3;24824:20;24821:1;24814:31;24864:4;24861:1;24854:15;24888:4;24885:1;24878:15;24904:127;24965:10;24960:3;24956:20;24953:1;24946:31;24996:4;24993:1;24986:15;25020:4;25017:1;25010:15;25036:127;25097:10;25092:3;25088:20;25085:1;25078:31;25128:4;25125:1;25118:15;25152:4;25149:1;25142:15;25168:127;25229:10;25224:3;25220:20;25217:1;25210:31;25260:4;25257:1;25250:15;25284:4;25281:1;25274:15;25300:131;-1:-1:-1;;;;;;25374:32:1;;25364:43;;25354:71;;25421:1;25418;25411:12

Swarm Source

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