ETH Price: $3,236.11 (-0.57%)
Gas: 1 Gwei

Token

SquareUp (SQU)
 

Overview

Max Total Supply

250 SQU

Holders

186

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 SQU
0x178be1df23dd60bb1d5b01cdcb002e12c65c0041
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:
SquareUpContest

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, Unlicense license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-11-23
*/

// SPDX-License-Identifier: UNLICENSED
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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


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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must 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 Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

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

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


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


// OpenZeppelin Contracts (last updated v4.6.0) (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 `IERC721Receiver.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}


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


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

pragma solidity ^0.8.0;

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

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

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


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


// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @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
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 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/utils/[email protected]


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

pragma solidity ^0.8.0;

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

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


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


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

pragma solidity ^0.8.0;

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

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

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

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

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


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


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

pragma solidity ^0.8.0;

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


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


// OpenZeppelin Contracts (last updated v4.6.0) (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 overridden 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 {
        _setApprovalForAll(_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 || isApprovedForAll(owner, spender) || getApproved(tokenId) == 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);

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

        _afterTokenTransfer(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 from incorrect owner");
        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);

        _afterTokenTransfer(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 Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

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

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

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


// File @chainlink/contracts/src/v0.8/interfaces/[email protected]


pragma solidity ^0.8.0;

interface VRFCoordinatorV2Interface {
  /**
   * @notice Get configuration relevant for making requests
   * @return minimumRequestConfirmations global min for request confirmations
   * @return maxGasLimit global max for request gas limit
   * @return s_provingKeyHashes list of registered key hashes
   */
  function getRequestConfig()
    external
    view
    returns (
      uint16,
      uint32,
      bytes32[] memory
    );

  /**
   * @notice Request a set of random words.
   * @param keyHash - Corresponds to a particular oracle job which uses
   * that key for generating the VRF proof. Different keyHash's have different gas price
   * ceilings, so you can select a specific one to bound your maximum per request cost.
   * @param subId  - The ID of the VRF subscription. Must be funded
   * with the minimum subscription balance required for the selected keyHash.
   * @param minimumRequestConfirmations - How many blocks you'd like the
   * oracle to wait before responding to the request. See SECURITY CONSIDERATIONS
   * for why you may want to request more. The acceptable range is
   * [minimumRequestBlockConfirmations, 200].
   * @param callbackGasLimit - How much gas you'd like to receive in your
   * fulfillRandomWords callback. Note that gasleft() inside fulfillRandomWords
   * may be slightly less than this amount because of gas used calling the function
   * (argument decoding etc.), so you may need to request slightly more than you expect
   * to have inside fulfillRandomWords. The acceptable range is
   * [0, maxGasLimit]
   * @param numWords - The number of uint256 random values you'd like to receive
   * in your fulfillRandomWords callback. Note these numbers are expanded in a
   * secure way by the VRFCoordinator from a single random value supplied by the oracle.
   * @return requestId - A unique identifier of the request. Can be used to match
   * a request to a response in fulfillRandomWords.
   */
  function requestRandomWords(
    bytes32 keyHash,
    uint64 subId,
    uint16 minimumRequestConfirmations,
    uint32 callbackGasLimit,
    uint32 numWords
  ) external returns (uint256 requestId);

  /**
   * @notice Create a VRF subscription.
   * @return subId - A unique subscription id.
   * @dev You can manage the consumer set dynamically with addConsumer/removeConsumer.
   * @dev Note to fund the subscription, use transferAndCall. For example
   * @dev  LINKTOKEN.transferAndCall(
   * @dev    address(COORDINATOR),
   * @dev    amount,
   * @dev    abi.encode(subId));
   */
  function createSubscription() external returns (uint64 subId);

  /**
   * @notice Get a VRF subscription.
   * @param subId - ID of the subscription
   * @return balance - LINK balance of the subscription in juels.
   * @return reqCount - number of requests for this subscription, determines fee tier.
   * @return owner - owner of the subscription.
   * @return consumers - list of consumer address which are able to use this subscription.
   */
  function getSubscription(uint64 subId)
    external
    view
    returns (
      uint96 balance,
      uint64 reqCount,
      address owner,
      address[] memory consumers
    );

  /**
   * @notice Request subscription owner transfer.
   * @param subId - ID of the subscription
   * @param newOwner - proposed new owner of the subscription
   */
  function requestSubscriptionOwnerTransfer(uint64 subId, address newOwner) external;

  /**
   * @notice Request subscription owner transfer.
   * @param subId - ID of the subscription
   * @dev will revert if original owner of subId has
   * not requested that msg.sender become the new owner.
   */
  function acceptSubscriptionOwnerTransfer(uint64 subId) external;

  /**
   * @notice Add a consumer to a VRF subscription.
   * @param subId - ID of the subscription
   * @param consumer - New consumer which can use the subscription
   */
  function addConsumer(uint64 subId, address consumer) external;

  /**
   * @notice Remove a consumer from a VRF subscription.
   * @param subId - ID of the subscription
   * @param consumer - Consumer to remove from the subscription
   */
  function removeConsumer(uint64 subId, address consumer) external;

  /**
   * @notice Cancel a subscription
   * @param subId - ID of the subscription
   * @param to - Where to send the remaining LINK to
   */
  function cancelSubscription(uint64 subId, address to) external;
}


// File @chainlink/contracts/src/v0.8/[email protected]


pragma solidity ^0.8.4;

/** ****************************************************************************
 * @notice Interface for contracts using VRF randomness
 * *****************************************************************************
 * @dev PURPOSE
 *
 * @dev Reggie the Random Oracle (not his real job) wants to provide randomness
 * @dev to Vera the verifier in such a way that Vera can be sure he's not
 * @dev making his output up to suit himself. Reggie provides Vera a public key
 * @dev to which he knows the secret key. Each time Vera provides a seed to
 * @dev Reggie, he gives back a value which is computed completely
 * @dev deterministically from the seed and the secret key.
 *
 * @dev Reggie provides a proof by which Vera can verify that the output was
 * @dev correctly computed once Reggie tells it to her, but without that proof,
 * @dev the output is indistinguishable to her from a uniform random sample
 * @dev from the output space.
 *
 * @dev The purpose of this contract is to make it easy for unrelated contracts
 * @dev to talk to Vera the verifier about the work Reggie is doing, to provide
 * @dev simple access to a verifiable source of randomness. It ensures 2 things:
 * @dev 1. The fulfillment came from the VRFCoordinator
 * @dev 2. The consumer contract implements fulfillRandomWords.
 * *****************************************************************************
 * @dev USAGE
 *
 * @dev Calling contracts must inherit from VRFConsumerBase, and can
 * @dev initialize VRFConsumerBase's attributes in their constructor as
 * @dev shown:
 *
 * @dev   contract VRFConsumer {
 * @dev     constructor(<other arguments>, address _vrfCoordinator, address _link)
 * @dev       VRFConsumerBase(_vrfCoordinator) public {
 * @dev         <initialization with other arguments goes here>
 * @dev       }
 * @dev   }
 *
 * @dev The oracle will have given you an ID for the VRF keypair they have
 * @dev committed to (let's call it keyHash). Create subscription, fund it
 * @dev and your consumer contract as a consumer of it (see VRFCoordinatorInterface
 * @dev subscription management functions).
 * @dev Call requestRandomWords(keyHash, subId, minimumRequestConfirmations,
 * @dev callbackGasLimit, numWords),
 * @dev see (VRFCoordinatorInterface for a description of the arguments).
 *
 * @dev Once the VRFCoordinator has received and validated the oracle's response
 * @dev to your request, it will call your contract's fulfillRandomWords method.
 *
 * @dev The randomness argument to fulfillRandomWords is a set of random words
 * @dev generated from your requestId and the blockHash of the request.
 *
 * @dev If your contract could have concurrent requests open, you can use the
 * @dev requestId returned from requestRandomWords to track which response is associated
 * @dev with which randomness request.
 * @dev See "SECURITY CONSIDERATIONS" for principles to keep in mind,
 * @dev if your contract could have multiple requests in flight simultaneously.
 *
 * @dev Colliding `requestId`s are cryptographically impossible as long as seeds
 * @dev differ.
 *
 * *****************************************************************************
 * @dev SECURITY CONSIDERATIONS
 *
 * @dev A method with the ability to call your fulfillRandomness method directly
 * @dev could spoof a VRF response with any random value, so it's critical that
 * @dev it cannot be directly called by anything other than this base contract
 * @dev (specifically, by the VRFConsumerBase.rawFulfillRandomness method).
 *
 * @dev For your users to trust that your contract's random behavior is free
 * @dev from malicious interference, it's best if you can write it so that all
 * @dev behaviors implied by a VRF response are executed *during* your
 * @dev fulfillRandomness method. If your contract must store the response (or
 * @dev anything derived from it) and use it later, you must ensure that any
 * @dev user-significant behavior which depends on that stored value cannot be
 * @dev manipulated by a subsequent VRF request.
 *
 * @dev Similarly, both miners and the VRF oracle itself have some influence
 * @dev over the order in which VRF responses appear on the blockchain, so if
 * @dev your contract could have multiple VRF requests in flight simultaneously,
 * @dev you must ensure that the order in which the VRF responses arrive cannot
 * @dev be used to manipulate your contract's user-significant behavior.
 *
 * @dev Since the block hash of the block which contains the requestRandomness
 * @dev call is mixed into the input to the VRF *last*, a sufficiently powerful
 * @dev miner could, in principle, fork the blockchain to evict the block
 * @dev containing the request, forcing the request to be included in a
 * @dev different block with a different hash, and therefore a different input
 * @dev to the VRF. However, such an attack would incur a substantial economic
 * @dev cost. This cost scales with the number of blocks the VRF oracle waits
 * @dev until it calls responds to a request. It is for this reason that
 * @dev that you can signal to an oracle you'd like them to wait longer before
 * @dev responding to the request (however this is not enforced in the contract
 * @dev and so remains effective only in the case of unmodified oracle software).
 */
abstract contract VRFConsumerBaseV2 {
  error OnlyCoordinatorCanFulfill(address have, address want);
  address private immutable vrfCoordinator;

  /**
   * @param _vrfCoordinator address of VRFCoordinator contract
   */
  constructor(address _vrfCoordinator) {
    vrfCoordinator = _vrfCoordinator;
  }

  /**
   * @notice fulfillRandomness handles the VRF response. Your contract must
   * @notice implement it. See "SECURITY CONSIDERATIONS" above for important
   * @notice principles to keep in mind when implementing your fulfillRandomness
   * @notice method.
   *
   * @dev VRFConsumerBaseV2 expects its subcontracts to have a method with this
   * @dev signature, and will call it once it has verified the proof
   * @dev associated with the randomness. (It is triggered via a call to
   * @dev rawFulfillRandomness, below.)
   *
   * @param requestId The Id initially returned by requestRandomness
   * @param randomWords the VRF output expanded to the requested number of words
   */
  function fulfillRandomWords(uint256 requestId, uint256[] memory randomWords) internal virtual;

  // rawFulfillRandomness is called by VRFCoordinator when it receives a valid VRF
  // proof. rawFulfillRandomness then calls fulfillRandomness, after validating
  // the origin of the call
  function rawFulfillRandomWords(uint256 requestId, uint256[] memory randomWords) external {
    if (msg.sender != vrfCoordinator) {
      revert OnlyCoordinatorCanFulfill(msg.sender, vrfCoordinator);
    }
    fulfillRandomWords(requestId, randomWords);
  }
}


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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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


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


// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}


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


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

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}


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


// OpenZeppelin Contracts (last updated v4.6.0) (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

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

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}


// File contracts/SquareUpContest.sol


pragma solidity ^0.8.0;
contract SquareUpContest is ERC721, VRFConsumerBaseV2, Ownable, ReentrancyGuard {
  using Counters for Counters.Counter;
  Counters.Counter public tokenIds;
  //link stuff
  VRFCoordinatorV2Interface COORDINATOR;
  uint64 public LinkSubScriptionId;
  address public VrfCoordinatorAddress;
  bytes32 public KeyHash;
  uint32 constant CallbackGasLimit = 300000;
  uint16 constant RequestConfirmations = 5;
  uint32 constant NumWords = 1;
  uint256[] public LinkRandomWords;
  uint256 public LinkRandomOffset;
  uint256 public RequestId;
  //global settings
  uint256 public MaxTickets;
  uint256 public MintFee;
  string public ContestDescription;
  bool public isMintPhase = true;
  bool public isGamePhase = false;
  string public BaselineURI;
  string public constant BaseExtension = ".json";
  uint constant private MaxTicketsPerMint = 1;
  //timestamp of when mint is allowed to begin
  uint256 public dtMintStartWhitelist;
  uint256 public dtMintStartPublic;
  struct Payout {
    uint256 token;
    uint256 amount;
  }
  struct PayoutSet {
    uint256 amount;
    uint time;
  }
  mapping(uint256 => PayoutSet) public PayoutPendingWithdrawls;
  mapping(address=> bool) public WhitelistClaimed;
  uint256[] public TokenIdWinners;
  ///events
  event PayoutsSet(uint256 indexed tokenId, uint256 indexed amount);
  event PayoutWithdraw(uint256 indexed tokenId, address indexed user, uint256 indexed amount);
  event ReceivedEth(uint256 amount);
  //whitelisting
  bytes32 public MerkleRoot;

  constructor(
    uint64 _linkSubscriptionId,
    address _vrfCoordinatorAddress,
    bytes32 _keyHash,
    string memory _baselineURIMintPhase,
    uint256 _maxTickets,
    uint256 _mintFee,
    uint256 _dtMintStartWhitelist,
    uint256 _dtMintStartPublic,
    bytes32 _merkleRoot,
    string memory _contestDescription
    ) VRFConsumerBaseV2 (_vrfCoordinatorAddress) ERC721("SquareUp", "SQU") {
    COORDINATOR = VRFCoordinatorV2Interface(_vrfCoordinatorAddress);
    LinkSubScriptionId = _linkSubscriptionId;
    VrfCoordinatorAddress = _vrfCoordinatorAddress;
    KeyHash = _keyHash;
    BaselineURI = _baselineURIMintPhase;
    MaxTickets = _maxTickets;
    MintFee = _mintFee;
    dtMintStartWhitelist = _dtMintStartWhitelist;
    dtMintStartPublic = _dtMintStartPublic;
    MerkleRoot = _merkleRoot;
    ContestDescription = _contestDescription;
  }

  function mintTicket(uint quantity, address sender) private {
    for (uint32 i = 0; i < quantity; i++) {
      tokenIds.increment();
      uint256 newItemId = tokenIds.current();
      _mint(sender, newItemId);
    }
  }

  function mintCheck(uint quantity, uint amount, bool isWhitelist) private view {
    require(isMintPhase, "Mint phase is off");
    require(quantity > 0, "Cant mint 0 tickets");
    if (isWhitelist) {
      require(quantity <= MaxTicketsPerMint, "Can't mint this many tickets in one transaction");
    }
    else {
      require(quantity <= 10, "Can't mint this many tickets in one transaction");
    }
    require(tokenIds.current() + quantity <= MaxTickets, "Can't mint more than the total number of available tickets.");
    require(amount >= MintFee * quantity, "Not enough funds");
  }

  function mintTicketWhitelist(uint quantity, bytes32[] calldata _merkleProof) public payable nonReentrant {
    require(dtMintStartWhitelist <= block.timestamp, "Can't mint yet. Try again in a few seconds.");
    require(WhitelistClaimed[msg.sender] == false, "Whitelist can't mint more than one ticket");
    mintCheck(quantity, msg.value, true);
    bytes32 leaf = keccak256((abi.encodePacked(msg.sender)));
    require(MerkleProof.verify(_merkleProof, MerkleRoot, leaf), "Not on the whitelist");
    WhitelistClaimed[msg.sender] = true;
    mintTicket(quantity, msg.sender);

  }

  function mintTicketPublic(uint quantity) public payable nonReentrant {
    require(dtMintStartPublic <= block.timestamp, "Can't mint yet. Try again in a few seconds.");
    mintCheck(quantity, msg.value, false);
    mintTicket(quantity, msg.sender);
  }

  function setBaseURIGamePhase(string memory _baseUriNew) public onlyOwner {
    require(!isGamePhase, "Cannot switch team lists");
    require(LinkRandomWords.length > 0, "Cannot set base uri without chainlink random words");
    BaselineURI = _baseUriNew;
    isGamePhase = true;
  }

  function setMintPhaseOff() external onlyOwner() {
    require(isMintPhase, "Mint phase is off");
    isMintPhase = false;
  }

  function totalSupply() external view returns (uint256) {
    return tokenIds.current();
  }

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

  function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
    require(_exists(tokenId), "query for nonexistent token");
    string memory baseURI = _baseURI();
    if (!isGamePhase) {
      return baseURI;
    }
    uint256 offset = offsetCalcURI(tokenId);
    string memory uri = string(abi.encodePacked(baseURI, Strings.toString(offset)));
    return string(abi.encodePacked(uri, BaseExtension));
  }

  function offsetCalcURI(uint256 tokenId) public view returns (uint256) {
    require(_exists(tokenId), "query for nonexistent token");
    require(LinkRandomWords.length > 0, "link random words doesn't exist");
    return (LinkRandomWords[0] + tokenId) % tokenIds.current() + 1; //from 1 to # tickets minted
  }

  function _beforeTokenTransfer(
      address from,
      address to,
      uint256 tokenId
  ) internal virtual override(ERC721) {
      require(TokenIdWinners.length == 0, "No transfers once payouts are set");
      super._beforeTokenTransfer(from, to, tokenId);
  }


  function setMintStartTime(bool isPublicTime, uint256 _newTime) external onlyOwner{
      if (isPublicTime) {
        dtMintStartPublic = _newTime;
      }
      else {
        dtMintStartWhitelist = _newTime;
      }
  }

  function setGasLaneLink(bytes32 _gasLane) external onlyOwner {
    KeyHash = _gasLane;
  }

  function requestRandomWords() external onlyOwner {
    require(!isMintPhase, "Teams cannot be set during the mint phase");
    require(LinkRandomWords.length == 0, "Random words can only be set once");
    require(tokenIds.current() > 0, "Must have teams to shuffle");
    RequestId = COORDINATOR.requestRandomWords(
      KeyHash,
      LinkSubScriptionId,
      RequestConfirmations,
      CallbackGasLimit,
      NumWords
    );
  }

  function fulfillRandomWords(
    uint256, /* requestId */
    uint256[] memory randomWords
  ) internal override {
    require(!isMintPhase, "Teams cannot be set during the mint phase");
    LinkRandomWords = randomWords;
  }

  function randomWordsGet() external view returns (uint256[] memory) {
    return LinkRandomWords;
  }

  function setPayout(Payout calldata _payout) external onlyOwner {
    require(_exists(_payout.token), "query for nonexistent token");
    require(PayoutPendingWithdrawls[_payout.token].amount == 0 && PayoutPendingWithdrawls[_payout.token].time == 0, "Payout already set in the past");
    require(isGamePhase, "Must be in game phase");
    uint timeNow = block.timestamp;
    PayoutSet memory payoutSet = PayoutSet(_payout.amount, timeNow);
    PayoutPendingWithdrawls[_payout.token] = payoutSet;
    TokenIdWinners.push(_payout.token);
    emit PayoutsSet(_payout.token, _payout.amount);
  }

  function withdrawPayout(uint256 _tokenId) external payable nonReentrant {
    require(_exists(_tokenId), "query for nonexistent token");
    require(ownerOf(_tokenId) == msg.sender, "Unauthorized");
    require(PayoutPendingWithdrawls[_tokenId].time > 0, "No Payout set for this ticket");
    require(PayoutPendingWithdrawls[_tokenId].amount > 0, "Payout Already Claimed");
    uint256 amount = PayoutPendingWithdrawls[_tokenId].amount;
    PayoutPendingWithdrawls[_tokenId].amount = 0;
    emit PayoutWithdraw(_tokenId, msg.sender, amount);
    (bool sent, ) = (msg.sender.call{value: amount}(""));
    require(sent, "Transfer failed.");
  }

  function withdrawUnclaimed(address _destination, uint256 _tokenId) external payable onlyOwner {
    require(_exists(_tokenId), "query for nonexistent token");
    uint timeNow = block.timestamp;
    require(PayoutPendingWithdrawls[_tokenId].time != 0 && timeNow - PayoutPendingWithdrawls[_tokenId].time > 7776000 , "Can only withdraw unclaimed 90 days after Payouts are set");
    uint256 amount = PayoutPendingWithdrawls[_tokenId].amount;
    PayoutPendingWithdrawls[_tokenId].amount = 0;
    (bool sent, ) = (_destination.call{value: amount}(""));
    require(sent, "Transfer failed.");
  }

  function fundme() public payable {
    emit ReceivedEth(msg.value);
  }

  receive() external payable  {
      fundme();
  }

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"uint64","name":"_linkSubscriptionId","type":"uint64"},{"internalType":"address","name":"_vrfCoordinatorAddress","type":"address"},{"internalType":"bytes32","name":"_keyHash","type":"bytes32"},{"internalType":"string","name":"_baselineURIMintPhase","type":"string"},{"internalType":"uint256","name":"_maxTickets","type":"uint256"},{"internalType":"uint256","name":"_mintFee","type":"uint256"},{"internalType":"uint256","name":"_dtMintStartWhitelist","type":"uint256"},{"internalType":"uint256","name":"_dtMintStartPublic","type":"uint256"},{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"},{"internalType":"string","name":"_contestDescription","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"have","type":"address"},{"internalType":"address","name":"want","type":"address"}],"name":"OnlyCoordinatorCanFulfill","type":"error"},{"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":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PayoutWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PayoutsSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ReceivedEth","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"BaseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BaselineURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ContestDescription","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"KeyHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LinkRandomOffset","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"LinkRandomWords","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LinkSubScriptionId","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MaxTickets","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MintFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"PayoutPendingWithdrawls","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"time","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RequestId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"TokenIdWinners","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VrfCoordinatorAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"WhitelistClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dtMintStartPublic","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dtMintStartWhitelist","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fundme","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isGamePhase","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isMintPhase","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mintTicketPublic","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"mintTicketWhitelist","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"offsetCalcURI","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"randomWordsGet","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"requestId","type":"uint256"},{"internalType":"uint256[]","name":"randomWords","type":"uint256[]"}],"name":"rawFulfillRandomWords","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"requestRandomWords","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":"_baseUriNew","type":"string"}],"name":"setBaseURIGamePhase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_gasLane","type":"bytes32"}],"name":"setGasLaneLink","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setMintPhaseOff","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"isPublicTime","type":"bool"},{"internalType":"uint256","name":"_newTime","type":"uint256"}],"name":"setMintStartTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"token","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct SquareUpContest.Payout","name":"_payout","type":"tuple"}],"name":"setPayout","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenIds","outputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"withdrawPayout","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_destination","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"withdrawUnclaimed","outputs":[],"stateMutability":"payable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60a06040526012805461ffff191660011790553480156200001f57600080fd5b50604051620036343803806200363483398101604081905262000042916200034f565b6040805180820182526008815267053717561726555760c41b60208083019182528351808501909452600384526253515560e81b9084015281518c93916200008e9160009190620001bd565b508051620000a4906001906020840190620001bd565b50505060601b6001600160601b031916608052620000c9620000c33390565b6200016b565b6001600755600980546001600160a01b038b166001600160e01b03199091168117600160a01b6001600160401b038e160217909155600a80546001600160a01b0319169091179055600b88905586516200012b9060139060208a0190620001bd565b50600f869055601085905560148490556015839055601982905580516200015a906011906020840190620001bd565b50505050505050505050506200046e565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620001cb906200041b565b90600052602060002090601f016020900481019282620001ef57600085556200023a565b82601f106200020a57805160ff19168380011785556200023a565b828001600101855582156200023a579182015b828111156200023a5782518255916020019190600101906200021d565b50620002489291506200024c565b5090565b5b808211156200024857600081556001016200024d565b80516001600160a01b03811681146200027b57600080fd5b919050565b600082601f8301126200029257600080fd5b81516001600160401b0380821115620002af57620002af62000458565b604051601f8301601f19908116603f01168101908282118183101715620002da57620002da62000458565b81604052838152602092508683858801011115620002f757600080fd5b600091505b838210156200031b5785820183015181830184015290820190620002fc565b838211156200032d5760008385830101525b9695505050505050565b80516001600160401b03811681146200027b57600080fd5b6000806000806000806000806000806101408b8d0312156200037057600080fd5b6200037b8b62000337565b99506200038b60208c0162000263565b60408c015160608d0151919a5098506001600160401b0380821115620003b057600080fd5b620003be8e838f0162000280565b985060808d0151975060a08d0151965060c08d0151955060e08d015194506101008d015193506101208d0151915080821115620003fa57600080fd5b50620004098d828e0162000280565b9150509295989b9194979a5092959850565b600181811c908216806200043057607f821691505b602082108114156200045257634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b60805160601c6131a06200049460003960008181610dbb0152610dfd01526131a06000f3fe6080604052600436106102e85760003560e01c80636e08423511610190578063ab1686ab116100dc578063d5c30ad111610095578063e985e9c51161006f578063e985e9c5146108a0578063f0871e54146108e9578063f2fde38b146108fe578063fb96e6491461091e57600080fd5b8063d5c30ad114610834578063da1f7bff1461084a578063e0c862891461088b57600080fd5b8063ab1686ab14610789578063b21c7935146107b9578063b47654f4146107cc578063b88d4fde146107ec578063c87b56dd1461080c578063d1d9165d1461082c57600080fd5b80638da5cb5b116101495780639bcc5fa3116101235780639bcc5fa31461071a5780639c7b99a614610734578063a22cb46514610754578063a807e1a31461077457600080fd5b80638da5cb5b146106c857806395d89b41146106e657806399eab53c146106fb57600080fd5b80636e0842351461063b57806370a0823114610651578063714cff5614610671578063715018a61461068857806376d4df2c1461069d57806381e55e26146106b357600080fd5b80634051a5a61161024f5780635356d9e2116102085780635bb8ae7c116101e25780635bb8ae7c1461059f5780636352211e146105e85780636672dfac146106085780636790884a1461062857600080fd5b80635356d9e21461055157806353a8bf22146105675780635867141e1461057d57600080fd5b80634051a5a6146104a857806342842e0e146104c85780634286918c146104e857806344b7c545146105085780634d456dcb146105285780634eb5659f1461053b57600080fd5b806318160ddd116102a157806318160ddd146103e25780631fe543e3146103f757806323b872dd146104175780632b5b65391461043757806333d0da4f146104575780633cb6a8d11461047757600080fd5b806301ffc9a7146102fc57806306fdde0314610331578063081812fc14610353578063095ea7b31461038b5780630de5c713146103ab578063132d3f6a146103be57600080fd5b366102f7576102f5610934565b005b600080fd5b34801561030857600080fd5b5061031c610317366004612ab1565b610969565b60405190151581526020015b60405180910390f35b34801561033d57600080fd5b506103466109bb565b6040516103289190612d79565b34801561035f57600080fd5b5061037361036e366004612a98565b610a4d565b6040516001600160a01b039091168152602001610328565b34801561039757600080fd5b506102f56103a6366004612a52565b610ada565b6102f56103b9366004612a52565b610bf0565b3480156103ca57600080fd5b506103d460195481565b604051908152602001610328565b3480156103ee57600080fd5b506103d4610da0565b34801561040357600080fd5b506102f5610412366004612be4565b610db0565b34801561042357600080fd5b506102f5610432366004612970565b610e38565b34801561044357600080fd5b506103d4610452366004612a98565b610e69565b34801561046357600080fd5b506102f5610472366004612a7c565b610e8a565b34801561048357600080fd5b5061034660405180604001604052806005815260200164173539b7b760d91b81525081565b3480156104b457600080fd5b506102f56104c3366004612b34565b610ec6565b3480156104d457600080fd5b506102f56104e3366004612970565b611074565b3480156104f457600080fd5b506103d4610503366004612a98565b61108f565b34801561051457600080fd5b506102f5610523366004612a98565b611147565b6102f5610536366004612a98565b611176565b34801561054757600080fd5b506103d460105481565b34801561055d57600080fd5b506103d460145481565b34801561057357600080fd5b506103d4600b5481565b34801561058957600080fd5b506105926111de565b6040516103289190612d35565b3480156105ab57600080fd5b506105d36105ba366004612a98565b6016602052600090815260409020805460019091015482565b60408051928352602083019190915201610328565b3480156105f457600080fd5b50610373610603366004612a98565b611235565b34801561061457600080fd5b50600a54610373906001600160a01b031681565b6102f5610636366004612b65565b6112ac565b34801561064757600080fd5b506103d4600d5481565b34801561065d57600080fd5b506103d461066c36600461291b565b611461565b34801561067d57600080fd5b506008546103d49081565b34801561069457600080fd5b506102f56114e8565b3480156106a957600080fd5b506103d4600f5481565b3480156106bf57600080fd5b5061034661151e565b3480156106d457600080fd5b506006546001600160a01b0316610373565b3480156106f257600080fd5b506103466115ac565b34801561070757600080fd5b5060125461031c90610100900460ff1681565b34801561072657600080fd5b5060125461031c9060ff1681565b34801561074057600080fd5b506103d461074f366004612a98565b6115bb565b34801561076057600080fd5b506102f561076f366004612a28565b6115cb565b34801561078057600080fd5b506102f56115d6565b34801561079557600080fd5b5061031c6107a436600461291b565b60176020526000908152604090205460ff1681565b6102f56107c7366004612a98565b611652565b3480156107d857600080fd5b506102f56107e7366004612aeb565b611878565b3480156107f857600080fd5b506102f56108073660046129ac565b61198a565b34801561081857600080fd5b50610346610827366004612a98565b6119c2565b6102f5610934565b34801561084057600080fd5b506103d460155481565b34801561085657600080fd5b5060095461087290600160a01b900467ffffffffffffffff1681565b60405167ffffffffffffffff9091168152602001610328565b34801561089757600080fd5b506102f5611a89565b3480156108ac57600080fd5b5061031c6108bb36600461293d565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156108f557600080fd5b50610346611c3c565b34801561090a57600080fd5b506102f561091936600461291b565b611c49565b34801561092a57600080fd5b506103d4600e5481565b6040513481527feac3bc00eb8bc276e61d902ebf696db93b7ee1cf44f1b16d6da1111427825e9e9060200160405180910390a1565b60006001600160e01b031982166380ac58cd60e01b148061099a57506001600160e01b03198216635b5e139f60e01b145b806109b557506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600080546109ca90613074565b80601f01602080910402602001604051908101604052809291908181526020018280546109f690613074565b8015610a435780601f10610a1857610100808354040283529160200191610a43565b820191906000526020600020905b815481529060010190602001808311610a2657829003601f168201915b5050505050905090565b6000610a5882611ce4565b610abe5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610ae582611235565b9050806001600160a01b0316836001600160a01b03161415610b535760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610ab5565b336001600160a01b0382161480610b6f5750610b6f81336108bb565b610be15760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610ab5565b610beb8383611d01565b505050565b6006546001600160a01b03163314610c1a5760405162461bcd60e51b8152600401610ab590612ef8565b610c2381611ce4565b610c3f5760405162461bcd60e51b8152600401610ab590612e78565b600081815260166020526040902060010154429015801590610c7f57506000828152601660205260409020600101546276a70090610c7d9083613031565b115b610cf15760405162461bcd60e51b815260206004820152603960248201527f43616e206f6e6c7920776974686472617720756e636c61696d6564203930206460448201527f617973206166746572205061796f7574732061726520736574000000000000006064820152608401610ab5565b60008281526016602052604080822080549083905590519091906001600160a01b0386169083908381818185875af1925050503d8060008114610d50576040519150601f19603f3d011682016040523d82523d6000602084013e610d55565b606091505b5050905080610d995760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b6044820152606401610ab5565b5050505050565b6000610dab60085490565b905090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610e2a5760405163073e64fd60e21b81523360048201526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166024820152604401610ab5565b610e348282611d6f565b5050565b610e423382611da5565b610e5e5760405162461bcd60e51b8152600401610ab590612f2d565b610beb838383611e8f565b60188181548110610e7957600080fd5b600091825260209091200154905081565b6006546001600160a01b03163314610eb45760405162461bcd60e51b8152600401610ab590612ef8565b8115610ec05760155550565b60145550565b6006546001600160a01b03163314610ef05760405162461bcd60e51b8152600401610ab590612ef8565b610efa8135611ce4565b610f165760405162461bcd60e51b8152600401610ab590612e78565b8035600090815260166020526040902054158015610f4557508035600090815260166020526040902060010154155b610f915760405162461bcd60e51b815260206004820152601e60248201527f5061796f757420616c72656164792073657420696e20746865207061737400006044820152606401610ab5565b601254610100900460ff16610fe05760405162461bcd60e51b81526020600482015260156024820152744d75737420626520696e2067616d6520706861736560581b6044820152606401610ab5565b6040805180820182526020808401358083524282840181815286356000818152601690955286852086518155915160019283015560188054928301815585527fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d2e9091018190559451909491927fd5d5d049e9608f1efc24130fb8104fb6919491de8667a9d7aad9efe3d24892d291a3505050565b610beb8383836040518060200160405280600081525061198a565b600061109a82611ce4565b6110b65760405162461bcd60e51b8152600401610ab590612e78565b600c546111055760405162461bcd60e51b815260206004820152601f60248201527f6c696e6b2072616e646f6d20776f72647320646f65736e2774206578697374006044820152606401610ab5565b60085482600c60008154811061111d5761111d613128565b90600052602060002001546111329190612fe6565b61113c91906130e8565b6109b5906001612fe6565b6006546001600160a01b031633146111715760405162461bcd60e51b8152600401610ab590612ef8565b600b55565b600260075414156111995760405162461bcd60e51b8152600401610ab590612f7e565b60026007556015544210156111c05760405162461bcd60e51b8152600401610ab590612d8c565b6111cc81346000612036565b6111d681336121ea565b506001600755565b6060600c805480602002602001604051908101604052809291908181526020018280548015610a4357602002820191906000526020600020905b815481526020019060010190808311611218575050505050905090565b6000818152600260205260408120546001600160a01b0316806109b55760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610ab5565b600260075414156112cf5760405162461bcd60e51b8152600401610ab590612f7e565b60026007556014544210156112f65760405162461bcd60e51b8152600401610ab590612d8c565b3360009081526017602052604090205460ff16156113685760405162461bcd60e51b815260206004820152602960248201527f57686974656c6973742063616e2774206d696e74206d6f7265207468616e206f6044820152681b99481d1a58dad95d60ba1b6064820152608401610ab5565b61137483346001612036565b6040516bffffffffffffffffffffffff193360601b1660208201526000906034016040516020818303038152906040528051906020012090506113ee838380806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506019549150849050612233565b6114315760405162461bcd60e51b8152602060048201526014602482015273139bdd081bdb881d1a19481dda1a5d195b1a5cdd60621b6044820152606401610ab5565b336000818152601760205260409020805460ff191660011790556114569085906121ea565b505060016007555050565b60006001600160a01b0382166114cc5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610ab5565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b031633146115125760405162461bcd60e51b8152600401610ab590612ef8565b61151c6000612249565b565b6013805461152b90613074565b80601f016020809104026020016040519081016040528092919081815260200182805461155790613074565b80156115a45780601f10611579576101008083540402835291602001916115a4565b820191906000526020600020905b81548152906001019060200180831161158757829003601f168201915b505050505081565b6060600180546109ca90613074565b600c8181548110610e7957600080fd5b610e3433838361229b565b6006546001600160a01b031633146116005760405162461bcd60e51b8152600401610ab590612ef8565b60125460ff166116465760405162461bcd60e51b815260206004820152601160248201527026b4b73a10383430b9b29034b99037b33360791b6044820152606401610ab5565b6012805460ff19169055565b600260075414156116755760405162461bcd60e51b8152600401610ab590612f7e565b600260075561168381611ce4565b61169f5760405162461bcd60e51b8152600401610ab590612e78565b336116a982611235565b6001600160a01b0316146116ee5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610ab5565b60008181526016602052604090206001015461174c5760405162461bcd60e51b815260206004820152601d60248201527f4e6f205061796f75742073657420666f722074686973207469636b65740000006044820152606401610ab5565b6000818152601660205260409020546117a05760405162461bcd60e51b815260206004820152601660248201527514185e5bdd5d08105b1c9958591e4810db185a5b595960521b6044820152606401610ab5565b600081815260166020526040808220805490839055905190918291339185917f425e2e0a3c1682ab47811bf16fdcee1b57b4af7706f31c08e7230192e5b8c0819190a4604051600090339083908381818185875af1925050503d8060008114611825576040519150601f19603f3d011682016040523d82523d6000602084013e61182a565b606091505b505090508061186e5760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b6044820152606401610ab5565b5050600160075550565b6006546001600160a01b031633146118a25760405162461bcd60e51b8152600401610ab590612ef8565b601254610100900460ff16156118fa5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420737769746368207465616d206c6973747300000000000000006044820152606401610ab5565b600c546119645760405162461bcd60e51b815260206004820152603260248201527f43616e6e6f742073657420626173652075726920776974686f757420636861696044820152716e6c696e6b2072616e646f6d20776f72647360701b6064820152608401610ab5565b80516119779060139060208401906127c4565b50506012805461ff001916610100179055565b6119943383611da5565b6119b05760405162461bcd60e51b8152600401610ab590612f2d565b6119bc8484848461236a565b50505050565b60606119cd82611ce4565b6119e95760405162461bcd60e51b8152600401610ab590612e78565b60006119f361239d565b601254909150610100900460ff16611a0b5792915050565b6000611a168461108f565b9050600082611a24836123ac565b604051602001611a35929190612cc9565b60408051601f1981840301815282820182526005835264173539b7b760d91b6020848101919091529151909350611a70928492909101612cc9565b6040516020818303038152906040529350505050919050565b6006546001600160a01b03163314611ab35760405162461bcd60e51b8152600401610ab590612ef8565b60125460ff1615611ad65760405162461bcd60e51b8152600401610ab590612eaf565b600c5415611b305760405162461bcd60e51b815260206004820152602160248201527f52616e646f6d20776f7264732063616e206f6e6c7920626520736574206f6e636044820152606560f81b6064820152608401610ab5565b6000611b3b60085490565b11611b885760405162461bcd60e51b815260206004820152601a60248201527f4d7573742068617665207465616d7320746f2073687566666c650000000000006044820152606401610ab5565b600954600b546040516305d3b1d360e41b81526004810191909152600160a01b820467ffffffffffffffff16602482015260056044820152620493e06064820152600160848201526001600160a01b0390911690635d3b1d309060a401602060405180830381600087803b158015611bff57600080fd5b505af1158015611c13573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c379190612b4c565b600e55565b6011805461152b90613074565b6006546001600160a01b03163314611c735760405162461bcd60e51b8152600401610ab590612ef8565b6001600160a01b038116611cd85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610ab5565b611ce181612249565b50565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611d3682611235565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60125460ff1615611d925760405162461bcd60e51b8152600401610ab590612eaf565b8051610beb90600c906020840190612848565b6000611db082611ce4565b611e115760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610ab5565b6000611e1c83611235565b9050806001600160a01b0316846001600160a01b03161480611e6357506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b80611e875750836001600160a01b0316611e7c84610a4d565b6001600160a01b0316145b949350505050565b826001600160a01b0316611ea282611235565b6001600160a01b031614611f065760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610ab5565b6001600160a01b038216611f685760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610ab5565b611f738383836124aa565b611f7e600082611d01565b6001600160a01b0383166000908152600360205260408120805460019290611fa7908490613031565b90915550506001600160a01b0382166000908152600360205260408120805460019290611fd5908490612fe6565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60125460ff1661207c5760405162461bcd60e51b815260206004820152601160248201527026b4b73a10383430b9b29034b99037b33360791b6044820152606401610ab5565b600083116120c25760405162461bcd60e51b815260206004820152601360248201527243616e74206d696e742030207469636b65747360681b6044820152606401610ab5565b80156120ee5760018311156120e95760405162461bcd60e51b8152600401610ab590612e29565b61210f565b600a83111561210f5760405162461bcd60e51b8152600401610ab590612e29565b600f548361211c60085490565b6121269190612fe6565b111561219a5760405162461bcd60e51b815260206004820152603b60248201527f43616e2774206d696e74206d6f7265207468616e2074686520746f74616c206e60448201527f756d626572206f6620617661696c61626c65207469636b6574732e00000000006064820152608401610ab5565b826010546121a89190613012565b821015610beb5760405162461bcd60e51b815260206004820152601060248201526f4e6f7420656e6f7567682066756e647360801b6044820152606401610ab5565b60005b828163ffffffff161015610beb57612209600880546001019055565b600061221460085490565b90506122208382612504565b508061222b816130c4565b9150506121ed565b6000826122408584612643565b14949350505050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031614156122fd5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610ab5565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b612375848484611e8f565b612381848484846126b7565b6119bc5760405162461bcd60e51b8152600401610ab590612dd7565b6060601380546109ca90613074565b6060816123d05750506040805180820190915260018152600360fc1b602082015290565b8160005b81156123fa57806123e4816130a9565b91506123f39050600a83612ffe565b91506123d4565b60008167ffffffffffffffff8111156124155761241561313e565b6040519080825280601f01601f19166020018201604052801561243f576020820181803683370190505b5090505b8415611e8757612454600183613031565b9150612461600a866130e8565b61246c906030612fe6565b60f81b81838151811061248157612481613128565b60200101906001600160f81b031916908160001a9053506124a3600a86612ffe565b9450612443565b60185415610beb5760405162461bcd60e51b815260206004820152602160248201527f4e6f207472616e7366657273206f6e6365207061796f757473206172652073656044820152601d60fa1b6064820152608401610ab5565b6001600160a01b03821661255a5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610ab5565b61256381611ce4565b156125b05760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610ab5565b6125bc600083836124aa565b6001600160a01b03821660009081526003602052604081208054600192906125e5908490612fe6565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600081815b84518110156126af57600085828151811061266557612665613128565b6020026020010151905080831161268b576000838152602082905260409020925061269c565b600081815260208490526040902092505b50806126a7816130a9565b915050612648565b509392505050565b60006001600160a01b0384163b156127b957604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906126fb903390899088908890600401612cf8565b602060405180830381600087803b15801561271557600080fd5b505af1925050508015612745575060408051601f3d908101601f1916820190925261274291810190612ace565b60015b61279f573d808015612773576040519150601f19603f3d011682016040523d82523d6000602084013e612778565b606091505b5080516127975760405162461bcd60e51b8152600401610ab590612dd7565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611e87565b506001949350505050565b8280546127d090613074565b90600052602060002090601f0160209004810192826127f25760008555612838565b82601f1061280b57805160ff1916838001178555612838565b82800160010185558215612838579182015b8281111561283857825182559160200191906001019061281d565b50612844929150612882565b5090565b828054828255906000526020600020908101928215612838579160200282018281111561283857825182559160200191906001019061281d565b5b808211156128445760008155600101612883565b600067ffffffffffffffff8311156128b1576128b161313e565b6128c4601f8401601f1916602001612fb5565b90508281528383830111156128d857600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b038116811461290657600080fd5b919050565b8035801515811461290657600080fd5b60006020828403121561292d57600080fd5b612936826128ef565b9392505050565b6000806040838503121561295057600080fd5b612959836128ef565b9150612967602084016128ef565b90509250929050565b60008060006060848603121561298557600080fd5b61298e846128ef565b925061299c602085016128ef565b9150604084013590509250925092565b600080600080608085870312156129c257600080fd5b6129cb856128ef565b93506129d9602086016128ef565b925060408501359150606085013567ffffffffffffffff8111156129fc57600080fd5b8501601f81018713612a0d57600080fd5b612a1c87823560208401612897565b91505092959194509250565b60008060408385031215612a3b57600080fd5b612a44836128ef565b91506129676020840161290b565b60008060408385031215612a6557600080fd5b612a6e836128ef565b946020939093013593505050565b60008060408385031215612a8f57600080fd5b612a6e8361290b565b600060208284031215612aaa57600080fd5b5035919050565b600060208284031215612ac357600080fd5b813561293681613154565b600060208284031215612ae057600080fd5b815161293681613154565b600060208284031215612afd57600080fd5b813567ffffffffffffffff811115612b1457600080fd5b8201601f81018413612b2557600080fd5b611e8784823560208401612897565b600060408284031215612b4657600080fd5b50919050565b600060208284031215612b5e57600080fd5b5051919050565b600080600060408486031215612b7a57600080fd5b83359250602084013567ffffffffffffffff80821115612b9957600080fd5b818601915086601f830112612bad57600080fd5b813581811115612bbc57600080fd5b8760208260051b8501011115612bd157600080fd5b6020830194508093505050509250925092565b60008060408385031215612bf757600080fd5b8235915060208084013567ffffffffffffffff80821115612c1757600080fd5b818601915086601f830112612c2b57600080fd5b813581811115612c3d57612c3d61313e565b8060051b9150612c4e848301612fb5565b8181528481019084860184860187018b1015612c6957600080fd5b600095505b83861015612c8c578035835260019590950194918601918601612c6e565b508096505050505050509250929050565b60008151808452612cb5816020860160208601613048565b601f01601f19169290920160200192915050565b60008351612cdb818460208801613048565b835190830190612cef818360208801613048565b01949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612d2b90830184612c9d565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015612d6d57835183529284019291840191600101612d51565b50909695505050505050565b6020815260006129366020830184612c9d565b6020808252602b908201527f43616e2774206d696e74207965742e2054727920616761696e20696e2061206660408201526a32bb9039b2b1b7b732399760a91b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252602f908201527f43616e2774206d696e742074686973206d616e79207469636b65747320696e2060408201526e37b732903a3930b739b0b1ba34b7b760891b606082015260800190565b6020808252601b908201527f717565727920666f72206e6f6e6578697374656e7420746f6b656e0000000000604082015260600190565b60208082526029908201527f5465616d732063616e6e6f742062652073657420647572696e6720746865206d604082015268696e7420706861736560b81b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b604051601f8201601f1916810167ffffffffffffffff81118282101715612fde57612fde61313e565b604052919050565b60008219821115612ff957612ff96130fc565b500190565b60008261300d5761300d613112565b500490565b600081600019048311821515161561302c5761302c6130fc565b500290565b600082821015613043576130436130fc565b500390565b60005b8381101561306357818101518382015260200161304b565b838111156119bc5750506000910152565b600181811c9082168061308857607f821691505b60208210811415612b4657634e487b7160e01b600052602260045260246000fd5b60006000198214156130bd576130bd6130fc565b5060010190565b600063ffffffff808316818114156130de576130de6130fc565b6001019392505050565b6000826130f7576130f7613112565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114611ce157600080fdfea2646970667358221220d297cbc916f5ee970692f3c4eab1a89cc36edfd5cc671a3ccb569818fd739e3364736f6c63430008070033000000000000000000000000000000000000000000000000000000000000020f000000000000000000000000271682deb8c4e0901d1a1550ad2e64d568e699098af398995b04c28e9951adb9721ef74c74f93e6a478f39e7e0777be13527e7ef000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000fa000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000637e276000000000000000000000000000000000000000000000000000000000637e7bc006a4118d4f37834b3a87914543a96c9b064a8ab1278e991c80a803bdca597cb500000000000000000000000000000000000000000000000000000000000001a00000000000000000000000000000000000000000000000000000000000000035697066733a2f2f516d583252384632384872694d454e76454568463163614c6a4d4466705a4a4e32683166467873416368664559460000000000000000000000000000000000000000000000000000000000000000000000000000000000000b4e42412023312032303232000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102e85760003560e01c80636e08423511610190578063ab1686ab116100dc578063d5c30ad111610095578063e985e9c51161006f578063e985e9c5146108a0578063f0871e54146108e9578063f2fde38b146108fe578063fb96e6491461091e57600080fd5b8063d5c30ad114610834578063da1f7bff1461084a578063e0c862891461088b57600080fd5b8063ab1686ab14610789578063b21c7935146107b9578063b47654f4146107cc578063b88d4fde146107ec578063c87b56dd1461080c578063d1d9165d1461082c57600080fd5b80638da5cb5b116101495780639bcc5fa3116101235780639bcc5fa31461071a5780639c7b99a614610734578063a22cb46514610754578063a807e1a31461077457600080fd5b80638da5cb5b146106c857806395d89b41146106e657806399eab53c146106fb57600080fd5b80636e0842351461063b57806370a0823114610651578063714cff5614610671578063715018a61461068857806376d4df2c1461069d57806381e55e26146106b357600080fd5b80634051a5a61161024f5780635356d9e2116102085780635bb8ae7c116101e25780635bb8ae7c1461059f5780636352211e146105e85780636672dfac146106085780636790884a1461062857600080fd5b80635356d9e21461055157806353a8bf22146105675780635867141e1461057d57600080fd5b80634051a5a6146104a857806342842e0e146104c85780634286918c146104e857806344b7c545146105085780634d456dcb146105285780634eb5659f1461053b57600080fd5b806318160ddd116102a157806318160ddd146103e25780631fe543e3146103f757806323b872dd146104175780632b5b65391461043757806333d0da4f146104575780633cb6a8d11461047757600080fd5b806301ffc9a7146102fc57806306fdde0314610331578063081812fc14610353578063095ea7b31461038b5780630de5c713146103ab578063132d3f6a146103be57600080fd5b366102f7576102f5610934565b005b600080fd5b34801561030857600080fd5b5061031c610317366004612ab1565b610969565b60405190151581526020015b60405180910390f35b34801561033d57600080fd5b506103466109bb565b6040516103289190612d79565b34801561035f57600080fd5b5061037361036e366004612a98565b610a4d565b6040516001600160a01b039091168152602001610328565b34801561039757600080fd5b506102f56103a6366004612a52565b610ada565b6102f56103b9366004612a52565b610bf0565b3480156103ca57600080fd5b506103d460195481565b604051908152602001610328565b3480156103ee57600080fd5b506103d4610da0565b34801561040357600080fd5b506102f5610412366004612be4565b610db0565b34801561042357600080fd5b506102f5610432366004612970565b610e38565b34801561044357600080fd5b506103d4610452366004612a98565b610e69565b34801561046357600080fd5b506102f5610472366004612a7c565b610e8a565b34801561048357600080fd5b5061034660405180604001604052806005815260200164173539b7b760d91b81525081565b3480156104b457600080fd5b506102f56104c3366004612b34565b610ec6565b3480156104d457600080fd5b506102f56104e3366004612970565b611074565b3480156104f457600080fd5b506103d4610503366004612a98565b61108f565b34801561051457600080fd5b506102f5610523366004612a98565b611147565b6102f5610536366004612a98565b611176565b34801561054757600080fd5b506103d460105481565b34801561055d57600080fd5b506103d460145481565b34801561057357600080fd5b506103d4600b5481565b34801561058957600080fd5b506105926111de565b6040516103289190612d35565b3480156105ab57600080fd5b506105d36105ba366004612a98565b6016602052600090815260409020805460019091015482565b60408051928352602083019190915201610328565b3480156105f457600080fd5b50610373610603366004612a98565b611235565b34801561061457600080fd5b50600a54610373906001600160a01b031681565b6102f5610636366004612b65565b6112ac565b34801561064757600080fd5b506103d4600d5481565b34801561065d57600080fd5b506103d461066c36600461291b565b611461565b34801561067d57600080fd5b506008546103d49081565b34801561069457600080fd5b506102f56114e8565b3480156106a957600080fd5b506103d4600f5481565b3480156106bf57600080fd5b5061034661151e565b3480156106d457600080fd5b506006546001600160a01b0316610373565b3480156106f257600080fd5b506103466115ac565b34801561070757600080fd5b5060125461031c90610100900460ff1681565b34801561072657600080fd5b5060125461031c9060ff1681565b34801561074057600080fd5b506103d461074f366004612a98565b6115bb565b34801561076057600080fd5b506102f561076f366004612a28565b6115cb565b34801561078057600080fd5b506102f56115d6565b34801561079557600080fd5b5061031c6107a436600461291b565b60176020526000908152604090205460ff1681565b6102f56107c7366004612a98565b611652565b3480156107d857600080fd5b506102f56107e7366004612aeb565b611878565b3480156107f857600080fd5b506102f56108073660046129ac565b61198a565b34801561081857600080fd5b50610346610827366004612a98565b6119c2565b6102f5610934565b34801561084057600080fd5b506103d460155481565b34801561085657600080fd5b5060095461087290600160a01b900467ffffffffffffffff1681565b60405167ffffffffffffffff9091168152602001610328565b34801561089757600080fd5b506102f5611a89565b3480156108ac57600080fd5b5061031c6108bb36600461293d565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156108f557600080fd5b50610346611c3c565b34801561090a57600080fd5b506102f561091936600461291b565b611c49565b34801561092a57600080fd5b506103d4600e5481565b6040513481527feac3bc00eb8bc276e61d902ebf696db93b7ee1cf44f1b16d6da1111427825e9e9060200160405180910390a1565b60006001600160e01b031982166380ac58cd60e01b148061099a57506001600160e01b03198216635b5e139f60e01b145b806109b557506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600080546109ca90613074565b80601f01602080910402602001604051908101604052809291908181526020018280546109f690613074565b8015610a435780601f10610a1857610100808354040283529160200191610a43565b820191906000526020600020905b815481529060010190602001808311610a2657829003601f168201915b5050505050905090565b6000610a5882611ce4565b610abe5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610ae582611235565b9050806001600160a01b0316836001600160a01b03161415610b535760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610ab5565b336001600160a01b0382161480610b6f5750610b6f81336108bb565b610be15760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610ab5565b610beb8383611d01565b505050565b6006546001600160a01b03163314610c1a5760405162461bcd60e51b8152600401610ab590612ef8565b610c2381611ce4565b610c3f5760405162461bcd60e51b8152600401610ab590612e78565b600081815260166020526040902060010154429015801590610c7f57506000828152601660205260409020600101546276a70090610c7d9083613031565b115b610cf15760405162461bcd60e51b815260206004820152603960248201527f43616e206f6e6c7920776974686472617720756e636c61696d6564203930206460448201527f617973206166746572205061796f7574732061726520736574000000000000006064820152608401610ab5565b60008281526016602052604080822080549083905590519091906001600160a01b0386169083908381818185875af1925050503d8060008114610d50576040519150601f19603f3d011682016040523d82523d6000602084013e610d55565b606091505b5050905080610d995760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b6044820152606401610ab5565b5050505050565b6000610dab60085490565b905090565b336001600160a01b037f000000000000000000000000271682deb8c4e0901d1a1550ad2e64d568e699091614610e2a5760405163073e64fd60e21b81523360048201526001600160a01b037f000000000000000000000000271682deb8c4e0901d1a1550ad2e64d568e69909166024820152604401610ab5565b610e348282611d6f565b5050565b610e423382611da5565b610e5e5760405162461bcd60e51b8152600401610ab590612f2d565b610beb838383611e8f565b60188181548110610e7957600080fd5b600091825260209091200154905081565b6006546001600160a01b03163314610eb45760405162461bcd60e51b8152600401610ab590612ef8565b8115610ec05760155550565b60145550565b6006546001600160a01b03163314610ef05760405162461bcd60e51b8152600401610ab590612ef8565b610efa8135611ce4565b610f165760405162461bcd60e51b8152600401610ab590612e78565b8035600090815260166020526040902054158015610f4557508035600090815260166020526040902060010154155b610f915760405162461bcd60e51b815260206004820152601e60248201527f5061796f757420616c72656164792073657420696e20746865207061737400006044820152606401610ab5565b601254610100900460ff16610fe05760405162461bcd60e51b81526020600482015260156024820152744d75737420626520696e2067616d6520706861736560581b6044820152606401610ab5565b6040805180820182526020808401358083524282840181815286356000818152601690955286852086518155915160019283015560188054928301815585527fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d2e9091018190559451909491927fd5d5d049e9608f1efc24130fb8104fb6919491de8667a9d7aad9efe3d24892d291a3505050565b610beb8383836040518060200160405280600081525061198a565b600061109a82611ce4565b6110b65760405162461bcd60e51b8152600401610ab590612e78565b600c546111055760405162461bcd60e51b815260206004820152601f60248201527f6c696e6b2072616e646f6d20776f72647320646f65736e2774206578697374006044820152606401610ab5565b60085482600c60008154811061111d5761111d613128565b90600052602060002001546111329190612fe6565b61113c91906130e8565b6109b5906001612fe6565b6006546001600160a01b031633146111715760405162461bcd60e51b8152600401610ab590612ef8565b600b55565b600260075414156111995760405162461bcd60e51b8152600401610ab590612f7e565b60026007556015544210156111c05760405162461bcd60e51b8152600401610ab590612d8c565b6111cc81346000612036565b6111d681336121ea565b506001600755565b6060600c805480602002602001604051908101604052809291908181526020018280548015610a4357602002820191906000526020600020905b815481526020019060010190808311611218575050505050905090565b6000818152600260205260408120546001600160a01b0316806109b55760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610ab5565b600260075414156112cf5760405162461bcd60e51b8152600401610ab590612f7e565b60026007556014544210156112f65760405162461bcd60e51b8152600401610ab590612d8c565b3360009081526017602052604090205460ff16156113685760405162461bcd60e51b815260206004820152602960248201527f57686974656c6973742063616e2774206d696e74206d6f7265207468616e206f6044820152681b99481d1a58dad95d60ba1b6064820152608401610ab5565b61137483346001612036565b6040516bffffffffffffffffffffffff193360601b1660208201526000906034016040516020818303038152906040528051906020012090506113ee838380806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506019549150849050612233565b6114315760405162461bcd60e51b8152602060048201526014602482015273139bdd081bdb881d1a19481dda1a5d195b1a5cdd60621b6044820152606401610ab5565b336000818152601760205260409020805460ff191660011790556114569085906121ea565b505060016007555050565b60006001600160a01b0382166114cc5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610ab5565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b031633146115125760405162461bcd60e51b8152600401610ab590612ef8565b61151c6000612249565b565b6013805461152b90613074565b80601f016020809104026020016040519081016040528092919081815260200182805461155790613074565b80156115a45780601f10611579576101008083540402835291602001916115a4565b820191906000526020600020905b81548152906001019060200180831161158757829003601f168201915b505050505081565b6060600180546109ca90613074565b600c8181548110610e7957600080fd5b610e3433838361229b565b6006546001600160a01b031633146116005760405162461bcd60e51b8152600401610ab590612ef8565b60125460ff166116465760405162461bcd60e51b815260206004820152601160248201527026b4b73a10383430b9b29034b99037b33360791b6044820152606401610ab5565b6012805460ff19169055565b600260075414156116755760405162461bcd60e51b8152600401610ab590612f7e565b600260075561168381611ce4565b61169f5760405162461bcd60e51b8152600401610ab590612e78565b336116a982611235565b6001600160a01b0316146116ee5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610ab5565b60008181526016602052604090206001015461174c5760405162461bcd60e51b815260206004820152601d60248201527f4e6f205061796f75742073657420666f722074686973207469636b65740000006044820152606401610ab5565b6000818152601660205260409020546117a05760405162461bcd60e51b815260206004820152601660248201527514185e5bdd5d08105b1c9958591e4810db185a5b595960521b6044820152606401610ab5565b600081815260166020526040808220805490839055905190918291339185917f425e2e0a3c1682ab47811bf16fdcee1b57b4af7706f31c08e7230192e5b8c0819190a4604051600090339083908381818185875af1925050503d8060008114611825576040519150601f19603f3d011682016040523d82523d6000602084013e61182a565b606091505b505090508061186e5760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b6044820152606401610ab5565b5050600160075550565b6006546001600160a01b031633146118a25760405162461bcd60e51b8152600401610ab590612ef8565b601254610100900460ff16156118fa5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420737769746368207465616d206c6973747300000000000000006044820152606401610ab5565b600c546119645760405162461bcd60e51b815260206004820152603260248201527f43616e6e6f742073657420626173652075726920776974686f757420636861696044820152716e6c696e6b2072616e646f6d20776f72647360701b6064820152608401610ab5565b80516119779060139060208401906127c4565b50506012805461ff001916610100179055565b6119943383611da5565b6119b05760405162461bcd60e51b8152600401610ab590612f2d565b6119bc8484848461236a565b50505050565b60606119cd82611ce4565b6119e95760405162461bcd60e51b8152600401610ab590612e78565b60006119f361239d565b601254909150610100900460ff16611a0b5792915050565b6000611a168461108f565b9050600082611a24836123ac565b604051602001611a35929190612cc9565b60408051601f1981840301815282820182526005835264173539b7b760d91b6020848101919091529151909350611a70928492909101612cc9565b6040516020818303038152906040529350505050919050565b6006546001600160a01b03163314611ab35760405162461bcd60e51b8152600401610ab590612ef8565b60125460ff1615611ad65760405162461bcd60e51b8152600401610ab590612eaf565b600c5415611b305760405162461bcd60e51b815260206004820152602160248201527f52616e646f6d20776f7264732063616e206f6e6c7920626520736574206f6e636044820152606560f81b6064820152608401610ab5565b6000611b3b60085490565b11611b885760405162461bcd60e51b815260206004820152601a60248201527f4d7573742068617665207465616d7320746f2073687566666c650000000000006044820152606401610ab5565b600954600b546040516305d3b1d360e41b81526004810191909152600160a01b820467ffffffffffffffff16602482015260056044820152620493e06064820152600160848201526001600160a01b0390911690635d3b1d309060a401602060405180830381600087803b158015611bff57600080fd5b505af1158015611c13573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c379190612b4c565b600e55565b6011805461152b90613074565b6006546001600160a01b03163314611c735760405162461bcd60e51b8152600401610ab590612ef8565b6001600160a01b038116611cd85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610ab5565b611ce181612249565b50565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611d3682611235565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60125460ff1615611d925760405162461bcd60e51b8152600401610ab590612eaf565b8051610beb90600c906020840190612848565b6000611db082611ce4565b611e115760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610ab5565b6000611e1c83611235565b9050806001600160a01b0316846001600160a01b03161480611e6357506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b80611e875750836001600160a01b0316611e7c84610a4d565b6001600160a01b0316145b949350505050565b826001600160a01b0316611ea282611235565b6001600160a01b031614611f065760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610ab5565b6001600160a01b038216611f685760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610ab5565b611f738383836124aa565b611f7e600082611d01565b6001600160a01b0383166000908152600360205260408120805460019290611fa7908490613031565b90915550506001600160a01b0382166000908152600360205260408120805460019290611fd5908490612fe6565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60125460ff1661207c5760405162461bcd60e51b815260206004820152601160248201527026b4b73a10383430b9b29034b99037b33360791b6044820152606401610ab5565b600083116120c25760405162461bcd60e51b815260206004820152601360248201527243616e74206d696e742030207469636b65747360681b6044820152606401610ab5565b80156120ee5760018311156120e95760405162461bcd60e51b8152600401610ab590612e29565b61210f565b600a83111561210f5760405162461bcd60e51b8152600401610ab590612e29565b600f548361211c60085490565b6121269190612fe6565b111561219a5760405162461bcd60e51b815260206004820152603b60248201527f43616e2774206d696e74206d6f7265207468616e2074686520746f74616c206e60448201527f756d626572206f6620617661696c61626c65207469636b6574732e00000000006064820152608401610ab5565b826010546121a89190613012565b821015610beb5760405162461bcd60e51b815260206004820152601060248201526f4e6f7420656e6f7567682066756e647360801b6044820152606401610ab5565b60005b828163ffffffff161015610beb57612209600880546001019055565b600061221460085490565b90506122208382612504565b508061222b816130c4565b9150506121ed565b6000826122408584612643565b14949350505050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031614156122fd5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610ab5565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b612375848484611e8f565b612381848484846126b7565b6119bc5760405162461bcd60e51b8152600401610ab590612dd7565b6060601380546109ca90613074565b6060816123d05750506040805180820190915260018152600360fc1b602082015290565b8160005b81156123fa57806123e4816130a9565b91506123f39050600a83612ffe565b91506123d4565b60008167ffffffffffffffff8111156124155761241561313e565b6040519080825280601f01601f19166020018201604052801561243f576020820181803683370190505b5090505b8415611e8757612454600183613031565b9150612461600a866130e8565b61246c906030612fe6565b60f81b81838151811061248157612481613128565b60200101906001600160f81b031916908160001a9053506124a3600a86612ffe565b9450612443565b60185415610beb5760405162461bcd60e51b815260206004820152602160248201527f4e6f207472616e7366657273206f6e6365207061796f757473206172652073656044820152601d60fa1b6064820152608401610ab5565b6001600160a01b03821661255a5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610ab5565b61256381611ce4565b156125b05760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610ab5565b6125bc600083836124aa565b6001600160a01b03821660009081526003602052604081208054600192906125e5908490612fe6565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600081815b84518110156126af57600085828151811061266557612665613128565b6020026020010151905080831161268b576000838152602082905260409020925061269c565b600081815260208490526040902092505b50806126a7816130a9565b915050612648565b509392505050565b60006001600160a01b0384163b156127b957604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906126fb903390899088908890600401612cf8565b602060405180830381600087803b15801561271557600080fd5b505af1925050508015612745575060408051601f3d908101601f1916820190925261274291810190612ace565b60015b61279f573d808015612773576040519150601f19603f3d011682016040523d82523d6000602084013e612778565b606091505b5080516127975760405162461bcd60e51b8152600401610ab590612dd7565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611e87565b506001949350505050565b8280546127d090613074565b90600052602060002090601f0160209004810192826127f25760008555612838565b82601f1061280b57805160ff1916838001178555612838565b82800160010185558215612838579182015b8281111561283857825182559160200191906001019061281d565b50612844929150612882565b5090565b828054828255906000526020600020908101928215612838579160200282018281111561283857825182559160200191906001019061281d565b5b808211156128445760008155600101612883565b600067ffffffffffffffff8311156128b1576128b161313e565b6128c4601f8401601f1916602001612fb5565b90508281528383830111156128d857600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b038116811461290657600080fd5b919050565b8035801515811461290657600080fd5b60006020828403121561292d57600080fd5b612936826128ef565b9392505050565b6000806040838503121561295057600080fd5b612959836128ef565b9150612967602084016128ef565b90509250929050565b60008060006060848603121561298557600080fd5b61298e846128ef565b925061299c602085016128ef565b9150604084013590509250925092565b600080600080608085870312156129c257600080fd5b6129cb856128ef565b93506129d9602086016128ef565b925060408501359150606085013567ffffffffffffffff8111156129fc57600080fd5b8501601f81018713612a0d57600080fd5b612a1c87823560208401612897565b91505092959194509250565b60008060408385031215612a3b57600080fd5b612a44836128ef565b91506129676020840161290b565b60008060408385031215612a6557600080fd5b612a6e836128ef565b946020939093013593505050565b60008060408385031215612a8f57600080fd5b612a6e8361290b565b600060208284031215612aaa57600080fd5b5035919050565b600060208284031215612ac357600080fd5b813561293681613154565b600060208284031215612ae057600080fd5b815161293681613154565b600060208284031215612afd57600080fd5b813567ffffffffffffffff811115612b1457600080fd5b8201601f81018413612b2557600080fd5b611e8784823560208401612897565b600060408284031215612b4657600080fd5b50919050565b600060208284031215612b5e57600080fd5b5051919050565b600080600060408486031215612b7a57600080fd5b83359250602084013567ffffffffffffffff80821115612b9957600080fd5b818601915086601f830112612bad57600080fd5b813581811115612bbc57600080fd5b8760208260051b8501011115612bd157600080fd5b6020830194508093505050509250925092565b60008060408385031215612bf757600080fd5b8235915060208084013567ffffffffffffffff80821115612c1757600080fd5b818601915086601f830112612c2b57600080fd5b813581811115612c3d57612c3d61313e565b8060051b9150612c4e848301612fb5565b8181528481019084860184860187018b1015612c6957600080fd5b600095505b83861015612c8c578035835260019590950194918601918601612c6e565b508096505050505050509250929050565b60008151808452612cb5816020860160208601613048565b601f01601f19169290920160200192915050565b60008351612cdb818460208801613048565b835190830190612cef818360208801613048565b01949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612d2b90830184612c9d565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015612d6d57835183529284019291840191600101612d51565b50909695505050505050565b6020815260006129366020830184612c9d565b6020808252602b908201527f43616e2774206d696e74207965742e2054727920616761696e20696e2061206660408201526a32bb9039b2b1b7b732399760a91b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252602f908201527f43616e2774206d696e742074686973206d616e79207469636b65747320696e2060408201526e37b732903a3930b739b0b1ba34b7b760891b606082015260800190565b6020808252601b908201527f717565727920666f72206e6f6e6578697374656e7420746f6b656e0000000000604082015260600190565b60208082526029908201527f5465616d732063616e6e6f742062652073657420647572696e6720746865206d604082015268696e7420706861736560b81b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b604051601f8201601f1916810167ffffffffffffffff81118282101715612fde57612fde61313e565b604052919050565b60008219821115612ff957612ff96130fc565b500190565b60008261300d5761300d613112565b500490565b600081600019048311821515161561302c5761302c6130fc565b500290565b600082821015613043576130436130fc565b500390565b60005b8381101561306357818101518382015260200161304b565b838111156119bc5750506000910152565b600181811c9082168061308857607f821691505b60208210811415612b4657634e487b7160e01b600052602260045260246000fd5b60006000198214156130bd576130bd6130fc565b5060010190565b600063ffffffff808316818114156130de576130de6130fc565b6001019392505050565b6000826130f7576130f7613112565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114611ce157600080fdfea2646970667358221220d297cbc916f5ee970692f3c4eab1a89cc36edfd5cc671a3ccb569818fd739e3364736f6c63430008070033

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

000000000000000000000000000000000000000000000000000000000000020f000000000000000000000000271682deb8c4e0901d1a1550ad2e64d568e699098af398995b04c28e9951adb9721ef74c74f93e6a478f39e7e0777be13527e7ef000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000fa000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000637e276000000000000000000000000000000000000000000000000000000000637e7bc006a4118d4f37834b3a87914543a96c9b064a8ab1278e991c80a803bdca597cb500000000000000000000000000000000000000000000000000000000000001a00000000000000000000000000000000000000000000000000000000000000035697066733a2f2f516d583252384632384872694d454e76454568463163614c6a4d4466705a4a4e32683166467873416368664559460000000000000000000000000000000000000000000000000000000000000000000000000000000000000b4e42412023312032303232000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _linkSubscriptionId (uint64): 527
Arg [1] : _vrfCoordinatorAddress (address): 0x271682DEB8C4E0901D1a1550aD2e64D568E69909
Arg [2] : _keyHash (bytes32): 0x8af398995b04c28e9951adb9721ef74c74f93e6a478f39e7e0777be13527e7ef
Arg [3] : _baselineURIMintPhase (string): ipfs://QmX2R8F28HriMENvEEhF1caLjMDfpZJN2h1fFxsAchfEYF
Arg [4] : _maxTickets (uint256): 250
Arg [5] : _mintFee (uint256): 0
Arg [6] : _dtMintStartWhitelist (uint256): 1669212000
Arg [7] : _dtMintStartPublic (uint256): 1669233600
Arg [8] : _merkleRoot (bytes32): 0x06a4118d4f37834b3a87914543a96c9b064a8ab1278e991c80a803bdca597cb5
Arg [9] : _contestDescription (string): NBA #1 2022

-----Encoded View---------------
15 Constructor Arguments found :
Arg [0] : 000000000000000000000000000000000000000000000000000000000000020f
Arg [1] : 000000000000000000000000271682deb8c4e0901d1a1550ad2e64d568e69909
Arg [2] : 8af398995b04c28e9951adb9721ef74c74f93e6a478f39e7e0777be13527e7ef
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000140
Arg [4] : 00000000000000000000000000000000000000000000000000000000000000fa
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [6] : 00000000000000000000000000000000000000000000000000000000637e2760
Arg [7] : 00000000000000000000000000000000000000000000000000000000637e7bc0
Arg [8] : 06a4118d4f37834b3a87914543a96c9b064a8ab1278e991c80a803bdca597cb5
Arg [9] : 00000000000000000000000000000000000000000000000000000000000001a0
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000035
Arg [11] : 697066733a2f2f516d583252384632384872694d454e76454568463163614c6a
Arg [12] : 4d4466705a4a4e32683166467873416368664559460000000000000000000000
Arg [13] : 000000000000000000000000000000000000000000000000000000000000000b
Arg [14] : 4e42412023312032303232000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

55986:8938:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64905:8;:6;:8::i;:::-;55986:8938;;;;;21643:305;;;;;;;;;;-1:-1:-1;21643:305:0;;;;;:::i;:::-;;:::i;:::-;;;9425:14:1;;9418:22;9400:41;;9388:2;9373:18;21643:305:0;;;;;;;;22588:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;24148:221::-;;;;;;;;;;-1:-1:-1;24148:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;7777:32:1;;;7759:51;;7747:2;7732:18;24148:221:0;7613:203:1;23671:411:0;;;;;;;;;;-1:-1:-1;23671:411:0;;;;;:::i;:::-;;:::i;64183:600::-;;;;;;:::i;:::-;;:::i;57494:25::-;;;;;;;;;;;;;;;;;;;9598::1;;;9586:2;9571:18;57494:25:0;9452:177:1;60537:93:0;;;;;;;;;;;;;:::i;46179:261::-;;;;;;;;;;-1:-1:-1;46179:261:0;;;;;:::i;:::-;;:::i;24898:339::-;;;;;;;;;;-1:-1:-1;24898:339:0;;;;;:::i;:::-;;:::i;57223:31::-;;;;;;;;;;-1:-1:-1;57223:31:0;;;;;:::i;:::-;;:::i;61791:227::-;;;;;;;;;;-1:-1:-1;61791:227:0;;;;;:::i;:::-;;:::i;56753:46::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;56753:46:0;;;;;62919:600;;;;;;;;;;-1:-1:-1;62919:600:0;;;;;:::i;:::-;;:::i;25308:185::-;;;;;;;;;;-1:-1:-1;25308:185:0;;;;;:::i;:::-;;:::i;61189:314::-;;;;;;;;;;-1:-1:-1;61189:314:0;;;;;:::i;:::-;;:::i;62024:92::-;;;;;;;;;;-1:-1:-1;62024:92:0;;;;;:::i;:::-;;:::i;59846:257::-;;;;;;:::i;:::-;;:::i;56588:22::-;;;;;;;;;;;;;;;;56900:35;;;;;;;;;;;;;;;;56284:22;;;;;;;;;;;;;;;;62811:102;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;57106:60::-;;;;;;;;;;-1:-1:-1;57106:60:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;25722:25:1;;;25778:2;25763:18;;25756:34;;;;25695:18;57106:60:0;25548:248:1;22282:239:0;;;;;;;;;;-1:-1:-1;22282:239:0;;;;;:::i;:::-;;:::i;56243:36::-;;;;;;;;;;-1:-1:-1;56243:36:0;;;;-1:-1:-1;;;;;56243:36:0;;;59250:590;;;;;;:::i;:::-;;:::i;56472:31::-;;;;;;;;;;;;;;;;22012:208;;;;;;;;;;-1:-1:-1;22012:208:0;;;;;:::i;:::-;;:::i;56111:32::-;;;;;;;;;;-1:-1:-1;56111:32:0;;;;;;48166:103;;;;;;;;;;;;;:::i;56558:25::-;;;;;;;;;;;;;;;;56723;;;;;;;;;;;;;:::i;47515:87::-;;;;;;;;;;-1:-1:-1;47588:6:0;;-1:-1:-1;;;;;47588:6:0;47515:87;;22757:104;;;;;;;;;;;;;:::i;56687:31::-;;;;;;;;;;-1:-1:-1;56687:31:0;;;;;;;;;;;56652:30;;;;;;;;;;-1:-1:-1;56652:30:0;;;;;;;;56435:32;;;;;;;;;;-1:-1:-1;56435:32:0;;;;;:::i;:::-;;:::i;24441:155::-;;;;;;;;;;-1:-1:-1;24441:155:0;;;;;:::i;:::-;;:::i;60403:128::-;;;;;;;;;;;;;:::i;57171:47::-;;;;;;;;;;-1:-1:-1;57171:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;63525:652;;;;;;:::i;:::-;;:::i;60109:288::-;;;;;;;;;;-1:-1:-1;60109:288:0;;;;;:::i;:::-;;:::i;25564:328::-;;;;;;;;;;-1:-1:-1;25564:328:0;;;;;:::i;:::-;;:::i;60740:443::-;;;;;;;;;;-1:-1:-1;60740:443:0;;;;;:::i;:::-;;:::i;64789:73::-;;;:::i;56940:32::-;;;;;;;;;;;;;;;;56206;;;;;;;;;;-1:-1:-1;56206:32:0;;;;-1:-1:-1;;;56206:32:0;;;;;;;;;25975:18:1;25963:31;;;25945:50;;25933:2;25918:18;56206:32:0;25801:200:1;62122:446:0;;;;;;;;;;;;;:::i;24667:164::-;;;;;;;;;;-1:-1:-1;24667:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;24788:25:0;;;24764:4;24788:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;24667:164;56615:32;;;;;;;;;;;;;:::i;48424:201::-;;;;;;;;;;-1:-1:-1;48424:201:0;;;;;:::i;:::-;;:::i;56508:24::-;;;;;;;;;;;;;;;;64789:73;64834:22;;64846:9;9598:25:1;;64834:22:0;;9586:2:1;9571:18;64834:22:0;;;;;;;64789:73::o;21643:305::-;21745:4;-1:-1:-1;;;;;;21782:40:0;;-1:-1:-1;;;21782:40:0;;:105;;-1:-1:-1;;;;;;;21839:48:0;;-1:-1:-1;;;21839:48:0;21782:105;:158;;;-1:-1:-1;;;;;;;;;;20175:40:0;;;21904:36;21762:178;21643:305;-1:-1:-1;;21643:305:0:o;22588:100::-;22642:13;22675:5;22668:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22588:100;:::o;24148:221::-;24224:7;24252:16;24260:7;24252;:16::i;:::-;24244:73;;;;-1:-1:-1;;;24244:73:0;;20580:2:1;24244:73:0;;;20562:21:1;20619:2;20599:18;;;20592:30;20658:34;20638:18;;;20631:62;-1:-1:-1;;;20709:18:1;;;20702:42;20761:19;;24244:73:0;;;;;;;;;-1:-1:-1;24337:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;24337:24:0;;24148:221::o;23671:411::-;23752:13;23768:23;23783:7;23768:14;:23::i;:::-;23752:39;;23816:5;-1:-1:-1;;;;;23810:11:0;:2;-1:-1:-1;;;;;23810:11:0;;;23802:57;;;;-1:-1:-1;;;23802:57:0;;22971:2:1;23802:57:0;;;22953:21:1;23010:2;22990:18;;;22983:30;23049:34;23029:18;;;23022:62;-1:-1:-1;;;23100:18:1;;;23093:31;23141:19;;23802:57:0;22769:397:1;23802:57:0;16929:10;-1:-1:-1;;;;;23894:21:0;;;;:62;;-1:-1:-1;23919:37:0;23936:5;16929:10;24667:164;:::i;23919:37::-;23872:168;;;;-1:-1:-1;;;23872:168:0;;17796:2:1;23872:168:0;;;17778:21:1;17835:2;17815:18;;;17808:30;17874:34;17854:18;;;17847:62;17945:26;17925:18;;;17918:54;17989:19;;23872:168:0;17594:420:1;23872:168:0;24053:21;24062:2;24066:7;24053:8;:21::i;:::-;23741:341;23671:411;;:::o;64183:600::-;47588:6;;-1:-1:-1;;;;;47588:6:0;16929:10;47735:23;47727:68;;;;-1:-1:-1;;;47727:68:0;;;;;;;:::i;:::-;64292:17:::1;64300:8;64292:7;:17::i;:::-;64284:57;;;;-1:-1:-1::0;;;64284:57:0::1;;;;;;;:::i;:::-;64348:12;64393:33:::0;;;:23:::1;:33;::::0;;;;:38:::1;;::::0;64363:15:::1;::::0;64393:43;;::::1;::::0;:105:::1;;-1:-1:-1::0;64450:33:0::1;::::0;;;:23:::1;:33;::::0;;;;:38:::1;;::::0;64491:7:::1;::::0;64440:48:::1;::::0;:7;:48:::1;:::i;:::-;:58;64393:105;64385:176;;;::::0;-1:-1:-1;;;64385:176:0;;22192:2:1;64385:176:0::1;::::0;::::1;22174:21:1::0;22231:2;22211:18;;;22204:30;22270:34;22250:18;;;22243:62;22341:27;22321:18;;;22314:55;22386:19;;64385:176:0::1;21990:421:1::0;64385:176:0::1;64568:14;64585:33:::0;;;:23:::1;:33;::::0;;;;;:40;;64632:44;;;;64700:36;;64585:40;;64568:14;-1:-1:-1;;;;;64700:17:0;::::1;::::0;64585:40;;64568:14;64700:36;64568:14;64700:36;64585:40;64700:17;:36:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64683:54;;;64752:4;64744:33;;;::::0;-1:-1:-1;;;64744:33:0;;23728:2:1;64744:33:0::1;::::0;::::1;23710:21:1::0;23767:2;23747:18;;;23740:30;-1:-1:-1;;;23786:18:1;;;23779:46;23842:18;;64744:33:0::1;23526:340:1::0;64744:33:0::1;64277:506;;;64183:600:::0;;:::o;60537:93::-;60583:7;60606:18;:8;52722:14;;52630:114;60606:18;60599:25;;60537:93;:::o;46179:261::-;46279:10;-1:-1:-1;;;;;46293:14:0;46279:28;;46275:111;;46325:53;;-1:-1:-1;;;46325:53:0;;46351:10;46325:53;;;8033:34:1;-1:-1:-1;;;;;46363:14:0;8103:15:1;8083:18;;;8076:43;7968:18;;46325:53:0;7821:304:1;46275:111:0;46392:42;46411:9;46422:11;46392:18;:42::i;:::-;46179:261;;:::o;24898:339::-;25093:41;16929:10;25126:7;25093:18;:41::i;:::-;25085:103;;;;-1:-1:-1;;;25085:103:0;;;;;;;:::i;:::-;25201:28;25211:4;25217:2;25221:7;25201:9;:28::i;57223:31::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57223:31:0;:::o;61791:227::-;47588:6;;-1:-1:-1;;;;;47588:6:0;16929:10;47735:23;47727:68;;;;-1:-1:-1;;;47727:68:0;;;;;;;:::i;:::-;61885:12:::1;61881:132;;;61910:17;:28:::0;-1:-1:-1;46179:261:0:o;61881:132::-:1;61972:20;:31:::0;-1:-1:-1;61791:227:0:o;62919:600::-;47588:6;;-1:-1:-1;;;;;47588:6:0;16929:10;47735:23;47727:68;;;;-1:-1:-1;;;47727:68:0;;;;;;;:::i;:::-;62997:22:::1;63005:13:::0;::::1;62997:7;:22::i;:::-;62989:62;;;;-1:-1:-1::0;;;62989:62:0::1;;;;;;;:::i;:::-;63090:13:::0;::::1;63066:38;::::0;;;:23:::1;:38;::::0;;;;:45;:50;:102;::::1;;;-1:-1:-1::0;63144:13:0;::::1;63120:38;::::0;;;:23:::1;:38;::::0;;;;:43:::1;;::::0;:48;63066:102:::1;63058:145;;;::::0;-1:-1:-1;;;63058:145:0;;25209:2:1;63058:145:0::1;::::0;::::1;25191:21:1::0;25248:2;25228:18;;;25221:30;25287:32;25267:18;;;25260:60;25337:18;;63058:145:0::1;25007:354:1::0;63058:145:0::1;63218:11;::::0;::::1;::::0;::::1;;;63210:45;;;::::0;-1:-1:-1;;;63210:45:0;;14806:2:1;63210:45:0::1;::::0;::::1;14788:21:1::0;14845:2;14825:18;;;14818:30;-1:-1:-1;;;14864:18:1;;;14857:51;14925:18;;63210:45:0::1;14604:345:1::0;63210:45:0::1;63328:34;::::0;;;;::::1;::::0;;63338:14:::1;::::0;;::::1;;63328:34:::0;;;63277:15:::1;63328:34:::0;;::::1;::::0;;;63393:13;::::1;63262:12;63369:38:::0;;;:23:::1;:38:::0;;;;;;:50;;;;;;::::1;::::0;;::::1;::::0;63426:14:::1;:34:::0;;;;::::1;::::0;;;;;;;::::1;::::0;;;63472:41;;63277:15;;63338:14;;63472:41:::1;::::0;::::1;62982:537;;62919:600:::0;:::o;25308:185::-;25446:39;25463:4;25469:2;25473:7;25446:39;;;;;;;;;;;;:16;:39::i;61189:314::-;61250:7;61274:16;61282:7;61274;:16::i;:::-;61266:56;;;;-1:-1:-1;;;61266:56:0;;;;;;;:::i;:::-;61337:15;:22;61329:70;;;;-1:-1:-1;;;61329:70:0;;10605:2:1;61329:70:0;;;10587:21:1;10644:2;10624:18;;;10617:30;10683:33;10663:18;;;10656:61;10734:18;;61329:70:0;10403:355:1;61329:70:0;61446:8;52722:14;61435:7;61414:15;61430:1;61414:18;;;;;;;;:::i;:::-;;;;;;;;;:28;;;;:::i;:::-;61413:51;;;;:::i;:::-;:55;;61467:1;61413:55;:::i;62024:92::-;47588:6;;-1:-1:-1;;;;;47588:6:0;16929:10;47735:23;47727:68;;;;-1:-1:-1;;;47727:68:0;;;;;;;:::i;:::-;62092:7:::1;:18:::0;62024:92::o;59846:257::-;50803:1;51401:7;;:19;;51393:63;;;;-1:-1:-1;;;51393:63:0;;;;;;;:::i;:::-;50803:1;51534:7;:18;59930:17:::1;::::0;59951:15:::1;-1:-1:-1::0;59930:36:0::1;59922:92;;;;-1:-1:-1::0;;;59922:92:0::1;;;;;;;:::i;:::-;60021:37;60031:8;60041:9;60052:5;60021:9;:37::i;:::-;60065:32;60076:8;60086:10;60065;:32::i;:::-;-1:-1:-1::0;50759:1:0;51713:7;:22;59846:257::o;62811:102::-;62860:16;62892:15;62885:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62811:102;:::o;22282:239::-;22354:7;22390:16;;;:7;:16;;;;;;-1:-1:-1;;;;;22390:16:0;22425:19;22417:73;;;;-1:-1:-1;;;22417:73:0;;19042:2:1;22417:73:0;;;19024:21:1;19081:2;19061:18;;;19054:30;19120:34;19100:18;;;19093:62;-1:-1:-1;;;19171:18:1;;;19164:39;19220:19;;22417:73:0;18840:405:1;59250:590:0;50803:1;51401:7;;:19;;51393:63;;;;-1:-1:-1;;;51393:63:0;;;;;;;:::i;:::-;50803:1;51534:7;:18;59370:20:::1;::::0;59394:15:::1;-1:-1:-1::0;59370:39:0::1;59362:95;;;;-1:-1:-1::0;;;59362:95:0::1;;;;;;;:::i;:::-;59489:10;59472:28;::::0;;;:16:::1;:28;::::0;;;;;::::1;;:37;59464:91;;;::::0;-1:-1:-1;;;59464:91:0;;18221:2:1;59464:91:0::1;::::0;::::1;18203:21:1::0;18260:2;18240:18;;;18233:30;18299:34;18279:18;;;18272:62;-1:-1:-1;;;18350:18:1;;;18343:39;18399:19;;59464:91:0::1;18019:405:1::0;59464:91:0::1;59562:36;59572:8;59582:9;59593:4;59562:9;:36::i;:::-;59631:28;::::0;-1:-1:-1;;59648:10:0::1;6843:2:1::0;6839:15;6835:53;59631:28:0::1;::::0;::::1;6823:66:1::0;59605:12:0::1;::::0;6905::1;;59631:28:0::1;;;;;;;;;;;;59620:41;;;;;;59605:56;;59676:50;59695:12;;59676:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;59709:10:0::1;::::0;;-1:-1:-1;59721:4:0;;-1:-1:-1;59676:18:0::1;:50::i;:::-;59668:83;;;::::0;-1:-1:-1;;;59668:83:0;;13694:2:1;59668:83:0::1;::::0;::::1;13676:21:1::0;13733:2;13713:18;;;13706:30;-1:-1:-1;;;13752:18:1;;;13745:50;13812:18;;59668:83:0::1;13492:344:1::0;59668:83:0::1;59775:10;59758:28;::::0;;;:16:::1;:28;::::0;;;;:35;;-1:-1:-1;;59758:35:0::1;59789:4;59758:35;::::0;;59800:32:::1;::::0;59811:8;;59800:10:::1;:32::i;:::-;-1:-1:-1::0;;50759:1:0;51713:7;:22;-1:-1:-1;;59250:590:0:o;22012:208::-;22084:7;-1:-1:-1;;;;;22112:19:0;;22104:74;;;;-1:-1:-1;;;22104:74:0;;18631:2:1;22104:74:0;;;18613:21:1;18670:2;18650:18;;;18643:30;18709:34;18689:18;;;18682:62;-1:-1:-1;;;18760:18:1;;;18753:40;18810:19;;22104:74:0;18429:406:1;22104:74:0;-1:-1:-1;;;;;;22196:16:0;;;;;:9;:16;;;;;;;22012:208::o;48166:103::-;47588:6;;-1:-1:-1;;;;;47588:6:0;16929:10;47735:23;47727:68;;;;-1:-1:-1;;;47727:68:0;;;;;;;:::i;:::-;48231:30:::1;48258:1;48231:18;:30::i;:::-;48166:103::o:0;56723:25::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;22757:104::-;22813:13;22846:7;22839:14;;;;;:::i;56435:32::-;;;;;;;;;;;;24441:155;24536:52;16929:10;24569:8;24579;24536:18;:52::i;60403:128::-;47588:6;;-1:-1:-1;;;;;47588:6:0;16929:10;47735:23;47727:68;;;;-1:-1:-1;;;47727:68:0;;;;;;;:::i;:::-;60466:11:::1;::::0;::::1;;60458:41;;;::::0;-1:-1:-1;;;60458:41:0;;13348:2:1;60458:41:0::1;::::0;::::1;13330:21:1::0;13387:2;13367:18;;;13360:30;-1:-1:-1;;;13406:18:1;;;13399:47;13463:18;;60458:41:0::1;13146:341:1::0;60458:41:0::1;60506:11;:19:::0;;-1:-1:-1;;60506:19:0::1;::::0;;60403:128::o;63525:652::-;50803:1;51401:7;;:19;;51393:63;;;;-1:-1:-1;;;51393:63:0;;;;;;;:::i;:::-;50803:1;51534:7;:18;63612:17:::1;63620:8:::0;63612:7:::1;:17::i;:::-;63604:57;;;;-1:-1:-1::0;;;63604:57:0::1;;;;;;;:::i;:::-;63697:10;63676:17;63684:8:::0;63676:7:::1;:17::i;:::-;-1:-1:-1::0;;;;;63676:31:0::1;;63668:56;;;::::0;-1:-1:-1;;;63668:56:0;;11779:2:1;63668:56:0::1;::::0;::::1;11761:21:1::0;11818:2;11798:18;;;11791:30;-1:-1:-1;;;11837:18:1;;;11830:42;11889:18;;63668:56:0::1;11577:336:1::0;63668:56:0::1;63780:1;63739:33:::0;;;:23:::1;:33;::::0;;;;:38:::1;;::::0;63731:84:::1;;;::::0;-1:-1:-1;;;63731:84:0;;24851:2:1;63731:84:0::1;::::0;::::1;24833:21:1::0;24890:2;24870:18;;;24863:30;24929:31;24909:18;;;24902:59;24978:18;;63731:84:0::1;24649:353:1::0;63731:84:0::1;63873:1;63830:33:::0;;;:23:::1;:33;::::0;;;;:40;63822:79:::1;;;::::0;-1:-1:-1;;;63822:79:0;;17445:2:1;63822:79:0::1;::::0;::::1;17427:21:1::0;17484:2;17464:18;;;17457:30;-1:-1:-1;;;17503:18:1;;;17496:52;17565:18;;63822:79:0::1;17243:346:1::0;63822:79:0::1;63908:14;63925:33:::0;;;:23:::1;:33;::::0;;;;;:40;;63972:44;;;;64028;;63925:40;;;;64053:10:::1;::::0;63949:8;;64028:44:::1;::::0;63908:14;64028:44:::1;64096:34;::::0;64080:9:::1;::::0;64096:10:::1;::::0;64119:6;;64080:9;64096:34;64080:9;64096:34;64119:6;64096:10;:34:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64079:52;;;64146:4;64138:33;;;::::0;-1:-1:-1;;;64138:33:0;;23728:2:1;64138:33:0::1;::::0;::::1;23710:21:1::0;23767:2;23747:18;;;23740:30;-1:-1:-1;;;23786:18:1;;;23779:46;23842:18;;64138:33:0::1;23526:340:1::0;64138:33:0::1;-1:-1:-1::0;;50759:1:0;51713:7;:22;-1:-1:-1;63525:652:0:o;60109:288::-;47588:6;;-1:-1:-1;;;;;47588:6:0;16929:10;47735:23;47727:68;;;;-1:-1:-1;;;47727:68:0;;;;;;;:::i;:::-;60198:11:::1;::::0;::::1;::::0;::::1;;;60197:12;60189:49;;;::::0;-1:-1:-1;;;60189:49:0;;22618:2:1;60189:49:0::1;::::0;::::1;22600:21:1::0;22657:2;22637:18;;;22630:30;22696:26;22676:18;;;22669:54;22740:18;;60189:49:0::1;22416:348:1::0;60189:49:0::1;60253:15;:22:::0;60245:89:::1;;;::::0;-1:-1:-1;;;60245:89:0;;19452:2:1;60245:89:0::1;::::0;::::1;19434:21:1::0;19491:2;19471:18;;;19464:30;19530:34;19510:18;;;19503:62;-1:-1:-1;;;19581:18:1;;;19574:48;19639:19;;60245:89:0::1;19250:414:1::0;60245:89:0::1;60341:25:::0;;::::1;::::0;:11:::1;::::0;:25:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;;60373:11:0::1;:18:::0;;-1:-1:-1;;60373:18:0::1;;;::::0;;60109:288::o;25564:328::-;25739:41;16929:10;25772:7;25739:18;:41::i;:::-;25731:103;;;;-1:-1:-1;;;25731:103:0;;;;;;;:::i;:::-;25845:39;25859:4;25865:2;25869:7;25878:5;25845:13;:39::i;:::-;25564:328;;;;:::o;60740:443::-;60813:13;60843:16;60851:7;60843;:16::i;:::-;60835:56;;;;-1:-1:-1;;;60835:56:0;;;;;;;:::i;:::-;60898:21;60922:10;:8;:10::i;:::-;60944:11;;60898:34;;-1:-1:-1;60944:11:0;;;;;60939:49;;60973:7;60740:443;-1:-1:-1;;60740:443:0:o;60939:49::-;60994:14;61011:22;61025:7;61011:13;:22::i;:::-;60994:39;;61040:17;61084:7;61093:24;61110:6;61093:16;:24::i;:::-;61067:51;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;61067:51:0;;;;;;61162:13;;;;;;;;-1:-1:-1;;;61067:51:0;61162:13;;;;;;;61140:36;;61067:51;;-1:-1:-1;61140:36:0;;61067:51;;;;61140:36;;:::i;:::-;;;;;;;;;;;;;61126:51;;;;;60740:443;;;:::o;62122:446::-;47588:6;;-1:-1:-1;;;;;47588:6:0;16929:10;47735:23;47727:68;;;;-1:-1:-1;;;47727:68:0;;;;;;;:::i;:::-;62187:11:::1;::::0;::::1;;62186:12;62178:66;;;;-1:-1:-1::0;;;62178:66:0::1;;;;;;;:::i;:::-;62259:15;:22:::0;:27;62251:73:::1;;;::::0;-1:-1:-1;;;62251:73:0;;12539:2:1;62251:73:0::1;::::0;::::1;12521:21:1::0;12578:2;12558:18;;;12551:30;12617:34;12597:18;;;12590:62;-1:-1:-1;;;12668:18:1;;;12661:31;12709:19;;62251:73:0::1;12337:397:1::0;62251:73:0::1;62360:1;62339:18;:8;52722:14:::0;;52630:114;62339:18:::1;:22;62331:61;;;::::0;-1:-1:-1;;;62331:61:0;;23373:2:1;62331:61:0::1;::::0;::::1;23355:21:1::0;23412:2;23392:18;;;23385:30;23451:28;23431:18;;;23424:56;23497:18;;62331:61:0::1;23171:350:1::0;62331:61:0::1;62411:11;::::0;62450:7:::1;::::0;62411:151:::1;::::0;-1:-1:-1;;;62411:151:0;;::::1;::::0;::::1;9885:25:1::0;;;;-1:-1:-1;;;62466:18:0;::::1;;;9926::1::0;;;9919:59;56396:1:0::1;9994:18:1::0;;;9987:47;56346:6:0::1;10079:18:1::0;;;10072:43;62411:11:0;10131:19:1;;;10124:44;-1:-1:-1;;;;;62411:11:0;;::::1;::::0;:30:::1;::::0;9857:19:1;;62411:151:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;62399:9;:163:::0;62122:446::o;56615:32::-;;;;;;;:::i;48424:201::-;47588:6;;-1:-1:-1;;;;;47588:6:0;16929:10;47735:23;47727:68;;;;-1:-1:-1;;;47727:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;48513:22:0;::::1;48505:73;;;::::0;-1:-1:-1;;;48505:73:0;;12941:2:1;48505:73:0::1;::::0;::::1;12923:21:1::0;12980:2;12960:18;;;12953:30;13019:34;12999:18;;;12992:62;-1:-1:-1;;;13070:18:1;;;13063:36;13116:19;;48505:73:0::1;12739:402:1::0;48505:73:0::1;48589:28;48608:8;48589:18;:28::i;:::-;48424:201:::0;:::o;27402:127::-;27467:4;27491:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27491:16:0;:30;;;27402:127::o;31548:174::-;31623:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;31623:29:0;-1:-1:-1;;;;;31623:29:0;;;;;;;;:24;;31677:23;31623:24;31677:14;:23::i;:::-;-1:-1:-1;;;;;31668:46:0;;;;;;;;;;;31548:174;;:::o;62574:231::-;62706:11;;;;62705:12;62697:66;;;;-1:-1:-1;;;62697:66:0;;;;;;;:::i;:::-;62770:29;;;;:15;;:29;;;;;:::i;27696:348::-;27789:4;27814:16;27822:7;27814;:16::i;:::-;27806:73;;;;-1:-1:-1;;;27806:73:0;;16676:2:1;27806:73:0;;;16658:21:1;16715:2;16695:18;;;16688:30;16754:34;16734:18;;;16727:62;-1:-1:-1;;;16805:18:1;;;16798:42;16857:19;;27806:73:0;16474:408:1;27806:73:0;27890:13;27906:23;27921:7;27906:14;:23::i;:::-;27890:39;;27959:5;-1:-1:-1;;;;;27948:16:0;:7;-1:-1:-1;;;;;27948:16:0;;:52;;;-1:-1:-1;;;;;;24788:25:0;;;24764:4;24788:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;27968:32;27948:87;;;;28028:7;-1:-1:-1;;;;;28004:31:0;:20;28016:7;28004:11;:20::i;:::-;-1:-1:-1;;;;;28004:31:0;;27948:87;27940:96;27696:348;-1:-1:-1;;;;27696:348:0:o;30805:625::-;30964:4;-1:-1:-1;;;;;30937:31:0;:23;30952:7;30937:14;:23::i;:::-;-1:-1:-1;;;;;30937:31:0;;30929:81;;;;-1:-1:-1;;;30929:81:0;;14043:2:1;30929:81:0;;;14025:21:1;14082:2;14062:18;;;14055:30;14121:34;14101:18;;;14094:62;-1:-1:-1;;;14172:18:1;;;14165:35;14217:19;;30929:81:0;13841:401:1;30929:81:0;-1:-1:-1;;;;;31029:16:0;;31021:65;;;;-1:-1:-1;;;31021:65:0;;15501:2:1;31021:65:0;;;15483:21:1;15540:2;15520:18;;;15513:30;15579:34;15559:18;;;15552:62;-1:-1:-1;;;15630:18:1;;;15623:34;15674:19;;31021:65:0;15299:400:1;31021:65:0;31099:39;31120:4;31126:2;31130:7;31099:20;:39::i;:::-;31203:29;31220:1;31224:7;31203:8;:29::i;:::-;-1:-1:-1;;;;;31245:15:0;;;;;;:9;:15;;;;;:20;;31264:1;;31245:15;:20;;31264:1;;31245:20;:::i;:::-;;;;-1:-1:-1;;;;;;;31276:13:0;;;;;;:9;:13;;;;;:18;;31293:1;;31276:13;:18;;31293:1;;31276:18;:::i;:::-;;;;-1:-1:-1;;31305:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;31305:21:0;-1:-1:-1;;;;;31305:21:0;;;;;;;;;31344:27;;31305:16;;31344:27;;;;;;;23741:341;23671:411;;:::o;58644:600::-;58737:11;;;;58729:41;;;;-1:-1:-1;;;58729:41:0;;13348:2:1;58729:41:0;;;13330:21:1;13387:2;13367:18;;;13360:30;-1:-1:-1;;;13406:18:1;;;13399:47;13463:18;;58729:41:0;13146:341:1;58729:41:0;58796:1;58785:8;:12;58777:44;;;;-1:-1:-1;;;58777:44:0;;19871:2:1;58777:44:0;;;19853:21:1;19910:2;19890:18;;;19883:30;-1:-1:-1;;;19929:18:1;;;19922:49;19988:18;;58777:44:0;19669:343:1;58777:44:0;58832:11;58828:225;;;56846:1;58862:8;:29;;58854:89;;;;-1:-1:-1;;;58854:89:0;;;;;;;:::i;:::-;58828:225;;;58991:2;58979:8;:14;;58971:74;;;;-1:-1:-1;;;58971:74:0;;;;;;;:::i;:::-;59100:10;;59088:8;59067:18;:8;52722:14;;52630:114;59067:18;:29;;;;:::i;:::-;:43;;59059:115;;;;-1:-1:-1;;;59059:115:0;;21764:2:1;59059:115:0;;;21746:21:1;21803:2;21783:18;;;21776:30;21842:34;21822:18;;;21815:62;21913:29;21893:18;;;21886:57;21960:19;;59059:115:0;21562:423:1;59059:115:0;59209:8;59199:7;;:18;;;;:::i;:::-;59189:6;:28;;59181:57;;;;-1:-1:-1;;;59181:57:0;;15156:2:1;59181:57:0;;;15138:21:1;15195:2;15175:18;;;15168:30;-1:-1:-1;;;15214:18:1;;;15207:46;15270:18;;59181:57:0;14954:340:1;58412:226:0;58483:8;58478:155;58501:8;58497:1;:12;;;58478:155;;;58525:20;:8;52841:19;;52859:1;52841:19;;;52752:127;58525:20;58554:17;58574:18;:8;52722:14;;52630:114;58574:18;58554:38;;58601:24;58607:6;58615:9;58601:5;:24::i;:::-;-1:-1:-1;58511:3:0;;;;:::i;:::-;;;;58478:155;;54451:190;54576:4;54629;54600:25;54613:5;54620:4;54600:12;:25::i;:::-;:33;;54451:190;-1:-1:-1;;;;54451:190:0:o;48785:191::-;48878:6;;;-1:-1:-1;;;;;48895:17:0;;;-1:-1:-1;;;;;;48895:17:0;;;;;;;48928:40;;48878:6;;;48895:17;48878:6;;48928:40;;48859:16;;48928:40;48848:128;48785:191;:::o;31864:315::-;32019:8;-1:-1:-1;;;;;32010:17:0;:5;-1:-1:-1;;;;;32010:17:0;;;32002:55;;;;-1:-1:-1;;;32002:55:0;;15906:2:1;32002:55:0;;;15888:21:1;15945:2;15925:18;;;15918:30;15984:27;15964:18;;;15957:55;16029:18;;32002:55:0;15704:349:1;32002:55:0;-1:-1:-1;;;;;32068:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;32068:46:0;;;;;;;;;;32130:41;;9400::1;;;32130::0;;9373:18:1;32130:41:0;;;;;;;31864:315;;;:::o;26774:::-;26931:28;26941:4;26947:2;26951:7;26931:9;:28::i;:::-;26978:48;27001:4;27007:2;27011:7;27020:5;26978:22;:48::i;:::-;26970:111;;;;-1:-1:-1;;;26970:111:0;;;;;;;:::i;60636:98::-;60688:13;60717:11;60710:18;;;;;:::i;17436:723::-;17492:13;17713:10;17709:53;;-1:-1:-1;;17740:10:0;;;;;;;;;;;;-1:-1:-1;;;17740:10:0;;;;;17436:723::o;17709:53::-;17787:5;17772:12;17828:78;17835:9;;17828:78;;17861:8;;;;:::i;:::-;;-1:-1:-1;17884:10:0;;-1:-1:-1;17892:2:0;17884:10;;:::i;:::-;;;17828:78;;;17916:19;17948:6;17938:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17938:17:0;;17916:39;;17966:154;17973:10;;17966:154;;18000:11;18010:1;18000:11;;:::i;:::-;;-1:-1:-1;18069:10:0;18077:2;18069:5;:10;:::i;:::-;18056:24;;:2;:24;:::i;:::-;18043:39;;18026:6;18033;18026:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;18026:56:0;;;;;;;;-1:-1:-1;18097:11:0;18106:2;18097:11;;:::i;:::-;;;17966:154;;61509:274;61659:14;:21;:26;61651:72;;;;-1:-1:-1;;;61651:72:0;;11377:2:1;61651:72:0;;;11359:21:1;11416:2;11396:18;;;11389:30;11455:34;11435:18;;;11428:62;-1:-1:-1;;;11506:18:1;;;11499:31;11547:19;;61651:72:0;11175:397:1;29380:439:0;-1:-1:-1;;;;;29460:16:0;;29452:61;;;;-1:-1:-1;;;29452:61:0;;20219:2:1;29452:61:0;;;20201:21:1;;;20238:18;;;20231:30;20297:34;20277:18;;;20270:62;20349:18;;29452:61:0;20017:356:1;29452:61:0;29533:16;29541:7;29533;:16::i;:::-;29532:17;29524:58;;;;-1:-1:-1;;;29524:58:0;;14449:2:1;29524:58:0;;;14431:21:1;14488:2;14468:18;;;14461:30;14527;14507:18;;;14500:58;14575:18;;29524:58:0;14247:352:1;29524:58:0;29595:45;29624:1;29628:2;29632:7;29595:20;:45::i;:::-;-1:-1:-1;;;;;29653:13:0;;;;;;:9;:13;;;;;:18;;29670:1;;29653:13;:18;;29670:1;;29653:18;:::i;:::-;;;;-1:-1:-1;;29682:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;29682:21:0;-1:-1:-1;;;;;29682:21:0;;;;;;;;29721:33;;29682:16;;;29721:33;;29682:16;;29721:33;46179:261;;:::o;55002:675::-;55085:7;55128:4;55085:7;55143:497;55167:5;:12;55163:1;:16;55143:497;;;55201:20;55224:5;55230:1;55224:8;;;;;;;;:::i;:::-;;;;;;;55201:31;;55267:12;55251;:28;55247:382;;55753:13;55803:15;;;55839:4;55832:15;;;55886:4;55870:21;;55379:57;;55247:382;;;55753:13;55803:15;;;55839:4;55832:15;;;55886:4;55870:21;;55556:57;;55247:382;-1:-1:-1;55181:3:0;;;;:::i;:::-;;;;55143:497;;;-1:-1:-1;55657:12:0;55002:675;-1:-1:-1;;;55002:675:0:o;32744:799::-;32899:4;-1:-1:-1;;;;;32920:13:0;;9187:19;:23;32916:620;;32956:72;;-1:-1:-1;;;32956:72:0;;-1:-1:-1;;;;;32956:36:0;;;;;:72;;16929:10;;33007:4;;33013:7;;33022:5;;32956:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32956:72:0;;;;;;;;-1:-1:-1;;32956:72:0;;;;;;;;;;;;:::i;:::-;;;32952:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33198:13:0;;33194:272;;33241:60;;-1:-1:-1;;;33241:60:0;;;;;;;:::i;33194:272::-;33416:6;33410:13;33401:6;33397:2;33393:15;33386:38;32952:529;-1:-1:-1;;;;;;33079:51:0;-1:-1:-1;;;33079:51:0;;-1:-1:-1;33072:58:0;;32916:620;-1:-1:-1;33520:4:0;32744:799;;;;;;:::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:160::-;668:20;;724:13;;717:21;707:32;;697:60;;753:1;750;743:12;768:186;827:6;880:2;868:9;859:7;855:23;851:32;848:52;;;896:1;893;886:12;848:52;919:29;938:9;919:29;:::i;:::-;909:39;768:186;-1:-1:-1;;;768:186:1:o;959:260::-;1027:6;1035;1088:2;1076:9;1067:7;1063:23;1059:32;1056:52;;;1104:1;1101;1094:12;1056:52;1127:29;1146:9;1127:29;:::i;:::-;1117:39;;1175:38;1209:2;1198:9;1194:18;1175:38;:::i;:::-;1165:48;;959:260;;;;;:::o;1224:328::-;1301:6;1309;1317;1370:2;1358:9;1349:7;1345:23;1341:32;1338:52;;;1386:1;1383;1376:12;1338:52;1409:29;1428:9;1409:29;:::i;:::-;1399:39;;1457:38;1491:2;1480:9;1476:18;1457:38;:::i;:::-;1447:48;;1542:2;1531:9;1527:18;1514:32;1504:42;;1224:328;;;;;:::o;1557:666::-;1652:6;1660;1668;1676;1729:3;1717:9;1708:7;1704:23;1700:33;1697:53;;;1746:1;1743;1736:12;1697:53;1769:29;1788:9;1769:29;:::i;:::-;1759:39;;1817:38;1851:2;1840:9;1836:18;1817:38;:::i;:::-;1807:48;;1902:2;1891:9;1887:18;1874:32;1864:42;;1957:2;1946:9;1942:18;1929:32;1984:18;1976:6;1973:30;1970:50;;;2016:1;2013;2006:12;1970:50;2039:22;;2092:4;2084:13;;2080:27;-1:-1:-1;2070:55:1;;2121:1;2118;2111:12;2070:55;2144:73;2209:7;2204:2;2191:16;2186:2;2182;2178:11;2144:73;:::i;:::-;2134:83;;;1557:666;;;;;;;:::o;2228:254::-;2293:6;2301;2354:2;2342:9;2333:7;2329:23;2325:32;2322:52;;;2370:1;2367;2360:12;2322:52;2393:29;2412:9;2393:29;:::i;:::-;2383:39;;2441:35;2472:2;2461:9;2457:18;2441:35;:::i;2487:254::-;2555:6;2563;2616:2;2604:9;2595:7;2591:23;2587:32;2584:52;;;2632:1;2629;2622:12;2584:52;2655:29;2674:9;2655:29;:::i;:::-;2645:39;2731:2;2716:18;;;;2703:32;;-1:-1:-1;;;2487:254:1:o;2746:248::-;2811:6;2819;2872:2;2860:9;2851:7;2847:23;2843:32;2840:52;;;2888:1;2885;2878:12;2840:52;2911:26;2927:9;2911:26;:::i;2999:180::-;3058:6;3111:2;3099:9;3090:7;3086:23;3082:32;3079:52;;;3127:1;3124;3117:12;3079:52;-1:-1:-1;3150:23:1;;2999:180;-1:-1:-1;2999:180:1:o;3184:245::-;3242:6;3295:2;3283:9;3274:7;3270:23;3266:32;3263:52;;;3311:1;3308;3301:12;3263:52;3350:9;3337:23;3369:30;3393:5;3369:30;:::i;3434:249::-;3503:6;3556:2;3544:9;3535:7;3531:23;3527:32;3524:52;;;3572:1;3569;3562:12;3524:52;3604:9;3598:16;3623:30;3647:5;3623:30;:::i;3688:450::-;3757:6;3810:2;3798:9;3789:7;3785:23;3781:32;3778:52;;;3826:1;3823;3816:12;3778:52;3866:9;3853:23;3899:18;3891:6;3888:30;3885:50;;;3931:1;3928;3921:12;3885:50;3954:22;;4007:4;3999:13;;3995:27;-1:-1:-1;3985:55:1;;4036:1;4033;4026:12;3985:55;4059:73;4124:7;4119:2;4106:16;4101:2;4097;4093:11;4059:73;:::i;4143:192::-;4228:6;4281:2;4269:9;4260:7;4256:23;4252:32;4249:52;;;4297:1;4294;4287:12;4249:52;-1:-1:-1;4320:9:1;4143:192;-1:-1:-1;4143:192:1:o;4525:184::-;4595:6;4648:2;4636:9;4627:7;4623:23;4619:32;4616:52;;;4664:1;4661;4654:12;4616:52;-1:-1:-1;4687:16:1;;4525:184;-1:-1:-1;4525:184:1:o;4714:683::-;4809:6;4817;4825;4878:2;4866:9;4857:7;4853:23;4849:32;4846:52;;;4894:1;4891;4884:12;4846:52;4930:9;4917:23;4907:33;;4991:2;4980:9;4976:18;4963:32;5014:18;5055:2;5047:6;5044:14;5041:34;;;5071:1;5068;5061:12;5041:34;5109:6;5098:9;5094:22;5084:32;;5154:7;5147:4;5143:2;5139:13;5135:27;5125:55;;5176:1;5173;5166:12;5125:55;5216:2;5203:16;5242:2;5234:6;5231:14;5228:34;;;5258:1;5255;5248:12;5228:34;5311:7;5306:2;5296:6;5293:1;5289:14;5285:2;5281:23;5277:32;5274:45;5271:65;;;5332:1;5329;5322:12;5271:65;5363:2;5359;5355:11;5345:21;;5385:6;5375:16;;;;;4714:683;;;;;:::o;5402:1025::-;5495:6;5503;5556:2;5544:9;5535:7;5531:23;5527:32;5524:52;;;5572:1;5569;5562:12;5524:52;5608:9;5595:23;5585:33;;5637:2;5690;5679:9;5675:18;5662:32;5713:18;5754:2;5746:6;5743:14;5740:34;;;5770:1;5767;5760:12;5740:34;5808:6;5797:9;5793:22;5783:32;;5853:7;5846:4;5842:2;5838:13;5834:27;5824:55;;5875:1;5872;5865:12;5824:55;5911:2;5898:16;5933:2;5929;5926:10;5923:36;;;5939:18;;:::i;:::-;5985:2;5982:1;5978:10;5968:20;;6008:28;6032:2;6028;6024:11;6008:28;:::i;:::-;6070:15;;;6101:12;;;;6133:11;;;6163;;;6159:20;;6156:33;-1:-1:-1;6153:53:1;;;6202:1;6199;6192:12;6153:53;6224:1;6215:10;;6234:163;6248:2;6245:1;6242:9;6234:163;;;6305:17;;6293:30;;6266:1;6259:9;;;;;6343:12;;;;6375;;6234:163;;;6238:3;6416:5;6406:15;;;;;;;;5402:1025;;;;;:::o;6432:257::-;6473:3;6511:5;6505:12;6538:6;6533:3;6526:19;6554:63;6610:6;6603:4;6598:3;6594:14;6587:4;6580:5;6576:16;6554:63;:::i;:::-;6671:2;6650:15;-1:-1:-1;;6646:29:1;6637:39;;;;6678:4;6633:50;;6432:257;-1:-1:-1;;6432:257:1:o;6928:470::-;7107:3;7145:6;7139:13;7161:53;7207:6;7202:3;7195:4;7187:6;7183:17;7161:53;:::i;:::-;7277:13;;7236:16;;;;7299:57;7277:13;7236:16;7333:4;7321:17;;7299:57;:::i;:::-;7372:20;;6928:470;-1:-1:-1;;;;6928:470:1:o;8130:488::-;-1:-1:-1;;;;;8399:15:1;;;8381:34;;8451:15;;8446:2;8431:18;;8424:43;8498:2;8483:18;;8476:34;;;8546:3;8541:2;8526:18;;8519:31;;;8324:4;;8567:45;;8592:19;;8584:6;8567:45;:::i;:::-;8559:53;8130:488;-1:-1:-1;;;;;;8130:488:1:o;8623:632::-;8794:2;8846:21;;;8916:13;;8819:18;;;8938:22;;;8765:4;;8794:2;9017:15;;;;8991:2;8976:18;;;8765:4;9060:169;9074:6;9071:1;9068:13;9060:169;;;9135:13;;9123:26;;9204:15;;;;9169:12;;;;9096:1;9089:9;9060:169;;;-1:-1:-1;9246:3:1;;8623:632;-1:-1:-1;;;;;;8623:632:1:o;10179:219::-;10328:2;10317:9;10310:21;10291:4;10348:44;10388:2;10377:9;10373:18;10365:6;10348:44;:::i;10763:407::-;10965:2;10947:21;;;11004:2;10984:18;;;10977:30;11043:34;11038:2;11023:18;;11016:62;-1:-1:-1;;;11109:2:1;11094:18;;11087:41;11160:3;11145:19;;10763:407::o;11918:414::-;12120:2;12102:21;;;12159:2;12139:18;;;12132:30;12198:34;12193:2;12178:18;;12171:62;-1:-1:-1;;;12264:2:1;12249:18;;12242:48;12322:3;12307:19;;11918:414::o;16058:411::-;16260:2;16242:21;;;16299:2;16279:18;;;16272:30;16338:34;16333:2;16318:18;;16311:62;-1:-1:-1;;;16404:2:1;16389:18;;16382:45;16459:3;16444:19;;16058:411::o;16887:351::-;17089:2;17071:21;;;17128:2;17108:18;;;17101:30;17167:29;17162:2;17147:18;;17140:57;17229:2;17214:18;;16887:351::o;20791:405::-;20993:2;20975:21;;;21032:2;21012:18;;;21005:30;21071:34;21066:2;21051:18;;21044:62;-1:-1:-1;;;21137:2:1;21122:18;;21115:39;21186:3;21171:19;;20791:405::o;21201:356::-;21403:2;21385:21;;;21422:18;;;21415:30;21481:34;21476:2;21461:18;;21454:62;21548:2;21533:18;;21201:356::o;23871:413::-;24073:2;24055:21;;;24112:2;24092:18;;;24085:30;24151:34;24146:2;24131:18;;24124:62;-1:-1:-1;;;24217:2:1;24202:18;;24195:47;24274:3;24259:19;;23871:413::o;24289:355::-;24491:2;24473:21;;;24530:2;24510:18;;;24503:30;24569:33;24564:2;24549:18;;24542:61;24635:2;24620:18;;24289:355::o;26006:275::-;26077:2;26071:9;26142:2;26123:13;;-1:-1:-1;;26119:27:1;26107:40;;26177:18;26162:34;;26198:22;;;26159:62;26156:88;;;26224:18;;:::i;:::-;26260:2;26253:22;26006:275;;-1:-1:-1;26006:275:1:o;26286:128::-;26326:3;26357:1;26353:6;26350:1;26347:13;26344:39;;;26363:18;;:::i;:::-;-1:-1:-1;26399:9:1;;26286:128::o;26419:120::-;26459:1;26485;26475:35;;26490:18;;:::i;:::-;-1:-1:-1;26524:9:1;;26419:120::o;26544:168::-;26584:7;26650:1;26646;26642:6;26638:14;26635:1;26632:21;26627:1;26620:9;26613:17;26609:45;26606:71;;;26657:18;;:::i;:::-;-1:-1:-1;26697:9:1;;26544:168::o;26717:125::-;26757:4;26785:1;26782;26779:8;26776:34;;;26790:18;;:::i;:::-;-1:-1:-1;26827:9:1;;26717:125::o;26847:258::-;26919:1;26929:113;26943:6;26940:1;26937:13;26929:113;;;27019:11;;;27013:18;27000:11;;;26993:39;26965:2;26958:10;26929:113;;;27060:6;27057:1;27054:13;27051:48;;;-1:-1:-1;;27095:1:1;27077:16;;27070:27;26847:258::o;27110:380::-;27189:1;27185:12;;;;27232;;;27253:61;;27307:4;27299:6;27295:17;27285:27;;27253:61;27360:2;27352:6;27349:14;27329:18;27326:38;27323:161;;;27406:10;27401:3;27397:20;27394:1;27387:31;27441:4;27438:1;27431:15;27469:4;27466:1;27459:15;27495:135;27534:3;-1:-1:-1;;27555:17:1;;27552:43;;;27575:18;;:::i;:::-;-1:-1:-1;27622:1:1;27611:13;;27495:135::o;27635:201::-;27673:3;27701:10;27746:2;27739:5;27735:14;27773:2;27764:7;27761:15;27758:41;;;27779:18;;:::i;:::-;27828:1;27815:15;;27635:201;-1:-1:-1;;;27635:201:1:o;27841:112::-;27873:1;27899;27889:35;;27904:18;;:::i;:::-;-1:-1:-1;27938:9:1;;27841:112::o;27958:127::-;28019:10;28014:3;28010:20;28007:1;28000:31;28050:4;28047:1;28040:15;28074:4;28071:1;28064:15;28090:127;28151:10;28146:3;28142:20;28139:1;28132:31;28182:4;28179:1;28172:15;28206:4;28203:1;28196:15;28222:127;28283:10;28278:3;28274:20;28271:1;28264:31;28314:4;28311:1;28304:15;28338:4;28335:1;28328:15;28354:127;28415:10;28410:3;28406:20;28403:1;28396:31;28446:4;28443:1;28436:15;28470:4;28467:1;28460:15;28486:131;-1:-1:-1;;;;;;28560:32:1;;28550:43;;28540:71;;28607:1;28604;28597:12

Swarm Source

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