ETH Price: $3,458.58 (+2.00%)
Gas: 9 Gwei

Token

Kangaroo Country Club (KCC)
 

Overview

Max Total Supply

544 KCC

Holders

172

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
4 KCC
0x84411E36F57516F3b359d9afBCAda418f07bbCcc
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:
KangarooCountryClub

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// Sources flattened with hardhat v2.8.4 https://hardhat.org

// File contracts/Context.sol

// SPDX-License-Identifier: MIT

pragma solidity 0.8.9;

/**
 * @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 contracts/Ownable.sol


pragma solidity 0.8.9;

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

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

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

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

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

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

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

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


// File contracts/ReentrancyGuard.sol


pragma solidity 0.8.9;

/**
 * @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 make 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 contracts/interfaces/IERC165.sol


pragma solidity 0.8.9;

/**
 * @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 contracts/interfaces/IERC721.sol


pragma solidity 0.8.9;

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

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

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

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

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

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

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

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

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

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

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

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


// File contracts/interfaces/IERC721Receiver.sol


pragma solidity 0.8.9;

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


// File contracts/interfaces/IERC721Metadata.sol


pragma solidity 0.8.9;

/**
 * @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 contracts/interfaces/IERC721Enumerable.sol


pragma solidity 0.8.9;

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

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

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


// File contracts/Address.sol


pragma solidity 0.8.9;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// File contracts/Strings.sol


pragma solidity 0.8.9;

/**
 * @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 contracts/ERC165.sol


pragma solidity 0.8.9;

/**
 * @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 contracts/ERC721A.sol


pragma solidity 0.8.9;








/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata and Enumerable extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..).
 *
 * Assumes the number of issuable tokens (collection size) is capped and fits in a uint128.
 *
 * Does not support burning tokens to address(0).
 */
contract ERC721A is
    Context,
    ERC165,
    IERC721,
    IERC721Metadata,
    IERC721Enumerable
{
    using Address for address;
    using Strings for uint256;

    struct TokenOwnership {
        address addr;
        uint64 startTimestamp;
    }

    struct AddressData {
        uint128 balance;
        uint128 numberMinted;
    }

    uint256 private currentIndex = 0;

    uint256 internal immutable collectionSize;
    uint256 internal immutable maxBatchSize;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details.
    mapping(uint256 => TokenOwnership) private _ownerships;

    // Mapping owner address to address data
    mapping(address => AddressData) private _addressData;

    // 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
     * `maxBatchSize` refers to how much a minter can mint at a time.
     * `collectionSize_` refers to how many tokens are in the collection.
     */
    constructor(
        string memory name_,
        string memory symbol_,
        uint256 maxBatchSize_,
        uint256 collectionSize_
    ) {
        require(
            collectionSize_ > 0,
            "ERC721A: collection must have a nonzero supply"
        );
        require(maxBatchSize_ > 0, "ERC721A: max batch size must be nonzero");
        _name = name_;
        _symbol = symbol_;
        maxBatchSize = maxBatchSize_;
        collectionSize = collectionSize_;
    }

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

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

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     * This read function is O(collectionSize). If calling from a separate contract, be sure to test gas first.
     * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index)
        public
        view
        override
        returns (uint256)
    {
        require(index < balanceOf(owner), "ERC721A: owner index out of bounds");
        uint256 numMintedSoFar = totalSupply();
        uint256 tokenIdsIdx = 0;
        address currOwnershipAddr = address(0);
        for (uint256 i = 0; i < numMintedSoFar; i++) {
            TokenOwnership memory ownership = _ownerships[i];
            if (ownership.addr != address(0)) {
                currOwnershipAddr = ownership.addr;
            }
            if (currOwnershipAddr == owner) {
                if (tokenIdsIdx == index) {
                    return i;
                }
                tokenIdsIdx++;
            }
        }
        revert("ERC721A: unable to get token of owner by index");
    }

    /**
     * @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 ||
            interfaceId == type(IERC721Enumerable).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view override returns (uint256) {
        require(
            owner != address(0),
            "ERC721A: balance query for the zero address"
        );
        return uint256(_addressData[owner].balance);
    }

    function _numberMinted(address owner) internal view returns (uint256) {
        require(
            owner != address(0),
            "ERC721A: number minted query for the zero address"
        );
        return uint256(_addressData[owner].numberMinted);
    }

    function ownershipOf(uint256 tokenId)
        internal
        view
        returns (TokenOwnership memory)
    {
        require(_exists(tokenId), "ERC721A: owner query for nonexistent token");

        uint256 lowestTokenToCheck;
        if (tokenId >= maxBatchSize) {
            lowestTokenToCheck = tokenId - maxBatchSize + 1;
        }

        for (uint256 curr = tokenId; curr >= lowestTokenToCheck; curr--) {
            TokenOwnership memory ownership = _ownerships[curr];
            if (ownership.addr != address(0)) {
                return ownership;
            }
        }

        revert("ERC721A: unable to determine the owner of token");
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return ownershipOf(tokenId).addr;
    }

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        require(
            _exists(tokenId),
            "ERC721Metadata: URI query for nonexistent token"
        );

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

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

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

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

        _approve(to, tokenId, owner);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public override {
        _transfer(from, to, tokenId);
        require(
            _checkOnERC721Received(from, to, tokenId, _data),
            "ERC721A: 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`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return tokenId < currentIndex;
    }

    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, "");
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - there must be `quantity` tokens remaining unminted in the total collection.
     * - `to` cannot be the zero address.
     * - `quantity` cannot be larger than the max batch size.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        uint256 startTokenId = currentIndex;
        require(to != address(0), "ERC721A: mint to the zero address");
        // We know if the first token in the batch doesn't exist, the other ones don't as well, because of serial ordering.
        require(!_exists(startTokenId), "ERC721A: token already minted");
        require(quantity <= maxBatchSize, "ERC721A: quantity to mint too high");

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        AddressData memory addressData = _addressData[to];
        _addressData[to] = AddressData(
            addressData.balance + uint128(quantity),
            addressData.numberMinted + uint128(quantity)
        );
        _ownerships[startTokenId] = TokenOwnership(to, uint64(block.timestamp));

        uint256 updatedIndex = startTokenId;

        for (uint256 i = 0; i < quantity; i++) {
            emit Transfer(address(0), to, updatedIndex);
            require(
                _checkOnERC721Received(address(0), to, updatedIndex, _data),
                "ERC721A: transfer to non ERC721Receiver implementer"
            );
            updatedIndex++;
        }

        currentIndex = updatedIndex;
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * 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
    ) private {
        TokenOwnership memory prevOwnership = ownershipOf(tokenId);

        bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr ||
            getApproved(tokenId) == _msgSender() ||
            isApprovedForAll(prevOwnership.addr, _msgSender()));

        require(
            isApprovedOrOwner,
            "ERC721A: transfer caller is not owner nor approved"
        );

        require(
            prevOwnership.addr == from,
            "ERC721A: transfer from incorrect owner"
        );
        require(to != address(0), "ERC721A: transfer to the zero address");

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId, prevOwnership.addr);

        _addressData[from].balance -= 1;
        _addressData[to].balance += 1;
        _ownerships[tokenId] = TokenOwnership(to, uint64(block.timestamp));

        // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
        // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
        uint256 nextTokenId = tokenId + 1;
        if (_ownerships[nextTokenId].addr == address(0)) {
            if (_exists(nextTokenId)) {
                _ownerships[nextTokenId] = TokenOwnership(
                    prevOwnership.addr,
                    prevOwnership.startTimestamp
                );
            }
        }

        emit Transfer(from, to, tokenId);
        _afterTokenTransfers(from, to, tokenId, 1);
    }

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

    uint256 public nextOwnerToExplicitlySet = 0;

    /**
     * @dev Explicitly set `owners` to eliminate loops in future calls of ownerOf().
     */
    function _setOwnersExplicit(uint256 quantity) internal {
        uint256 oldNextOwnerToSet = nextOwnerToExplicitlySet;
        require(quantity > 0, "quantity must be nonzero");
        uint256 endIndex = oldNextOwnerToSet + quantity - 1;
        if (endIndex > collectionSize - 1) {
            endIndex = collectionSize - 1;
        }
        // We know if the last one in the group exists, all in the group exist, due to serial ordering.
        require(_exists(endIndex), "not enough minted yet for this cleanup");
        for (uint256 i = oldNextOwnerToSet; i <= endIndex; i++) {
            if (_ownerships[i].addr == address(0)) {
                TokenOwnership memory ownership = ownershipOf(i);
                _ownerships[i] = TokenOwnership(
                    ownership.addr,
                    ownership.startTimestamp
                );
            }
        }
        nextOwnerToExplicitlySet = endIndex + 1;
    }

    /**
     * @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(to).onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert(
                        "ERC721A: transfer to non ERC721Receiver implementer"
                    );
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * 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`.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
     * minting.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}


// File contracts/ControlledAccess.sol


pragma solidity 0.8.9;

/* @title ControlledAccess
 * @dev The ControlledAccess contract allows function to be restricted to users
 * that possess a signed authorization from the owner of the contract. This signed
 * message includes the user to give permission to and the contract address to prevent
 * reusing the same authorization message on different contract with same owner.
 */

contract ControlledAccess is Ownable {
    address public signerAddress;

    /*
     * @dev Requires msg.sender to have valid access message.
     * @param _v ECDSA signature parameter v.
     * @param _r ECDSA signature parameters r.
     * @param _s ECDSA signature parameters s.
     */
    modifier onlyValidAccess(
        bytes32 _r,
        bytes32 _s,
        uint8 _v
    ) {
        require(isValidAccessMessage(msg.sender, _r, _s, _v));
        _;
    }

    function setSignerAddress(address newAddress) external onlyOwner {
        signerAddress = newAddress;
    }

    /*
     * @dev Verifies if message was signed by owner to give access to _add for this contract.
     *      Assumes Geth signature prefix.
     * @param _add Address of agent with access
     * @param _v ECDSA signature parameter v.
     * @param _r ECDSA signature parameters r.
     * @param _s ECDSA signature parameters s.
     * @return Validity of access message for a given address.
     */
    function isValidAccessMessage(
        address _add,
        bytes32 _r,
        bytes32 _s,
        uint8 _v
    ) public view returns (bool) {
        bytes32 hash = keccak256(abi.encode(owner(), _add));
        bytes32 message = keccak256(
            abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)
        );
        address sig = ecrecover(message, _v, _r, _s);

        require(signerAddress == sig, "Signature does not match");

        return signerAddress == sig;
    }
}


// File contracts/KangarooCountryClub.sol


pragma solidity 0.8.9;





contract KangarooCountryClub is ERC721A, Ownable, ReentrancyGuard, ControlledAccess {
    using Strings for uint256; 
    /** Variables initialized in the constructor */
    uint256 public immutable maxPublicMintPerAddress;
    uint256 public immutable maxPresaleMintPerAddress;
    
    /** URI Variables */
    bytes32 public uriSuffix = ".json";
    string private _baseTokenURI = "";
    string public hiddenMetadataUri;

    /** Contract Functionality Variables */
    uint256 public constant mintPrice = 0.04 ether;
    uint256 public constant whitelistMintPrice = 0.03 ether;
    bool public publicSaleActive = false;
    bool public presaleActive = false;

    /** Constructor - initialize the contract by setting the name, symbol, 
        max amount an address can mint, and the total collection size. */
    constructor(
        uint256 maxBatchSize_, 
        uint256 maxPresaleBatchSize_, 
        uint256 collectionSize_
        )
        ERC721A( "Kangaroo Country Club", "KCC", maxBatchSize_, collectionSize_)
    {
        maxPublicMintPerAddress = maxBatchSize_;
        maxPresaleMintPerAddress = maxPresaleBatchSize_;
        setHiddenMetadataURI("ipfs://__CID__/hidden.json");
    }
    /** Modifier - ensures the function caller is the user */
    modifier callerIsUser() {
        require(tx.origin == msg.sender, "Caller is another contract");
        _;
    }
    /** Modifier - ensures all minting requirements are met, used in both public and presale 
        mint functions. Structure allows mintCompliance input values (_quantity, _maxPerAddress 
        and _startTime) to be function specific */
    modifier mintCompliance(uint256 _quantity, uint256 _maxPerAddress) {
        require(totalSupply() + _quantity <= collectionSize, "Max supply reached");
        require(_quantity >= 0 && _quantity <= _maxPerAddress, "Invalid mint amount"); 
        require(numberMinted(msg.sender) + _quantity <= _maxPerAddress, "Can not mint this many");
        _;
    }
    /** Public Mint Function */
    function mint(uint256 quantity)
        external
        payable
        callerIsUser
        nonReentrant
        mintCompliance(quantity, maxPublicMintPerAddress) /** Mint Complaince for Public Sale */
    {
        require(publicSaleActive, "Public sale is not live.");
        _safeMint(msg.sender, quantity);
        refundIfOver(quantity * mintPrice);
    }
    /** Presale Mint Function */
    function presaleMint(uint256 quantity, bytes32 _r, bytes32 _s, uint8 _v)
        external
        payable
        callerIsUser
        onlyValidAccess(_r, _s, _v) /** Whitelist */
        nonReentrant 
        mintCompliance(quantity, maxPresaleMintPerAddress) /** Mint Compliance for Presale */
    {
        require(presaleActive, "Presale is not live.");
        _safeMint(msg.sender, quantity);
        refundIfOver(quantity * whitelistMintPrice);
    }

    /** Metadata URI */
    function _baseURI() internal view virtual override returns (string memory) {
        return _baseTokenURI;
    }

    /** Total number of NFTs minted from the contract for a given address. Value can only increase and
        does not depend on how many NFTs are in your wallet */
    function numberMinted(address owner) public view returns (uint256) {
        return _numberMinted(owner);
    }

    /** Get the owner of a specific token from the tokenId */
    function getOwnershipData(uint256 tokenId)
        external
        view
        returns (TokenOwnership memory)
    {
        return ownershipOf(tokenId);
    }

    /**  Refund function which requires the minimum amount for the transaction and returns any extra payment to the sender */
    function refundIfOver(uint256 price) private {
        require(msg.value >= price, "Need to send more eth");
        if (msg.value > price) {
            payable(msg.sender).transfer(msg.value - price);
        }
    }

    /**  Standard TokenURI ERC721A function modified to return hidden metadata
         URI until the contract is revealed. */
    function tokenURI(uint256 _tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        require(_exists(_tokenId), "Nonexistent token!");

        if (keccak256(abi.encodePacked(_baseTokenURI)) == keccak256(abi.encodePacked(""))) {
            return hiddenMetadataUri;
        }

        return
            bytes(_baseTokenURI).length > 0
                ? string(
                    abi.encodePacked(_baseTokenURI, _tokenId.toString(), uriSuffix)
                )
                : "";
    }
    
/// OWNER FUNCTIONS ///

    /** Standard withdraw function for the owner to pull the contract */
    function withdrawMoney() external onlyOwner nonReentrant {
        uint256 sendAmount = address(this).balance;

        address community = payable(0x416dDEDeE351a1f97Bc5c1ff15bE150Bb14c948c); 
        address jphilly = payable(0x7177585d7639f01E597E91918114A850ADc93258);
        address jsquared = payable(0xdC0556d45e56c030E12EBbdf8Df290c46d11285A);
        address zphilly = payable(0x290F139cc66Fca18fC97991c9383A8B830D29f7a);
        address artist = payable(0x322856622dB75cdd6e6d1EEda8e96170656AA6CA);
        address ninja = payable(0x9a4069cD84bF8654c329d87cE4102855359FBcE5);
        address yeti = payable(0x66c17Dcef1B364014573Ae0F869ad1c05fe01c89);
        address zj = payable(0xaFece8854848B04cf0796e246724dA7624eC8bC2);
        address willy = payable(0x4Bd3BB6B1D03c8844476e525fF291627FbC3c0eA);
        address marketing = payable(0x5c3023309dF0a3F7FE59e530B14629184AeB2035);
        address jhutt = payable(0x92718D60473d76075e219e5F5B11C628BcF78152);
        
        bool success;
        (success, ) = jphilly.call{value: ((sendAmount * 1875) / 10000)}("");
        require(success, "Transaction unsuccessful");

        (success, ) = jsquared.call{value: ((sendAmount * 1875) / 10000)}("");
        require(success, "Transaction unsuccessful");

        (success, ) = zphilly.call{value: ((sendAmount * 1875) / 10000)}("");
        require(success, "Transaction unsuccessful");

        (success, ) = community.call{value: ((sendAmount * 1975) / 10000)}("");
        require(success, "Transaction unsuccessful");

        (success, ) = ninja.call{value: ((sendAmount * 600) / 10000)}("");
        require(success, "Transaction unsuccessful");
        
        (success, ) = artist.call{value: ((sendAmount * 500) / 10000)}("");
        require(success, "Transaction unsuccessful");

        (success, ) = yeti.call{value: ((sendAmount * 300) / 10000)}("");
        require(success, "Transaction unsuccessful");

        (success, ) = zj.call{value: ((sendAmount * 300) / 10000)}("");
        require(success, "Transaction unsuccessful");

        (success, ) = willy.call{value: ((sendAmount * 300) / 10000)}("");
        require(success, "Transaction unsuccessful");

        (success, ) = jhutt.call{value: ((sendAmount * 300) / 10000)}("");
        require(success, "Transaction unsuccessful");

        (success, ) = marketing.call{value: ((sendAmount * 100) / 10000)}("");
        require(success, "Transaction unsuccessful");
    }

    /** Mint Function only usable by contract owner. Use reserved for giveaways and promotions. */
    function ownerMint(address to, uint256 quantity) public callerIsUser onlyOwner {
        require(quantity + totalSupply() <= collectionSize, 'Max supply reached');
        _safeMint(to, quantity);
    }

    /** Function for updating the revealed token metadata URI. When setting this value,
        only replace _CID_ in the following:  ipfs://_CID_/                          */
    function setBaseURI(string memory baseURI) public onlyOwner {
        _baseTokenURI = baseURI;
    }

    /** Initialized in constructor - Hidden metadata value pointing to unrevealed token URI. */
    function setHiddenMetadataURI(string memory _hiddenMetadataURI) public onlyOwner {
        hiddenMetadataUri = _hiddenMetadataURI;
    }

    function setPresaleActive(bool _active) public onlyOwner {
        presaleActive = _active;
    }

    function setPublicSaleActive(bool _active) public onlyOwner {
        publicSaleActive = _active;
    }

   /** adding onlyOwner and nonReentrant modifiers to ERC721A setOwnersExplicit for enhanced security */
    function setOwnersExplicit(uint256 quantity)
        external
        onlyOwner
        nonReentrant
    {
        _setOwnersExplicit(quantity);
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"uint256","name":"maxBatchSize_","type":"uint256"},{"internalType":"uint256","name":"maxPresaleBatchSize_","type":"uint256"},{"internalType":"uint256","name":"collectionSize_","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"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":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getOwnershipData","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"}],"internalType":"struct ERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hiddenMetadataUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_add","type":"address"},{"internalType":"bytes32","name":"_r","type":"bytes32"},{"internalType":"bytes32","name":"_s","type":"bytes32"},{"internalType":"uint8","name":"_v","type":"uint8"}],"name":"isValidAccessMessage","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPresaleMintPerAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPublicMintPerAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextOwnerToExplicitlySet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"numberMinted","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":"address","name":"to","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"bytes32","name":"_r","type":"bytes32"},{"internalType":"bytes32","name":"_s","type":"bytes32"},{"internalType":"uint8","name":"_v","type":"uint8"}],"name":"presaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"publicSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_hiddenMetadataURI","type":"string"}],"name":"setHiddenMetadataURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"setOwnersExplicit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_active","type":"bool"}],"name":"setPresaleActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_active","type":"bool"}],"name":"setPublicSaleActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"setSignerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"signerAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uriSuffix","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistMintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawMoney","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6000808055600781905564173539b7b760d91b600b5561012060408190526101008290526200003291600c9190620002f2565b50600e805461ffff191690553480156200004b57600080fd5b5060405162003ac338038062003ac38339810160408190526200006e9162000398565b6040518060400160405280601581526020017f4b616e6761726f6f20436f756e74727920436c75620000000000000000000000815250604051806040016040528060038152602001624b434360e81b8152508483600081116200012f5760405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20636f6c6c656374696f6e206d757374206861766520612060448201526d6e6f6e7a65726f20737570706c7960901b60648201526084015b60405180910390fd5b60008211620001915760405162461bcd60e51b815260206004820152602760248201527f455243373231413a206d61782062617463682073697a65206d757374206265206044820152666e6f6e7a65726f60c81b606482015260840162000126565b8351620001a6906001906020870190620002f2565b508251620001bc906002906020860190620002f2565b5060a09190915260805250620001d49050336200022b565b600160095560c083905260e082905260408051808201909152601a81527f697066733a2f2f5f5f4349445f5f2f68696464656e2e6a736f6e000000000000602082015262000222906200027d565b50505062000404565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6008546001600160a01b03163314620002d95760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640162000126565b8051620002ee90600d906020840190620002f2565b5050565b8280546200030090620003c7565b90600052602060002090601f0160209004810192826200032457600085556200036f565b82601f106200033f57805160ff19168380011785556200036f565b828001600101855582156200036f579182015b828111156200036f57825182559160200191906001019062000352565b506200037d92915062000381565b5090565b5b808211156200037d576000815560010162000382565b600080600060608486031215620003ae57600080fd5b8351925060208401519150604084015190509250925092565b600181811c90821680620003dc57607f821691505b60208210811415620003fe57634e487b7160e01b600052602260045260246000fd5b50919050565b60805160a05160c05160e05161364d620004766000396000818161056b0152610b3101526000818161072d01526111d50152600081816126d1015281816126fb0152612bae015260008181610b5201528181610f4c015281816111f6015281816124d60152612508015261364d6000f3fe6080604052600436106102515760003560e01c80636817c76c11610139578063ac446002116100b6578063d7224ba01161007a578063d7224ba0146106e5578063dc33e681146106fb578063dfb1b5451461071b578063e2e06fa31461074f578063e985e9c51461076f578063f2fde38b146107b857600080fd5b8063ac44600214610656578063b88d4fde1461066b578063bc8893b41461068b578063c1dd27dc146106a5578063c87b56dd146106c557600080fd5b80639231ab2a116100fd5780639231ab2a146105ab57806395d89b41146105f9578063a0712d681461060e578063a22cb46514610621578063a45ba8e71461064157600080fd5b80636817c76c1461050957806370a0823114610524578063715018a61461054457806383c6d18a146105595780638da5cb5b1461058d57600080fd5b806335c6aaf8116101d2578063512507c611610196578063512507c61461045457806353135ca0146104745780635503a0e81461049357806355f804b3146104a95780635b7633d0146104c95780636352211e146104e957600080fd5b806335c6aaf8146103b95780633f8121a2146103d457806342842e0e146103f4578063484b973c146104145780634f6ccce71461043457600080fd5b80631749dc26116102195780631749dc261461032757806318160ddd1461033a57806323b872dd146103595780632d20fb60146103795780632f745c591461039957600080fd5b806301ffc9a714610256578063046dc1661461028b57806306fdde03146102ad578063081812fc146102cf578063095ea7b314610307575b600080fd5b34801561026257600080fd5b50610276610271366004612e72565b6107d8565b60405190151581526020015b60405180910390f35b34801561029757600080fd5b506102ab6102a6366004612eb2565b610845565b005b3480156102b957600080fd5b506102c261089a565b6040516102829190612f25565b3480156102db57600080fd5b506102ef6102ea366004612f38565b61092c565b6040516001600160a01b039091168152602001610282565b34801561031357600080fd5b506102ab610322366004612f51565b6109b7565b6102ab610335366004612f8c565b610acf565b34801561034657600080fd5b506000545b604051908152602001610282565b34801561036557600080fd5b506102ab610374366004612fcb565b610cc6565b34801561038557600080fd5b506102ab610394366004612f38565b610cd1565b3480156103a557600080fd5b5061034b6103b4366004612f51565b610d34565b3480156103c557600080fd5b5061034b666a94d74f43000081565b3480156103e057600080fd5b506102ab6103ef366004613017565b610ea2565b34801561040057600080fd5b506102ab61040f366004612fcb565b610ee6565b34801561042057600080fd5b506102ab61042f366004612f51565b610f01565b34801561044057600080fd5b5061034b61044f366004612f38565b610faa565b34801561046057600080fd5b506102ab61046f3660046130be565b61100c565b34801561048057600080fd5b50600e5461027690610100900460ff1681565b34801561049f57600080fd5b5061034b600b5481565b3480156104b557600080fd5b506102ab6104c43660046130be565b611049565b3480156104d557600080fd5b50600a546102ef906001600160a01b031681565b3480156104f557600080fd5b506102ef610504366004612f38565b611086565b34801561051557600080fd5b5061034b668e1bc9bf04000081565b34801561053057600080fd5b5061034b61053f366004612eb2565b611098565b34801561055057600080fd5b506102ab611129565b34801561056557600080fd5b5061034b7f000000000000000000000000000000000000000000000000000000000000000081565b34801561059957600080fd5b506008546001600160a01b03166102ef565b3480156105b757600080fd5b506105cb6105c6366004612f38565b61115f565b6040805182516001600160a01b0316815260209283015167ffffffffffffffff169281019290925201610282565b34801561060557600080fd5b506102c261117c565b6102ab61061c366004612f38565b61118b565b34801561062d57600080fd5b506102ab61063c366004613107565b611363565b34801561064d57600080fd5b506102c2611428565b34801561066257600080fd5b506102ab6114b6565b34801561067757600080fd5b506102ab61068636600461313a565b611bc9565b34801561069757600080fd5b50600e546102769060ff1681565b3480156106b157600080fd5b506102766106c03660046131b6565b611c02565b3480156106d157600080fd5b506102c26106e0366004612f38565b611d81565b3480156106f157600080fd5b5061034b60075481565b34801561070757600080fd5b5061034b610716366004612eb2565b611efe565b34801561072757600080fd5b5061034b7f000000000000000000000000000000000000000000000000000000000000000081565b34801561075b57600080fd5b506102ab61076a366004613017565b611f09565b34801561077b57600080fd5b5061027661078a3660046131f1565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b3480156107c457600080fd5b506102ab6107d3366004612eb2565b611f46565b60006001600160e01b031982166380ac58cd60e01b148061080957506001600160e01b03198216635b5e139f60e01b145b8061082457506001600160e01b0319821663780e9d6360e01b145b8061083f57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6008546001600160a01b031633146108785760405162461bcd60e51b815260040161086f9061321b565b60405180910390fd5b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6060600180546108a990613250565b80601f01602080910402602001604051908101604052809291908181526020018280546108d590613250565b80156109225780601f106108f757610100808354040283529160200191610922565b820191906000526020600020905b81548152906001019060200180831161090557829003601f168201915b5050505050905090565b6000610939826000541190565b61099b5760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b606482015260840161086f565b506000908152600560205260409020546001600160a01b031690565b60006109c282611086565b9050806001600160a01b0316836001600160a01b03161415610a315760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b606482015260840161086f565b336001600160a01b0382161480610a4d5750610a4d813361078a565b610abf5760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000606482015260840161086f565b610aca838383611fe1565b505050565b323314610aee5760405162461bcd60e51b815260040161086f9061328b565b828282610afd33848484611c02565b610b0657600080fd5b60026009541415610b295760405162461bcd60e51b815260040161086f906132c2565b6002600955867f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000082610b7b60005490565b610b85919061330f565b1115610ba35760405162461bcd60e51b815260040161086f90613327565b80821115610be95760405162461bcd60e51b8152602060048201526013602482015272125b9d985b1a59081b5a5b9d08185b5bdd5b9d606a1b604482015260640161086f565b8082610bf433611efe565b610bfe919061330f565b1115610c455760405162461bcd60e51b815260206004820152601660248201527543616e206e6f74206d696e742074686973206d616e7960501b604482015260640161086f565b600e54610100900460ff16610c935760405162461bcd60e51b8152602060048201526014602482015273283932b9b0b6329034b9903737ba103634bb329760611b604482015260640161086f565b610c9d338a61203d565b610cb6610cb1666a94d74f4300008b613353565b612057565b5050600160095550505050505050565b610aca8383836120dd565b6008546001600160a01b03163314610cfb5760405162461bcd60e51b815260040161086f9061321b565b60026009541415610d1e5760405162461bcd60e51b815260040161086f906132c2565b6002600955610d2c81612465565b506001600955565b6000610d3f83611098565b8210610d985760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604482015261647360f01b606482015260840161086f565b600080549080805b83811015610e42576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915215610df357805192505b876001600160a01b0316836001600160a01b03161415610e2f5786841415610e215750935061083f92505050565b83610e2b81613372565b9450505b5080610e3a81613372565b915050610da0565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201526d0deeedccae440c4f240d2dcc8caf60931b606482015260840161086f565b6008546001600160a01b03163314610ecc5760405162461bcd60e51b815260040161086f9061321b565b600e80549115156101000261ff0019909216919091179055565b610aca83838360405180602001604052806000815250611bc9565b323314610f205760405162461bcd60e51b815260040161086f9061328b565b6008546001600160a01b03163314610f4a5760405162461bcd60e51b815260040161086f9061321b565b7f0000000000000000000000000000000000000000000000000000000000000000610f7460005490565b610f7e908361330f565b1115610f9c5760405162461bcd60e51b815260040161086f90613327565b610fa6828261203d565b5050565b6000805482106110085760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756044820152626e647360e81b606482015260840161086f565b5090565b6008546001600160a01b031633146110365760405162461bcd60e51b815260040161086f9061321b565b8051610fa690600d906020840190612dcc565b6008546001600160a01b031633146110735760405162461bcd60e51b815260040161086f9061321b565b8051610fa690600c906020840190612dcc565b60006110918261264f565b5192915050565b60006001600160a01b0382166111045760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b606482015260840161086f565b506001600160a01b03166000908152600460205260409020546001600160801b031690565b6008546001600160a01b031633146111535760405162461bcd60e51b815260040161086f9061321b565b61115d60006127f9565b565b604080518082019091526000808252602082015261083f8261264f565b6060600280546108a990613250565b3233146111aa5760405162461bcd60e51b815260040161086f9061328b565b600260095414156111cd5760405162461bcd60e51b815260040161086f906132c2565b6002600955807f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000008261121f60005490565b611229919061330f565b11156112475760405162461bcd60e51b815260040161086f90613327565b8082111561128d5760405162461bcd60e51b8152602060048201526013602482015272125b9d985b1a59081b5a5b9d08185b5bdd5b9d606a1b604482015260640161086f565b808261129833611efe565b6112a2919061330f565b11156112e95760405162461bcd60e51b815260206004820152601660248201527543616e206e6f74206d696e742074686973206d616e7960501b604482015260640161086f565b600e5460ff1661133b5760405162461bcd60e51b815260206004820152601860248201527f5075626c69632073616c65206973206e6f74206c6976652e0000000000000000604482015260640161086f565b611345338461203d565b611359610cb1668e1bc9bf04000085613353565b5050600160095550565b6001600160a01b0382163314156113bc5760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c6572000000000000604482015260640161086f565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600d805461143590613250565b80601f016020809104026020016040519081016040528092919081815260200182805461146190613250565b80156114ae5780601f10611483576101008083540402835291602001916114ae565b820191906000526020600020905b81548152906001019060200180831161149157829003601f168201915b505050505081565b6008546001600160a01b031633146114e05760405162461bcd60e51b815260040161086f9061321b565b600260095414156115035760405162461bcd60e51b815260040161086f906132c2565b60026009554773416ddedee351a1f97bc5c1ff15be150bb14c948c737177585d7639f01e597e91918114a850adc9325873dc0556d45e56c030e12ebbdf8df290c46d11285a73290f139cc66fca18fc97991c9383a8b830d29f7a73322856622db75cdd6e6d1eeda8e96170656aa6ca739a4069cd84bf8654c329d87ce4102855359fbce57366c17dcef1b364014573ae0f869ad1c05fe01c8973afece8854848b04cf0796e246724da7624ec8bc2734bd3bb6b1d03c8844476e525ff291627fbc3c0ea735c3023309df0a3f7fe59e530b14629184aeb20357392718d60473d76075e219e5f5b11c628bcf7815260008a6127106116028f610753613353565b61160c91906133a3565b604051600081818185875af1925050503d8060008114611648576040519150601f19603f3d011682016040523d82523d6000602084013e61164d565b606091505b505080915050806116705760405162461bcd60e51b815260040161086f906133b7565b6001600160a01b038a166127106116898f610753613353565b61169391906133a3565b604051600081818185875af1925050503d80600081146116cf576040519150601f19603f3d011682016040523d82523d6000602084013e6116d4565b606091505b505080915050806116f75760405162461bcd60e51b815260040161086f906133b7565b6001600160a01b0389166127106117108f610753613353565b61171a91906133a3565b604051600081818185875af1925050503d8060008114611756576040519150601f19603f3d011682016040523d82523d6000602084013e61175b565b606091505b5050809150508061177e5760405162461bcd60e51b815260040161086f906133b7565b6001600160a01b038c166127106117978f6107b7613353565b6117a191906133a3565b604051600081818185875af1925050503d80600081146117dd576040519150601f19603f3d011682016040523d82523d6000602084013e6117e2565b606091505b505080915050806118055760405162461bcd60e51b815260040161086f906133b7565b6001600160a01b03871661271061181e8f610258613353565b61182891906133a3565b604051600081818185875af1925050503d8060008114611864576040519150601f19603f3d011682016040523d82523d6000602084013e611869565b606091505b5050809150508061188c5760405162461bcd60e51b815260040161086f906133b7565b6001600160a01b0388166127106118a58f6101f4613353565b6118af91906133a3565b604051600081818185875af1925050503d80600081146118eb576040519150601f19603f3d011682016040523d82523d6000602084013e6118f0565b606091505b505080915050806119135760405162461bcd60e51b815260040161086f906133b7565b6001600160a01b03861661271061192c8f61012c613353565b61193691906133a3565b604051600081818185875af1925050503d8060008114611972576040519150601f19603f3d011682016040523d82523d6000602084013e611977565b606091505b5050809150508061199a5760405162461bcd60e51b815260040161086f906133b7565b6001600160a01b0385166127106119b38f61012c613353565b6119bd91906133a3565b604051600081818185875af1925050503d80600081146119f9576040519150601f19603f3d011682016040523d82523d6000602084013e6119fe565b606091505b50508091505080611a215760405162461bcd60e51b815260040161086f906133b7565b6001600160a01b038416612710611a3a8f61012c613353565b611a4491906133a3565b604051600081818185875af1925050503d8060008114611a80576040519150601f19603f3d011682016040523d82523d6000602084013e611a85565b606091505b50508091505080611aa85760405162461bcd60e51b815260040161086f906133b7565b6001600160a01b038216612710611ac18f61012c613353565b611acb91906133a3565b604051600081818185875af1925050503d8060008114611b07576040519150601f19603f3d011682016040523d82523d6000602084013e611b0c565b606091505b50508091505080611b2f5760405162461bcd60e51b815260040161086f906133b7565b6001600160a01b038316612710611b478f6064613353565b611b5191906133a3565b604051600081818185875af1925050503d8060008114611b8d576040519150601f19603f3d011682016040523d82523d6000602084013e611b92565b606091505b50508091505080611bb55760405162461bcd60e51b815260040161086f906133b7565b505060016009555050505050505050505050565b611bd48484846120dd565b611be08484848461284b565b611bfc5760405162461bcd60e51b815260040161086f906133ee565b50505050565b600080611c176008546001600160a01b031690565b604080516001600160a01b03928316602082015291881690820152606001604051602081830303815290604052805190602001209050600081604051602001611c8c91907f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c810191909152603c0190565b60408051601f198184030181528282528051602091820120600080855291840180845281905260ff88169284019290925260608301899052608083018890529092509060019060a0016020604051602081039080840390855afa158015611cf7573d6000803e3d6000fd5b5050604051601f190151600a549092506001600160a01b038084169116149050611d635760405162461bcd60e51b815260206004820152601860248201527f5369676e617475726520646f6573206e6f74206d617463680000000000000000604482015260640161086f565b600a546001600160a01b03908116911614925050505b949350505050565b6060611d8e826000541190565b611dcf5760405162461bcd60e51b81526020600482015260126024820152714e6f6e6578697374656e7420746f6b656e2160701b604482015260640161086f565b6040805160008152602081018083528151902091611df091600c91016134db565b604051602081830303815290604052805190602001201415611e9e57600d8054611e1990613250565b80601f0160208091040260200160405190810160405280929190818152602001828054611e4590613250565b8015611e925780601f10611e6757610100808354040283529160200191611e92565b820191906000526020600020905b815481529060010190602001808311611e7557829003601f168201915b50505050509050919050565b6000600c8054611ead90613250565b905011611ec9576040518060200160405280600081525061083f565b600c611ed483612955565b600b54604051602001611ee9939291906134e7565b60405160208183030381529060405292915050565b600061083f82612a53565b6008546001600160a01b03163314611f335760405162461bcd60e51b815260040161086f9061321b565b600e805460ff1916911515919091179055565b6008546001600160a01b03163314611f705760405162461bcd60e51b815260040161086f9061321b565b6001600160a01b038116611fd55760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161086f565b611fde816127f9565b50565b60008281526005602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b610fa6828260405180602001604052806000815250612af1565b8034101561209f5760405162461bcd60e51b815260206004820152601560248201527409ccacac840e8de40e6cadcc840dadee4ca40cae8d605b1b604482015260640161086f565b80341115611fde57336108fc6120b58334613512565b6040518115909202916000818181858888f19350505050158015610fa6573d6000803e3d6000fd5b60006120e88261264f565b80519091506000906001600160a01b0316336001600160a01b0316148061211f5750336121148461092c565b6001600160a01b0316145b8061213157508151612131903361078a565b90508061219b5760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b606482015260840161086f565b846001600160a01b031682600001516001600160a01b03161461220f5760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b606482015260840161086f565b6001600160a01b0384166122735760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b606482015260840161086f565b6122836000848460000151611fe1565b6001600160a01b03851660009081526004602052604081208054600192906122b59084906001600160801b0316613529565b82546101009290920a6001600160801b038181021990931691831602179091556001600160a01b0386166000908152600460205260408120805460019450909261230191859116613551565b82546001600160801b039182166101009390930a9283029190920219909116179055506040805180820182526001600160a01b03808716825267ffffffffffffffff428116602080850191825260008981526003909152948520935184549151909216600160a01b026001600160e01b0319909116919092161717905561238984600161330f565b6000818152600360205260409020549091506001600160a01b031661241b576123b3816000541190565b1561241b5760408051808201825284516001600160a01b03908116825260208087015167ffffffffffffffff9081168285019081526000878152600390935294909120925183549451909116600160a01b026001600160e01b03199094169116179190911790555b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b600754816124b55760405162461bcd60e51b815260206004820152601860248201527f7175616e74697479206d757374206265206e6f6e7a65726f0000000000000000604482015260640161086f565b600060016124c3848461330f565b6124cd9190613512565b90506124fa60017f0000000000000000000000000000000000000000000000000000000000000000613512565b81111561252f5761252c60017f0000000000000000000000000000000000000000000000000000000000000000613512565b90505b61253a816000541190565b6125955760405162461bcd60e51b815260206004820152602660248201527f6e6f7420656e6f756768206d696e7465642079657420666f722074686973206360448201526506c65616e75760d41b606482015260840161086f565b815b81811161263b576000818152600360205260409020546001600160a01b03166126295760006125c58261264f565b60408051808201825282516001600160a01b03908116825260209384015167ffffffffffffffff9081168584019081526000888152600390965293909420915182549351909416600160a01b026001600160e01b0319909316931692909217179055505b8061263381613372565b915050612597565b5061264781600161330f565b600755505050565b604080518082019091526000808252602082015261266e826000541190565b6126cd5760405162461bcd60e51b815260206004820152602a60248201527f455243373231413a206f776e657220717565727920666f72206e6f6e657869736044820152693a32b73a103a37b5b2b760b11b606482015260840161086f565b60007f0000000000000000000000000000000000000000000000000000000000000000831061272e576127207f000000000000000000000000000000000000000000000000000000000000000084613512565b61272b90600161330f565b90505b825b818110612798576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff16918301919091521561278557949350505050565b50806127908161357c565b915050612730565b5060405162461bcd60e51b815260206004820152602f60248201527f455243373231413a20756e61626c6520746f2064657465726d696e652074686560448201526e1037bbb732b91037b3103a37b5b2b760891b606482015260840161086f565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006001600160a01b0384163b1561294d57604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061288f903390899088908890600401613593565b602060405180830381600087803b1580156128a957600080fd5b505af19250505080156128d9575060408051601f3d908101601f191682019092526128d6918101906135d0565b60015b612933573d808015612907576040519150601f19603f3d011682016040523d82523d6000602084013e61290c565b606091505b50805161292b5760405162461bcd60e51b815260040161086f906133ee565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611d79565b506001611d79565b6060816129795750506040805180820190915260018152600360fc1b602082015290565b8160005b81156129a3578061298d81613372565b915061299c9050600a836133a3565b915061297d565b60008167ffffffffffffffff8111156129be576129be613032565b6040519080825280601f01601f1916602001820160405280156129e8576020820181803683370190505b5090505b8415611d79576129fd600183613512565b9150612a0a600a866135ed565b612a1590603061330f565b60f81b818381518110612a2a57612a2a613601565b60200101906001600160f81b031916908160001a905350612a4c600a866133a3565b94506129ec565b60006001600160a01b038216612ac55760405162461bcd60e51b815260206004820152603160248201527f455243373231413a206e756d626572206d696e74656420717565727920666f7260448201527020746865207a65726f206164647265737360781b606482015260840161086f565b506001600160a01b0316600090815260046020526040902054600160801b90046001600160801b031690565b6000546001600160a01b038416612b545760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b606482015260840161086f565b612b5f816000541190565b15612bac5760405162461bcd60e51b815260206004820152601d60248201527f455243373231413a20746f6b656e20616c7265616479206d696e746564000000604482015260640161086f565b7f0000000000000000000000000000000000000000000000000000000000000000831115612c275760405162461bcd60e51b815260206004820152602260248201527f455243373231413a207175616e7469747920746f206d696e7420746f6f2068696044820152610ced60f31b606482015260840161086f565b6001600160a01b0384166000908152600460209081526040918290208251808401845290546001600160801b038082168352600160801b9091041691810191909152815180830190925280519091908190612c83908790613551565b6001600160801b03168152602001858360200151612ca19190613551565b6001600160801b039081169091526001600160a01b0380881660008181526004602090815260408083208751978301518716600160801b0297909616969096179094558451808601865291825267ffffffffffffffff4281168386019081528883526003909552948120915182549451909516600160a01b026001600160e01b031990941694909216939093179190911790915582905b85811015612dc15760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4612d85600088848861284b565b612da15760405162461bcd60e51b815260040161086f906133ee565b81612dab81613372565b9250508080612db990613372565b915050612d38565b50600081905561245d565b828054612dd890613250565b90600052602060002090601f016020900481019282612dfa5760008555612e40565b82601f10612e1357805160ff1916838001178555612e40565b82800160010185558215612e40579182015b82811115612e40578251825591602001919060010190612e25565b506110089291505b808211156110085760008155600101612e48565b6001600160e01b031981168114611fde57600080fd5b600060208284031215612e8457600080fd5b8135612e8f81612e5c565b9392505050565b80356001600160a01b0381168114612ead57600080fd5b919050565b600060208284031215612ec457600080fd5b612e8f82612e96565b60005b83811015612ee8578181015183820152602001612ed0565b83811115611bfc5750506000910152565b60008151808452612f11816020860160208601612ecd565b601f01601f19169290920160200192915050565b602081526000612e8f6020830184612ef9565b600060208284031215612f4a57600080fd5b5035919050565b60008060408385031215612f6457600080fd5b612f6d83612e96565b946020939093013593505050565b803560ff81168114612ead57600080fd5b60008060008060808587031215612fa257600080fd5b843593506020850135925060408501359150612fc060608601612f7b565b905092959194509250565b600080600060608486031215612fe057600080fd5b612fe984612e96565b9250612ff760208501612e96565b9150604084013590509250925092565b80358015158114612ead57600080fd5b60006020828403121561302957600080fd5b612e8f82613007565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff8084111561306357613063613032565b604051601f8501601f19908116603f0116810190828211818310171561308b5761308b613032565b816040528093508581528686860111156130a457600080fd5b858560208301376000602087830101525050509392505050565b6000602082840312156130d057600080fd5b813567ffffffffffffffff8111156130e757600080fd5b8201601f810184136130f857600080fd5b611d7984823560208401613048565b6000806040838503121561311a57600080fd5b61312383612e96565b915061313160208401613007565b90509250929050565b6000806000806080858703121561315057600080fd5b61315985612e96565b935061316760208601612e96565b925060408501359150606085013567ffffffffffffffff81111561318a57600080fd5b8501601f8101871361319b57600080fd5b6131aa87823560208401613048565b91505092959194509250565b600080600080608085870312156131cc57600080fd5b6131d585612e96565b93506020850135925060408501359150612fc060608601612f7b565b6000806040838503121561320457600080fd5b61320d83612e96565b915061313160208401612e96565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c9082168061326457607f821691505b6020821081141561328557634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252601a908201527f43616c6c657220697320616e6f7468657220636f6e7472616374000000000000604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b634e487b7160e01b600052601160045260246000fd5b60008219821115613322576133226132f9565b500190565b60208082526012908201527113585e081cdd5c1c1b1e481c995858da195960721b604082015260600190565b600081600019048311821515161561336d5761336d6132f9565b500290565b6000600019821415613386576133866132f9565b5060010190565b634e487b7160e01b600052601260045260246000fd5b6000826133b2576133b261338d565b500490565b60208082526018908201527f5472616e73616374696f6e20756e7375636365737366756c0000000000000000604082015260600190565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b8054600090600181811c908083168061345b57607f831692505b602080841082141561347d57634e487b7160e01b600052602260045260246000fd5b81801561349157600181146134a2576134cf565b60ff198616895284890196506134cf565b60008881526020902060005b868110156134c75781548b8201529085019083016134ae565b505084890196505b50505050505092915050565b6000612e8f8284613441565b60006134f38286613441565b8451613503818360208901612ecd565b01928352505060200192915050565b600082821015613524576135246132f9565b500390565b60006001600160801b0383811690831681811015613549576135496132f9565b039392505050565b60006001600160801b03808316818516808303821115613573576135736132f9565b01949350505050565b60008161358b5761358b6132f9565b506000190190565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906135c690830184612ef9565b9695505050505050565b6000602082840312156135e257600080fd5b8151612e8f81612e5c565b6000826135fc576135fc61338d565b500690565b634e487b7160e01b600052603260045260246000fdfea26469706673582212203233e92213751239c9a17e3996328bf95d093ea93cbf482736580c6bee7d8ce764736f6c634300080900330000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000001e61

Deployed Bytecode

0x6080604052600436106102515760003560e01c80636817c76c11610139578063ac446002116100b6578063d7224ba01161007a578063d7224ba0146106e5578063dc33e681146106fb578063dfb1b5451461071b578063e2e06fa31461074f578063e985e9c51461076f578063f2fde38b146107b857600080fd5b8063ac44600214610656578063b88d4fde1461066b578063bc8893b41461068b578063c1dd27dc146106a5578063c87b56dd146106c557600080fd5b80639231ab2a116100fd5780639231ab2a146105ab57806395d89b41146105f9578063a0712d681461060e578063a22cb46514610621578063a45ba8e71461064157600080fd5b80636817c76c1461050957806370a0823114610524578063715018a61461054457806383c6d18a146105595780638da5cb5b1461058d57600080fd5b806335c6aaf8116101d2578063512507c611610196578063512507c61461045457806353135ca0146104745780635503a0e81461049357806355f804b3146104a95780635b7633d0146104c95780636352211e146104e957600080fd5b806335c6aaf8146103b95780633f8121a2146103d457806342842e0e146103f4578063484b973c146104145780634f6ccce71461043457600080fd5b80631749dc26116102195780631749dc261461032757806318160ddd1461033a57806323b872dd146103595780632d20fb60146103795780632f745c591461039957600080fd5b806301ffc9a714610256578063046dc1661461028b57806306fdde03146102ad578063081812fc146102cf578063095ea7b314610307575b600080fd5b34801561026257600080fd5b50610276610271366004612e72565b6107d8565b60405190151581526020015b60405180910390f35b34801561029757600080fd5b506102ab6102a6366004612eb2565b610845565b005b3480156102b957600080fd5b506102c261089a565b6040516102829190612f25565b3480156102db57600080fd5b506102ef6102ea366004612f38565b61092c565b6040516001600160a01b039091168152602001610282565b34801561031357600080fd5b506102ab610322366004612f51565b6109b7565b6102ab610335366004612f8c565b610acf565b34801561034657600080fd5b506000545b604051908152602001610282565b34801561036557600080fd5b506102ab610374366004612fcb565b610cc6565b34801561038557600080fd5b506102ab610394366004612f38565b610cd1565b3480156103a557600080fd5b5061034b6103b4366004612f51565b610d34565b3480156103c557600080fd5b5061034b666a94d74f43000081565b3480156103e057600080fd5b506102ab6103ef366004613017565b610ea2565b34801561040057600080fd5b506102ab61040f366004612fcb565b610ee6565b34801561042057600080fd5b506102ab61042f366004612f51565b610f01565b34801561044057600080fd5b5061034b61044f366004612f38565b610faa565b34801561046057600080fd5b506102ab61046f3660046130be565b61100c565b34801561048057600080fd5b50600e5461027690610100900460ff1681565b34801561049f57600080fd5b5061034b600b5481565b3480156104b557600080fd5b506102ab6104c43660046130be565b611049565b3480156104d557600080fd5b50600a546102ef906001600160a01b031681565b3480156104f557600080fd5b506102ef610504366004612f38565b611086565b34801561051557600080fd5b5061034b668e1bc9bf04000081565b34801561053057600080fd5b5061034b61053f366004612eb2565b611098565b34801561055057600080fd5b506102ab611129565b34801561056557600080fd5b5061034b7f000000000000000000000000000000000000000000000000000000000000000a81565b34801561059957600080fd5b506008546001600160a01b03166102ef565b3480156105b757600080fd5b506105cb6105c6366004612f38565b61115f565b6040805182516001600160a01b0316815260209283015167ffffffffffffffff169281019290925201610282565b34801561060557600080fd5b506102c261117c565b6102ab61061c366004612f38565b61118b565b34801561062d57600080fd5b506102ab61063c366004613107565b611363565b34801561064d57600080fd5b506102c2611428565b34801561066257600080fd5b506102ab6114b6565b34801561067757600080fd5b506102ab61068636600461313a565b611bc9565b34801561069757600080fd5b50600e546102769060ff1681565b3480156106b157600080fd5b506102766106c03660046131b6565b611c02565b3480156106d157600080fd5b506102c26106e0366004612f38565b611d81565b3480156106f157600080fd5b5061034b60075481565b34801561070757600080fd5b5061034b610716366004612eb2565b611efe565b34801561072757600080fd5b5061034b7f000000000000000000000000000000000000000000000000000000000000001481565b34801561075b57600080fd5b506102ab61076a366004613017565b611f09565b34801561077b57600080fd5b5061027661078a3660046131f1565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b3480156107c457600080fd5b506102ab6107d3366004612eb2565b611f46565b60006001600160e01b031982166380ac58cd60e01b148061080957506001600160e01b03198216635b5e139f60e01b145b8061082457506001600160e01b0319821663780e9d6360e01b145b8061083f57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6008546001600160a01b031633146108785760405162461bcd60e51b815260040161086f9061321b565b60405180910390fd5b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6060600180546108a990613250565b80601f01602080910402602001604051908101604052809291908181526020018280546108d590613250565b80156109225780601f106108f757610100808354040283529160200191610922565b820191906000526020600020905b81548152906001019060200180831161090557829003601f168201915b5050505050905090565b6000610939826000541190565b61099b5760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b606482015260840161086f565b506000908152600560205260409020546001600160a01b031690565b60006109c282611086565b9050806001600160a01b0316836001600160a01b03161415610a315760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b606482015260840161086f565b336001600160a01b0382161480610a4d5750610a4d813361078a565b610abf5760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000606482015260840161086f565b610aca838383611fe1565b505050565b323314610aee5760405162461bcd60e51b815260040161086f9061328b565b828282610afd33848484611c02565b610b0657600080fd5b60026009541415610b295760405162461bcd60e51b815260040161086f906132c2565b6002600955867f000000000000000000000000000000000000000000000000000000000000000a7f0000000000000000000000000000000000000000000000000000000000001e6182610b7b60005490565b610b85919061330f565b1115610ba35760405162461bcd60e51b815260040161086f90613327565b80821115610be95760405162461bcd60e51b8152602060048201526013602482015272125b9d985b1a59081b5a5b9d08185b5bdd5b9d606a1b604482015260640161086f565b8082610bf433611efe565b610bfe919061330f565b1115610c455760405162461bcd60e51b815260206004820152601660248201527543616e206e6f74206d696e742074686973206d616e7960501b604482015260640161086f565b600e54610100900460ff16610c935760405162461bcd60e51b8152602060048201526014602482015273283932b9b0b6329034b9903737ba103634bb329760611b604482015260640161086f565b610c9d338a61203d565b610cb6610cb1666a94d74f4300008b613353565b612057565b5050600160095550505050505050565b610aca8383836120dd565b6008546001600160a01b03163314610cfb5760405162461bcd60e51b815260040161086f9061321b565b60026009541415610d1e5760405162461bcd60e51b815260040161086f906132c2565b6002600955610d2c81612465565b506001600955565b6000610d3f83611098565b8210610d985760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604482015261647360f01b606482015260840161086f565b600080549080805b83811015610e42576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915215610df357805192505b876001600160a01b0316836001600160a01b03161415610e2f5786841415610e215750935061083f92505050565b83610e2b81613372565b9450505b5080610e3a81613372565b915050610da0565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201526d0deeedccae440c4f240d2dcc8caf60931b606482015260840161086f565b6008546001600160a01b03163314610ecc5760405162461bcd60e51b815260040161086f9061321b565b600e80549115156101000261ff0019909216919091179055565b610aca83838360405180602001604052806000815250611bc9565b323314610f205760405162461bcd60e51b815260040161086f9061328b565b6008546001600160a01b03163314610f4a5760405162461bcd60e51b815260040161086f9061321b565b7f0000000000000000000000000000000000000000000000000000000000001e61610f7460005490565b610f7e908361330f565b1115610f9c5760405162461bcd60e51b815260040161086f90613327565b610fa6828261203d565b5050565b6000805482106110085760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756044820152626e647360e81b606482015260840161086f565b5090565b6008546001600160a01b031633146110365760405162461bcd60e51b815260040161086f9061321b565b8051610fa690600d906020840190612dcc565b6008546001600160a01b031633146110735760405162461bcd60e51b815260040161086f9061321b565b8051610fa690600c906020840190612dcc565b60006110918261264f565b5192915050565b60006001600160a01b0382166111045760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b606482015260840161086f565b506001600160a01b03166000908152600460205260409020546001600160801b031690565b6008546001600160a01b031633146111535760405162461bcd60e51b815260040161086f9061321b565b61115d60006127f9565b565b604080518082019091526000808252602082015261083f8261264f565b6060600280546108a990613250565b3233146111aa5760405162461bcd60e51b815260040161086f9061328b565b600260095414156111cd5760405162461bcd60e51b815260040161086f906132c2565b6002600955807f00000000000000000000000000000000000000000000000000000000000000147f0000000000000000000000000000000000000000000000000000000000001e618261121f60005490565b611229919061330f565b11156112475760405162461bcd60e51b815260040161086f90613327565b8082111561128d5760405162461bcd60e51b8152602060048201526013602482015272125b9d985b1a59081b5a5b9d08185b5bdd5b9d606a1b604482015260640161086f565b808261129833611efe565b6112a2919061330f565b11156112e95760405162461bcd60e51b815260206004820152601660248201527543616e206e6f74206d696e742074686973206d616e7960501b604482015260640161086f565b600e5460ff1661133b5760405162461bcd60e51b815260206004820152601860248201527f5075626c69632073616c65206973206e6f74206c6976652e0000000000000000604482015260640161086f565b611345338461203d565b611359610cb1668e1bc9bf04000085613353565b5050600160095550565b6001600160a01b0382163314156113bc5760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c6572000000000000604482015260640161086f565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600d805461143590613250565b80601f016020809104026020016040519081016040528092919081815260200182805461146190613250565b80156114ae5780601f10611483576101008083540402835291602001916114ae565b820191906000526020600020905b81548152906001019060200180831161149157829003601f168201915b505050505081565b6008546001600160a01b031633146114e05760405162461bcd60e51b815260040161086f9061321b565b600260095414156115035760405162461bcd60e51b815260040161086f906132c2565b60026009554773416ddedee351a1f97bc5c1ff15be150bb14c948c737177585d7639f01e597e91918114a850adc9325873dc0556d45e56c030e12ebbdf8df290c46d11285a73290f139cc66fca18fc97991c9383a8b830d29f7a73322856622db75cdd6e6d1eeda8e96170656aa6ca739a4069cd84bf8654c329d87ce4102855359fbce57366c17dcef1b364014573ae0f869ad1c05fe01c8973afece8854848b04cf0796e246724da7624ec8bc2734bd3bb6b1d03c8844476e525ff291627fbc3c0ea735c3023309df0a3f7fe59e530b14629184aeb20357392718d60473d76075e219e5f5b11c628bcf7815260008a6127106116028f610753613353565b61160c91906133a3565b604051600081818185875af1925050503d8060008114611648576040519150601f19603f3d011682016040523d82523d6000602084013e61164d565b606091505b505080915050806116705760405162461bcd60e51b815260040161086f906133b7565b6001600160a01b038a166127106116898f610753613353565b61169391906133a3565b604051600081818185875af1925050503d80600081146116cf576040519150601f19603f3d011682016040523d82523d6000602084013e6116d4565b606091505b505080915050806116f75760405162461bcd60e51b815260040161086f906133b7565b6001600160a01b0389166127106117108f610753613353565b61171a91906133a3565b604051600081818185875af1925050503d8060008114611756576040519150601f19603f3d011682016040523d82523d6000602084013e61175b565b606091505b5050809150508061177e5760405162461bcd60e51b815260040161086f906133b7565b6001600160a01b038c166127106117978f6107b7613353565b6117a191906133a3565b604051600081818185875af1925050503d80600081146117dd576040519150601f19603f3d011682016040523d82523d6000602084013e6117e2565b606091505b505080915050806118055760405162461bcd60e51b815260040161086f906133b7565b6001600160a01b03871661271061181e8f610258613353565b61182891906133a3565b604051600081818185875af1925050503d8060008114611864576040519150601f19603f3d011682016040523d82523d6000602084013e611869565b606091505b5050809150508061188c5760405162461bcd60e51b815260040161086f906133b7565b6001600160a01b0388166127106118a58f6101f4613353565b6118af91906133a3565b604051600081818185875af1925050503d80600081146118eb576040519150601f19603f3d011682016040523d82523d6000602084013e6118f0565b606091505b505080915050806119135760405162461bcd60e51b815260040161086f906133b7565b6001600160a01b03861661271061192c8f61012c613353565b61193691906133a3565b604051600081818185875af1925050503d8060008114611972576040519150601f19603f3d011682016040523d82523d6000602084013e611977565b606091505b5050809150508061199a5760405162461bcd60e51b815260040161086f906133b7565b6001600160a01b0385166127106119b38f61012c613353565b6119bd91906133a3565b604051600081818185875af1925050503d80600081146119f9576040519150601f19603f3d011682016040523d82523d6000602084013e6119fe565b606091505b50508091505080611a215760405162461bcd60e51b815260040161086f906133b7565b6001600160a01b038416612710611a3a8f61012c613353565b611a4491906133a3565b604051600081818185875af1925050503d8060008114611a80576040519150601f19603f3d011682016040523d82523d6000602084013e611a85565b606091505b50508091505080611aa85760405162461bcd60e51b815260040161086f906133b7565b6001600160a01b038216612710611ac18f61012c613353565b611acb91906133a3565b604051600081818185875af1925050503d8060008114611b07576040519150601f19603f3d011682016040523d82523d6000602084013e611b0c565b606091505b50508091505080611b2f5760405162461bcd60e51b815260040161086f906133b7565b6001600160a01b038316612710611b478f6064613353565b611b5191906133a3565b604051600081818185875af1925050503d8060008114611b8d576040519150601f19603f3d011682016040523d82523d6000602084013e611b92565b606091505b50508091505080611bb55760405162461bcd60e51b815260040161086f906133b7565b505060016009555050505050505050505050565b611bd48484846120dd565b611be08484848461284b565b611bfc5760405162461bcd60e51b815260040161086f906133ee565b50505050565b600080611c176008546001600160a01b031690565b604080516001600160a01b03928316602082015291881690820152606001604051602081830303815290604052805190602001209050600081604051602001611c8c91907f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c810191909152603c0190565b60408051601f198184030181528282528051602091820120600080855291840180845281905260ff88169284019290925260608301899052608083018890529092509060019060a0016020604051602081039080840390855afa158015611cf7573d6000803e3d6000fd5b5050604051601f190151600a549092506001600160a01b038084169116149050611d635760405162461bcd60e51b815260206004820152601860248201527f5369676e617475726520646f6573206e6f74206d617463680000000000000000604482015260640161086f565b600a546001600160a01b03908116911614925050505b949350505050565b6060611d8e826000541190565b611dcf5760405162461bcd60e51b81526020600482015260126024820152714e6f6e6578697374656e7420746f6b656e2160701b604482015260640161086f565b6040805160008152602081018083528151902091611df091600c91016134db565b604051602081830303815290604052805190602001201415611e9e57600d8054611e1990613250565b80601f0160208091040260200160405190810160405280929190818152602001828054611e4590613250565b8015611e925780601f10611e6757610100808354040283529160200191611e92565b820191906000526020600020905b815481529060010190602001808311611e7557829003601f168201915b50505050509050919050565b6000600c8054611ead90613250565b905011611ec9576040518060200160405280600081525061083f565b600c611ed483612955565b600b54604051602001611ee9939291906134e7565b60405160208183030381529060405292915050565b600061083f82612a53565b6008546001600160a01b03163314611f335760405162461bcd60e51b815260040161086f9061321b565b600e805460ff1916911515919091179055565b6008546001600160a01b03163314611f705760405162461bcd60e51b815260040161086f9061321b565b6001600160a01b038116611fd55760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161086f565b611fde816127f9565b50565b60008281526005602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b610fa6828260405180602001604052806000815250612af1565b8034101561209f5760405162461bcd60e51b815260206004820152601560248201527409ccacac840e8de40e6cadcc840dadee4ca40cae8d605b1b604482015260640161086f565b80341115611fde57336108fc6120b58334613512565b6040518115909202916000818181858888f19350505050158015610fa6573d6000803e3d6000fd5b60006120e88261264f565b80519091506000906001600160a01b0316336001600160a01b0316148061211f5750336121148461092c565b6001600160a01b0316145b8061213157508151612131903361078a565b90508061219b5760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b606482015260840161086f565b846001600160a01b031682600001516001600160a01b03161461220f5760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b606482015260840161086f565b6001600160a01b0384166122735760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b606482015260840161086f565b6122836000848460000151611fe1565b6001600160a01b03851660009081526004602052604081208054600192906122b59084906001600160801b0316613529565b82546101009290920a6001600160801b038181021990931691831602179091556001600160a01b0386166000908152600460205260408120805460019450909261230191859116613551565b82546001600160801b039182166101009390930a9283029190920219909116179055506040805180820182526001600160a01b03808716825267ffffffffffffffff428116602080850191825260008981526003909152948520935184549151909216600160a01b026001600160e01b0319909116919092161717905561238984600161330f565b6000818152600360205260409020549091506001600160a01b031661241b576123b3816000541190565b1561241b5760408051808201825284516001600160a01b03908116825260208087015167ffffffffffffffff9081168285019081526000878152600390935294909120925183549451909116600160a01b026001600160e01b03199094169116179190911790555b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b600754816124b55760405162461bcd60e51b815260206004820152601860248201527f7175616e74697479206d757374206265206e6f6e7a65726f0000000000000000604482015260640161086f565b600060016124c3848461330f565b6124cd9190613512565b90506124fa60017f0000000000000000000000000000000000000000000000000000000000001e61613512565b81111561252f5761252c60017f0000000000000000000000000000000000000000000000000000000000001e61613512565b90505b61253a816000541190565b6125955760405162461bcd60e51b815260206004820152602660248201527f6e6f7420656e6f756768206d696e7465642079657420666f722074686973206360448201526506c65616e75760d41b606482015260840161086f565b815b81811161263b576000818152600360205260409020546001600160a01b03166126295760006125c58261264f565b60408051808201825282516001600160a01b03908116825260209384015167ffffffffffffffff9081168584019081526000888152600390965293909420915182549351909416600160a01b026001600160e01b0319909316931692909217179055505b8061263381613372565b915050612597565b5061264781600161330f565b600755505050565b604080518082019091526000808252602082015261266e826000541190565b6126cd5760405162461bcd60e51b815260206004820152602a60248201527f455243373231413a206f776e657220717565727920666f72206e6f6e657869736044820152693a32b73a103a37b5b2b760b11b606482015260840161086f565b60007f0000000000000000000000000000000000000000000000000000000000000014831061272e576127207f000000000000000000000000000000000000000000000000000000000000001484613512565b61272b90600161330f565b90505b825b818110612798576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff16918301919091521561278557949350505050565b50806127908161357c565b915050612730565b5060405162461bcd60e51b815260206004820152602f60248201527f455243373231413a20756e61626c6520746f2064657465726d696e652074686560448201526e1037bbb732b91037b3103a37b5b2b760891b606482015260840161086f565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006001600160a01b0384163b1561294d57604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061288f903390899088908890600401613593565b602060405180830381600087803b1580156128a957600080fd5b505af19250505080156128d9575060408051601f3d908101601f191682019092526128d6918101906135d0565b60015b612933573d808015612907576040519150601f19603f3d011682016040523d82523d6000602084013e61290c565b606091505b50805161292b5760405162461bcd60e51b815260040161086f906133ee565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611d79565b506001611d79565b6060816129795750506040805180820190915260018152600360fc1b602082015290565b8160005b81156129a3578061298d81613372565b915061299c9050600a836133a3565b915061297d565b60008167ffffffffffffffff8111156129be576129be613032565b6040519080825280601f01601f1916602001820160405280156129e8576020820181803683370190505b5090505b8415611d79576129fd600183613512565b9150612a0a600a866135ed565b612a1590603061330f565b60f81b818381518110612a2a57612a2a613601565b60200101906001600160f81b031916908160001a905350612a4c600a866133a3565b94506129ec565b60006001600160a01b038216612ac55760405162461bcd60e51b815260206004820152603160248201527f455243373231413a206e756d626572206d696e74656420717565727920666f7260448201527020746865207a65726f206164647265737360781b606482015260840161086f565b506001600160a01b0316600090815260046020526040902054600160801b90046001600160801b031690565b6000546001600160a01b038416612b545760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b606482015260840161086f565b612b5f816000541190565b15612bac5760405162461bcd60e51b815260206004820152601d60248201527f455243373231413a20746f6b656e20616c7265616479206d696e746564000000604482015260640161086f565b7f0000000000000000000000000000000000000000000000000000000000000014831115612c275760405162461bcd60e51b815260206004820152602260248201527f455243373231413a207175616e7469747920746f206d696e7420746f6f2068696044820152610ced60f31b606482015260840161086f565b6001600160a01b0384166000908152600460209081526040918290208251808401845290546001600160801b038082168352600160801b9091041691810191909152815180830190925280519091908190612c83908790613551565b6001600160801b03168152602001858360200151612ca19190613551565b6001600160801b039081169091526001600160a01b0380881660008181526004602090815260408083208751978301518716600160801b0297909616969096179094558451808601865291825267ffffffffffffffff4281168386019081528883526003909552948120915182549451909516600160a01b026001600160e01b031990941694909216939093179190911790915582905b85811015612dc15760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4612d85600088848861284b565b612da15760405162461bcd60e51b815260040161086f906133ee565b81612dab81613372565b9250508080612db990613372565b915050612d38565b50600081905561245d565b828054612dd890613250565b90600052602060002090601f016020900481019282612dfa5760008555612e40565b82601f10612e1357805160ff1916838001178555612e40565b82800160010185558215612e40579182015b82811115612e40578251825591602001919060010190612e25565b506110089291505b808211156110085760008155600101612e48565b6001600160e01b031981168114611fde57600080fd5b600060208284031215612e8457600080fd5b8135612e8f81612e5c565b9392505050565b80356001600160a01b0381168114612ead57600080fd5b919050565b600060208284031215612ec457600080fd5b612e8f82612e96565b60005b83811015612ee8578181015183820152602001612ed0565b83811115611bfc5750506000910152565b60008151808452612f11816020860160208601612ecd565b601f01601f19169290920160200192915050565b602081526000612e8f6020830184612ef9565b600060208284031215612f4a57600080fd5b5035919050565b60008060408385031215612f6457600080fd5b612f6d83612e96565b946020939093013593505050565b803560ff81168114612ead57600080fd5b60008060008060808587031215612fa257600080fd5b843593506020850135925060408501359150612fc060608601612f7b565b905092959194509250565b600080600060608486031215612fe057600080fd5b612fe984612e96565b9250612ff760208501612e96565b9150604084013590509250925092565b80358015158114612ead57600080fd5b60006020828403121561302957600080fd5b612e8f82613007565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff8084111561306357613063613032565b604051601f8501601f19908116603f0116810190828211818310171561308b5761308b613032565b816040528093508581528686860111156130a457600080fd5b858560208301376000602087830101525050509392505050565b6000602082840312156130d057600080fd5b813567ffffffffffffffff8111156130e757600080fd5b8201601f810184136130f857600080fd5b611d7984823560208401613048565b6000806040838503121561311a57600080fd5b61312383612e96565b915061313160208401613007565b90509250929050565b6000806000806080858703121561315057600080fd5b61315985612e96565b935061316760208601612e96565b925060408501359150606085013567ffffffffffffffff81111561318a57600080fd5b8501601f8101871361319b57600080fd5b6131aa87823560208401613048565b91505092959194509250565b600080600080608085870312156131cc57600080fd5b6131d585612e96565b93506020850135925060408501359150612fc060608601612f7b565b6000806040838503121561320457600080fd5b61320d83612e96565b915061313160208401612e96565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c9082168061326457607f821691505b6020821081141561328557634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252601a908201527f43616c6c657220697320616e6f7468657220636f6e7472616374000000000000604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b634e487b7160e01b600052601160045260246000fd5b60008219821115613322576133226132f9565b500190565b60208082526012908201527113585e081cdd5c1c1b1e481c995858da195960721b604082015260600190565b600081600019048311821515161561336d5761336d6132f9565b500290565b6000600019821415613386576133866132f9565b5060010190565b634e487b7160e01b600052601260045260246000fd5b6000826133b2576133b261338d565b500490565b60208082526018908201527f5472616e73616374696f6e20756e7375636365737366756c0000000000000000604082015260600190565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b8054600090600181811c908083168061345b57607f831692505b602080841082141561347d57634e487b7160e01b600052602260045260246000fd5b81801561349157600181146134a2576134cf565b60ff198616895284890196506134cf565b60008881526020902060005b868110156134c75781548b8201529085019083016134ae565b505084890196505b50505050505092915050565b6000612e8f8284613441565b60006134f38286613441565b8451613503818360208901612ecd565b01928352505060200192915050565b600082821015613524576135246132f9565b500390565b60006001600160801b0383811690831681811015613549576135496132f9565b039392505050565b60006001600160801b03808316818516808303821115613573576135736132f9565b01949350505050565b60008161358b5761358b6132f9565b506000190190565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906135c690830184612ef9565b9695505050505050565b6000602082840312156135e257600080fd5b8151612e8f81612e5c565b6000826135fc576135fc61338d565b500690565b634e487b7160e01b600052603260045260246000fdfea26469706673582212203233e92213751239c9a17e3996328bf95d093ea93cbf482736580c6bee7d8ce764736f6c63430008090033

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

0000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000001e61

-----Decoded View---------------
Arg [0] : maxBatchSize_ (uint256): 20
Arg [1] : maxPresaleBatchSize_ (uint256): 10
Arg [2] : collectionSize_ (uint256): 7777

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000014
Arg [1] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [2] : 0000000000000000000000000000000000000000000000000000000000001e61


Deployed Bytecode Sourcemap

45969:8649:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29988:422;;;;;;;;;;-1:-1:-1;29988:422:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;29988:422:0;;;;;;;;44844:110;;;;;;;;;;-1:-1:-1;44844:110:0;;;;;:::i;:::-;;:::i;:::-;;31949:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;33644:292::-;;;;;;;;;;-1:-1:-1;33644:292:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2061:32:1;;;2043:51;;2031:2;2016:18;33644:292:0;1897:203:1;33165:413:0;;;;;;;;;;-1:-1:-1;33165:413:0;;;;;:::i;:::-;;:::i;48451:468::-;;;;;;:::i;:::-;;:::i;28344:100::-;;;;;;;;;;-1:-1:-1;28397:7:0;28424:12;28344:100;;;3063:25:1;;;3051:2;3036:18;28344:100:0;2917:177:1;34671:162:0;;;;;;;;;;-1:-1:-1;34671:162:0;;;;;:::i;:::-;;:::i;54457:156::-;;;;;;;;;;-1:-1:-1;54457:156:0;;;;;:::i;:::-;;:::i;29052:864::-;;;;;;;;;;-1:-1:-1;29052:864:0;;;;;:::i;:::-;;:::i;46508:55::-;;;;;;;;;;;;46553:10;46508:55;;54131:99;;;;;;;;;;-1:-1:-1;54131:99:0;;;;;:::i;:::-;;:::i;34904:177::-;;;;;;;;;;-1:-1:-1;34904:177:0;;;;;:::i;:::-;;:::i;53387:205::-;;;;;;;;;;-1:-1:-1;53387:205:0;;;;;:::i;:::-;;:::i;28521:228::-;;;;;;;;;;-1:-1:-1;28521:228:0;;;;;:::i;:::-;;:::i;53985:138::-;;;;;;;;;;-1:-1:-1;53985:138:0;;;;;:::i;:::-;;:::i;46613:33::-;;;;;;;;;;-1:-1:-1;46613:33:0;;;;;;;;;;;46289:34;;;;;;;;;;;;;;;;53778:102;;;;;;;;;;-1:-1:-1;53778:102:0;;;;;:::i;:::-;;:::i;44399:28::-;;;;;;;;;;-1:-1:-1;44399:28:0;;;;-1:-1:-1;;;;;44399:28:0;;;31758:124;;;;;;;;;;-1:-1:-1;31758:124:0;;;;;:::i;:::-;;:::i;46455:46::-;;;;;;;;;;;;46491:10;46455:46;;30474:258;;;;;;;;;;-1:-1:-1;30474:258:0;;;;;:::i;:::-;;:::i;2561:94::-;;;;;;;;;;;;;:::i;46201:49::-;;;;;;;;;;;;;;;1910:87;;;;;;;;;;-1:-1:-1;1983:6:0;;-1:-1:-1;;;;;1983:6:0;1910:87;;49426:167;;;;;;;;;;-1:-1:-1;49426:167:0;;;;;:::i;:::-;;:::i;:::-;;;;5419:13:1;;-1:-1:-1;;;;;5415:39:1;5397:58;;5515:4;5503:17;;;5497:24;5523:18;5493:49;5471:20;;;5464:79;;;;5370:18;49426:167:0;5189:360:1;32118:104:0;;;;;;;;;;;;;:::i;48038:373::-;;;;;;:::i;:::-;;:::i;34008:311::-;;;;;;;;;;-1:-1:-1;34008:311:0;;;;;:::i;:::-;;:::i;46370:31::-;;;;;;;;;;;;;:::i;50770:2509::-;;;;;;;;;;;;;:::i;35152:355::-;;;;;;;;;;-1:-1:-1;35152:355:0;;;;;:::i;:::-;;:::i;46570:36::-;;;;;;;;;;-1:-1:-1;46570:36:0;;;;;;;;45374:505;;;;;;;;;;-1:-1:-1;45374:505:0;;;;;:::i;:::-;;:::i;50088:569::-;;;;;;;;;;-1:-1:-1;50088:569:0;;;;;:::i;:::-;;:::i;40033:43::-;;;;;;;;;;;;;;;;49242:113;;;;;;;;;;-1:-1:-1;49242:113:0;;;;;:::i;:::-;;:::i;46146:48::-;;;;;;;;;;;;;;;54238:105;;;;;;;;;;-1:-1:-1;54238:105:0;;;;;:::i;:::-;;:::i;34390:214::-;;;;;;;;;;-1:-1:-1;34390:214:0;;;;;:::i;:::-;-1:-1:-1;;;;;34561:25:0;;;34532:4;34561:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;34390:214;2810:229;;;;;;;;;;-1:-1:-1;2810:229:0;;;;;:::i;:::-;;:::i;29988:422::-;30135:4;-1:-1:-1;;;;;;30177:40:0;;-1:-1:-1;;;30177:40:0;;:105;;-1:-1:-1;;;;;;;30234:48:0;;-1:-1:-1;;;30234:48:0;30177:105;:172;;;-1:-1:-1;;;;;;;30299:50:0;;-1:-1:-1;;;30299:50:0;30177:172;:225;;;-1:-1:-1;;;;;;;;;;25827:40:0;;;30366:36;30157:245;29988:422;-1:-1:-1;;29988:422:0:o;44844:110::-;1983:6;;-1:-1:-1;;;;;1983:6:0;778:10;2130:23;2122:68;;;;-1:-1:-1;;;2122:68:0;;;;;;;:::i;:::-;;;;;;;;;44920:13:::1;:26:::0;;-1:-1:-1;;;;;;44920:26:0::1;-1:-1:-1::0;;;;;44920:26:0;;;::::1;::::0;;;::::1;::::0;;44844:110::o;31949:100::-;32003:13;32036:5;32029:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31949:100;:::o;33644:292::-;33748:7;33795:16;33803:7;35819:4;35853:12;-1:-1:-1;35843:22:0;35762:111;33795:16;33773:111;;;;-1:-1:-1;;;33773:111:0;;8096:2:1;33773:111:0;;;8078:21:1;8135:2;8115:18;;;8108:30;8174:34;8154:18;;;8147:62;-1:-1:-1;;;8225:18:1;;;8218:43;8278:19;;33773:111:0;7894:409:1;33773:111:0;-1:-1:-1;33904:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;33904:24:0;;33644:292::o;33165:413::-;33238:13;33254:24;33270:7;33254:15;:24::i;:::-;33238:40;;33303:5;-1:-1:-1;;;;;33297:11:0;:2;-1:-1:-1;;;;;33297:11:0;;;33289:58;;;;-1:-1:-1;;;33289:58:0;;8510:2:1;33289:58:0;;;8492:21:1;8549:2;8529:18;;;8522:30;8588:34;8568:18;;;8561:62;-1:-1:-1;;;8639:18:1;;;8632:32;8681:19;;33289:58:0;8308:398:1;33289:58:0;778:10;-1:-1:-1;;;;;33382:21:0;;;;:62;;-1:-1:-1;33407:37:0;33424:5;778:10;34390:214;:::i;33407:37::-;33360:169;;;;-1:-1:-1;;;33360:169:0;;8913:2:1;33360:169:0;;;8895:21:1;8952:2;8932:18;;;8925:30;8991:34;8971:18;;;8964:62;9062:27;9042:18;;;9035:55;9107:19;;33360:169:0;8711:421:1;33360:169:0;33542:28;33551:2;33555:7;33564:5;33542:8;:28::i;:::-;33227:351;33165:413;;:::o;48451:468::-;47313:9;47326:10;47313:23;47305:62;;;;-1:-1:-1;;;47305:62:0;;;;;;;:::i;:::-;48606:2:::1;48610;48614;44771:44;44792:10;44804:2;44808;44812;44771:20;:44::i;:::-;44763:53;;;::::0;::::1;;4949:1:::2;5545:7;;:19;;5537:63;;;;-1:-1:-1::0;;;5537:63:0::2;;;;;;;:::i;:::-;4949:1;5678:7;:18:::0;48682:8;48692:24:::3;47753:14;48682:8:::0;47724:13:::3;28397:7:::0;28424:12;;28344:100;47724:13:::3;:25;;;;:::i;:::-;:43;;47716:74;;;;-1:-1:-1::0;;;47716:74:0::3;;;;;;;:::i;:::-;47840:14;47827:9;:27;;47801:77;;;::::0;-1:-1:-1;;;47801:77:0;;10666:2:1;47801:77:0::3;::::0;::::3;10648:21:1::0;10705:2;10685:18;;;10678:30;-1:-1:-1;;;10724:18:1;;;10717:49;10783:18;;47801:77:0::3;10464:343:1::0;47801:77:0::3;47938:14;47925:9;47898:24;47911:10;47898:12;:24::i;:::-;:36;;;;:::i;:::-;:54;;47890:89;;;::::0;-1:-1:-1;;;47890:89:0;;11014:2:1;47890:89:0::3;::::0;::::3;10996:21:1::0;11053:2;11033:18;;;11026:30;-1:-1:-1;;;11072:18:1;;;11065:52;11134:18;;47890:89:0::3;10812:346:1::0;47890:89:0::3;48777:13:::4;::::0;::::4;::::0;::::4;;;48769:46;;;::::0;-1:-1:-1;;;48769:46:0;;11365:2:1;48769:46:0::4;::::0;::::4;11347:21:1::0;11404:2;11384:18;;;11377:30;-1:-1:-1;;;11423:18:1;;;11416:50;11483:18;;48769:46:0::4;11163:344:1::0;48769:46:0::4;48826:31;48836:10;48848:8;48826:9;:31::i;:::-;48868:43;48881:29;46553:10;48881:8:::0;:29:::4;:::i;:::-;48868:12;:43::i;:::-;-1:-1:-1::0;;4905:1:0::2;5855:7;:22:::0;-1:-1:-1;;;;;;;48451:468:0:o;34671:162::-;34797:28;34807:4;34813:2;34817:7;34797:9;:28::i;54457:156::-;1983:6;;-1:-1:-1;;;;;1983:6:0;778:10;2130:23;2122:68;;;;-1:-1:-1;;;2122:68:0;;;;;;;:::i;:::-;4949:1:::1;5545:7;;:19;;5537:63;;;;-1:-1:-1::0;;;5537:63:0::1;;;;;;;:::i;:::-;4949:1;5678:7;:18:::0;54577:28:::2;54596:8:::0;54577:18:::2;:28::i;:::-;-1:-1:-1::0;4905:1:0::1;5855:7;:22:::0;54457:156::o;29052:864::-;29177:7;29218:16;29228:5;29218:9;:16::i;:::-;29210:5;:24;29202:71;;;;-1:-1:-1;;;29202:71:0;;11887:2:1;29202:71:0;;;11869:21:1;11926:2;11906:18;;;11899:30;11965:34;11945:18;;;11938:62;-1:-1:-1;;;12016:18:1;;;12009:32;12058:19;;29202:71:0;11685:398:1;29202:71:0;29284:22;28424:12;;;29284:22;;29416:426;29440:14;29436:1;:18;29416:426;;;29476:31;29510:14;;;:11;:14;;;;;;;;;29476:48;;;;;;;;;-1:-1:-1;;;;;29476:48:0;;;;;-1:-1:-1;;;29476:48:0;;;;;;;;;;;;29543:28;29539:103;;29612:14;;;-1:-1:-1;29539:103:0;29681:5;-1:-1:-1;;;;;29660:26:0;:17;-1:-1:-1;;;;;29660:26:0;;29656:175;;;29726:5;29711:11;:20;29707:77;;;-1:-1:-1;29763:1:0;-1:-1:-1;29756:8:0;;-1:-1:-1;;;29756:8:0;29707:77;29802:13;;;;:::i;:::-;;;;29656:175;-1:-1:-1;29456:3:0;;;;:::i;:::-;;;;29416:426;;;-1:-1:-1;29852:56:0;;-1:-1:-1;;;29852:56:0;;12430:2:1;29852:56:0;;;12412:21:1;12469:2;12449:18;;;12442:30;12508:34;12488:18;;;12481:62;-1:-1:-1;;;12559:18:1;;;12552:44;12613:19;;29852:56:0;12228:410:1;54131:99:0;1983:6;;-1:-1:-1;;;;;1983:6:0;778:10;2130:23;2122:68;;;;-1:-1:-1;;;2122:68:0;;;;;;;:::i;:::-;54199:13:::1;:23:::0;;;::::1;;;;-1:-1:-1::0;;54199:23:0;;::::1;::::0;;;::::1;::::0;;54131:99::o;34904:177::-;35034:39;35051:4;35057:2;35061:7;35034:39;;;;;;;;;;;;:16;:39::i;53387:205::-;47313:9;47326:10;47313:23;47305:62;;;;-1:-1:-1;;;47305:62:0;;;;;;;:::i;:::-;1983:6;;-1:-1:-1;;;;;1983:6:0;778:10;2130:23:::1;2122:68;;;;-1:-1:-1::0;;;2122:68:0::1;;;;;;;:::i;:::-;53513:14:::2;53496:13;28397:7:::0;28424:12;;28344:100;53496:13:::2;53485:24;::::0;:8;:24:::2;:::i;:::-;:42;;53477:73;;;;-1:-1:-1::0;;;53477:73:0::2;;;;;;;:::i;:::-;53561:23;53571:2;53575:8;53561:9;:23::i;:::-;53387:205:::0;;:::o;28521:228::-;28624:7;28424:12;;28657:5;:21;28649:69;;;;-1:-1:-1;;;28649:69:0;;12845:2:1;28649:69:0;;;12827:21:1;12884:2;12864:18;;;12857:30;12923:34;12903:18;;;12896:62;-1:-1:-1;;;12974:18:1;;;12967:33;13017:19;;28649:69:0;12643:399:1;28649:69:0;-1:-1:-1;28736:5:0;28521:228::o;53985:138::-;1983:6;;-1:-1:-1;;;;;1983:6:0;778:10;2130:23;2122:68;;;;-1:-1:-1;;;2122:68:0;;;;;;;:::i;:::-;54077:38;;::::1;::::0;:17:::1;::::0;:38:::1;::::0;::::1;::::0;::::1;:::i;53778:102::-:0;1983:6;;-1:-1:-1;;;;;1983:6:0;778:10;2130:23;2122:68;;;;-1:-1:-1;;;2122:68:0;;;;;;;:::i;:::-;53849:23;;::::1;::::0;:13:::1;::::0;:23:::1;::::0;::::1;::::0;::::1;:::i;31758:124::-:0;31822:7;31849:20;31861:7;31849:11;:20::i;:::-;:25;;31758:124;-1:-1:-1;;31758:124:0:o;30474:258::-;30538:7;-1:-1:-1;;;;;30580:19:0;;30558:112;;;;-1:-1:-1;;;30558:112:0;;13249:2:1;30558:112:0;;;13231:21:1;13288:2;13268:18;;;13261:30;13327:34;13307:18;;;13300:62;-1:-1:-1;;;13378:18:1;;;13371:41;13429:19;;30558:112:0;13047:407:1;30558:112:0;-1:-1:-1;;;;;;30696:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;30696:27:0;;30474:258::o;2561:94::-;1983:6;;-1:-1:-1;;;;;1983:6:0;778:10;2130:23;2122:68;;;;-1:-1:-1;;;2122:68:0;;;;;;;:::i;:::-;2626:21:::1;2644:1;2626:9;:21::i;:::-;2561:94::o:0;49426:167::-;-1:-1:-1;;;;;;;;;;;;;;;;;49565:20:0;49577:7;49565:11;:20::i;32118:104::-;32174:13;32207:7;32200:14;;;;;:::i;48038:373::-;47313:9;47326:10;47313:23;47305:62;;;;-1:-1:-1;;;47305:62:0;;;;;;;:::i;:::-;4949:1:::1;5545:7;;:19;;5537:63;;;;-1:-1:-1::0;;;5537:63:0::1;;;;;;;:::i;:::-;4949:1;5678:7;:18:::0;48173:8;48183:23:::2;47753:14;48173:8:::0;47724:13:::2;28397:7:::0;28424:12;;28344:100;47724:13:::2;:25;;;;:::i;:::-;:43;;47716:74;;;;-1:-1:-1::0;;;47716:74:0::2;;;;;;;:::i;:::-;47840:14;47827:9;:27;;47801:77;;;::::0;-1:-1:-1;;;47801:77:0;;10666:2:1;47801:77:0::2;::::0;::::2;10648:21:1::0;10705:2;10685:18;;;10678:30;-1:-1:-1;;;10724:18:1;;;10717:49;10783:18;;47801:77:0::2;10464:343:1::0;47801:77:0::2;47938:14;47925:9;47898:24;47911:10;47898:12;:24::i;:::-;:36;;;;:::i;:::-;:54;;47890:89;;;::::0;-1:-1:-1;;;47890:89:0;;11014:2:1;47890:89:0::2;::::0;::::2;10996:21:1::0;11053:2;11033:18;;;11026:30;-1:-1:-1;;;11072:18:1;;;11065:52;11134:18;;47890:89:0::2;10812:346:1::0;47890:89:0::2;48271:16:::3;::::0;::::3;;48263:53;;;::::0;-1:-1:-1;;;48263:53:0;;13661:2:1;48263:53:0::3;::::0;::::3;13643:21:1::0;13700:2;13680:18;;;13673:30;13739:26;13719:18;;;13712:54;13783:18;;48263:53:0::3;13459:348:1::0;48263:53:0::3;48327:31;48337:10;48349:8;48327:9;:31::i;:::-;48369:34;48382:20;46491:10;48382:8:::0;:20:::3;:::i;48369:34::-;-1:-1:-1::0;;4905:1:0::1;5855:7;:22:::0;-1:-1:-1;48038:373:0:o;34008:311::-;-1:-1:-1;;;;;34126:24:0;;778:10;34126:24;;34118:63;;;;-1:-1:-1;;;34118:63:0;;14014:2:1;34118:63:0;;;13996:21:1;14053:2;14033:18;;;14026:30;14092:28;14072:18;;;14065:56;14138:18;;34118:63:0;13812:350:1;34118:63:0;778:10;34194:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;34194:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;34194:53:0;;;;;;;;;;34263:48;;540:41:1;;;34194:42:0;;778:10;34263:48;;513:18:1;34263:48:0;;;;;;;34008:311;;:::o;46370:31::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;50770:2509::-;1983:6;;-1:-1:-1;;;;;1983:6:0;778:10;2130:23;2122:68;;;;-1:-1:-1;;;2122:68:0;;;;;;;:::i;:::-;4949:1:::1;5545:7;;:19;;5537:63;;;;-1:-1:-1::0;;;5537:63:0::1;;;;;;;:::i;:::-;4949:1;5678:7;:18:::0;50859:21:::2;50921:42;51002;51083;51163;51242;51320;51397;51472;51550;51632;51710;50838:18;51002:42:::0;51854:5:::2;51833:17;50859:21:::0;51846:4:::2;51833:17;:::i;:::-;51832:27;;;;:::i;:::-;51811:54;::::0;::::2;::::0;;;;;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51797:68;;;;;51884:7;51876:44;;;;-1:-1:-1::0;;;51876:44:0::2;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;51947:13:0;::::2;51991:5;51970:17;:10:::0;51983:4:::2;51970:17;:::i;:::-;51969:27;;;;:::i;:::-;51947:55;::::0;::::2;::::0;;;;;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51933:69;;;;;52021:7;52013:44;;;;-1:-1:-1::0;;;52013:44:0::2;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;52084:12:0;::::2;52127:5;52106:17;:10:::0;52119:4:::2;52106:17;:::i;:::-;52105:27;;;;:::i;:::-;52084:54;::::0;::::2;::::0;;;;;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52070:68;;;;;52157:7;52149:44;;;;-1:-1:-1::0;;;52149:44:0::2;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;52220:14:0;::::2;52265:5;52244:17;:10:::0;52257:4:::2;52244:17;:::i;:::-;52243:27;;;;:::i;:::-;52220:56;::::0;::::2;::::0;;;;;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52206:70;;;;;52295:7;52287:44;;;;-1:-1:-1::0;;;52287:44:0::2;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;52358:10:0;::::2;52398:5;52378:16;:10:::0;52391:3:::2;52378:16;:::i;:::-;52377:26;;;;:::i;:::-;52358:51;::::0;::::2;::::0;;;;;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52344:65;;;;;52428:7;52420:44;;;;-1:-1:-1::0;;;52420:44:0::2;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;52499:11:0;::::2;52540:5;52520:16;:10:::0;52533:3:::2;52520:16;:::i;:::-;52519:26;;;;:::i;:::-;52499:52;::::0;::::2;::::0;;;;;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52485:66;;;;;52570:7;52562:44;;;;-1:-1:-1::0;;;52562:44:0::2;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;52633:9:0;::::2;52672:5;52652:16;:10:::0;52665:3:::2;52652:16;:::i;:::-;52651:26;;;;:::i;:::-;52633:50;::::0;::::2;::::0;;;;;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52619:64;;;;;52702:7;52694:44;;;;-1:-1:-1::0;;;52694:44:0::2;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;52765:7:0;::::2;52802:5;52782:16;:10:::0;52795:3:::2;52782:16;:::i;:::-;52781:26;;;;:::i;:::-;52765:48;::::0;::::2;::::0;;;;;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52751:62;;;;;52832:7;52824:44;;;;-1:-1:-1::0;;;52824:44:0::2;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;52895:10:0;::::2;52935:5;52915:16;:10:::0;52928:3:::2;52915:16;:::i;:::-;52914:26;;;;:::i;:::-;52895:51;::::0;::::2;::::0;;;;;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52881:65;;;;;52965:7;52957:44;;;;-1:-1:-1::0;;;52957:44:0::2;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;53028:10:0;::::2;53068:5;53048:16;:10:::0;53061:3:::2;53048:16;:::i;:::-;53047:26;;;;:::i;:::-;53028:51;::::0;::::2;::::0;;;;;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53014:65;;;;;53098:7;53090:44;;;;-1:-1:-1::0;;;53090:44:0::2;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;53161:14:0;::::2;53205:5;53185:16;:10:::0;53198:3:::2;53185:16;:::i;:::-;53184:26;;;;:::i;:::-;53161:55;::::0;::::2;::::0;;;;;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53147:69;;;;;53235:7;53227:44;;;;-1:-1:-1::0;;;53227:44:0::2;;;;;;;:::i;:::-;-1:-1:-1::0;;4905:1:0::1;5855:7;:22:::0;-1:-1:-1;;;;;;;;;;;50770:2509:0:o;35152:355::-;35311:28;35321:4;35327:2;35331:7;35311:9;:28::i;:::-;35372:48;35395:4;35401:2;35405:7;35414:5;35372:22;:48::i;:::-;35350:149;;;;-1:-1:-1;;;35350:149:0;;;;;;;:::i;:::-;35152:355;;;;:::o;45374:505::-;45516:4;45533:12;45569:7;1983:6;;-1:-1:-1;;;;;1983:6:0;;1910:87;45569:7;45558:25;;;-1:-1:-1;;;;;15637:15:1;;;45558:25:0;;;15619:34:1;15689:15;;;15669:18;;;15662:43;15554:18;;45558:25:0;;;;;;;;;;;;45548:36;;;;;;45533:51;;45595:15;45690:4;45637:58;;;;;;;15958:66:1;15946:79;;16050:2;16041:12;;16034:28;;;;16087:2;16078:12;;15716:380;45637:58:0;;;;-1:-1:-1;;45637:58:0;;;;;;;;;45613:93;;45637:58;45613:93;;;;45717:11;45731:30;;;;;;;;;16328:25:1;;;16401:4;16389:17;;16369:18;;;16362:45;;;;16423:18;;;16416:34;;;16466:18;;;16459:34;;;45613:93:0;;-1:-1:-1;45717:11:0;45731:30;;16300:19:1;;45731:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;45731:30:0;;-1:-1:-1;;45731:30:0;;45782:13;;45731:30;;-1:-1:-1;;;;;;45782:20:0;;;:13;;:20;;-1:-1:-1;45774:57:0;;;;-1:-1:-1;;;45774:57:0;;16706:2:1;45774:57:0;;;16688:21:1;16745:2;16725:18;;;16718:30;16784:26;16764:18;;;16757:54;16828:18;;45774:57:0;16504:348:1;45774:57:0;45851:13;;-1:-1:-1;;;;;45851:13:0;;;:20;;;;-1:-1:-1;;;45374:505:0;;;;;;;:::o;50088:569::-;50207:13;50246:17;50254:8;35819:4;35853:12;-1:-1:-1;35843:22:0;35762:111;50246:17;50238:48;;;;-1:-1:-1;;;50238:48:0;;17059:2:1;50238:48:0;;;17041:21:1;17098:2;17078:18;;;17071:30;-1:-1:-1;;;17117:18:1;;;17110:48;17175:18;;50238:48:0;16857:342:1;50238:48:0;50359:20;;;;;;;;;;;;50349:31;;;;;50313;;50330:13;;50313:31;;:::i;:::-;;;;;;;;;;;;;50303:42;;;;;;:77;50299:134;;;50404:17;50397:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50088:569;;;:::o;50299:134::-;50495:1;50471:13;50465:27;;;;;:::i;:::-;;;:31;:184;;;;;;;;;;;;;;;;;50562:13;50577:19;:8;:17;:19::i;:::-;50598:9;;50545:63;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;50445:204;50088:569;-1:-1:-1;;50088:569:0:o;49242:113::-;49300:7;49327:20;49341:5;49327:13;:20::i;54238:105::-;1983:6;;-1:-1:-1;;;;;1983:6:0;778:10;2130:23;2122:68;;;;-1:-1:-1;;;2122:68:0;;;;;;;:::i;:::-;54309:16:::1;:26:::0;;-1:-1:-1;;54309:26:0::1;::::0;::::1;;::::0;;;::::1;::::0;;54238:105::o;2810:229::-;1983:6;;-1:-1:-1;;;;;1983:6:0;778:10;2130:23;2122:68;;;;-1:-1:-1;;;2122:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;2913:22:0;::::1;2891:110;;;::::0;-1:-1:-1;;;2891:110:0;;19400:2:1;2891:110:0::1;::::0;::::1;19382:21:1::0;19439:2;19419:18;;;19412:30;19478:34;19458:18;;;19451:62;-1:-1:-1;;;19529:18:1;;;19522:36;19575:19;;2891:110:0::1;19198:402:1::0;2891:110:0::1;3012:19;3022:8;3012:9;:19::i;:::-;2810:229:::0;:::o;39829:196::-;39944:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;39944:29:0;-1:-1:-1;;;;;39944:29:0;;;;;;;;;39989:28;;39944:24;;39989:28;;;;;;;39829:196;;;:::o;35881:104::-;35950:27;35960:2;35964:8;35950:27;;;;;;;;;;;;:9;:27::i;49728:223::-;49805:5;49792:9;:18;;49784:52;;;;-1:-1:-1;;;49784:52:0;;19807:2:1;49784:52:0;;;19789:21:1;19846:2;19826:18;;;19819:30;-1:-1:-1;;;19865:18:1;;;19858:51;19926:18;;49784:52:0;19605:345:1;49784:52:0;49863:5;49851:9;:17;49847:97;;;49893:10;49885:47;49914:17;49926:5;49914:9;:17;:::i;:::-;49885:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38002:1709;38117:35;38155:20;38167:7;38155:11;:20::i;:::-;38230:18;;38117:58;;-1:-1:-1;38188:22:0;;-1:-1:-1;;;;;38214:34:0;778:10;-1:-1:-1;;;;;38214:34:0;;:87;;;-1:-1:-1;778:10:0;38265:20;38277:7;38265:11;:20::i;:::-;-1:-1:-1;;;;;38265:36:0;;38214:87;:154;;;-1:-1:-1;38335:18:0;;38318:50;;778:10;34390:214;:::i;38318:50::-;38188:181;;38404:17;38382:117;;;;-1:-1:-1;;;38382:117:0;;20287:2:1;38382:117:0;;;20269:21:1;20326:2;20306:18;;;20299:30;20365:34;20345:18;;;20338:62;-1:-1:-1;;;20416:18:1;;;20409:48;20474:19;;38382:117:0;20085:414:1;38382:117:0;38556:4;-1:-1:-1;;;;;38534:26:0;:13;:18;;;-1:-1:-1;;;;;38534:26:0;;38512:114;;;;-1:-1:-1;;;38512:114:0;;20706:2:1;38512:114:0;;;20688:21:1;20745:2;20725:18;;;20718:30;20784:34;20764:18;;;20757:62;-1:-1:-1;;;20835:18:1;;;20828:36;20881:19;;38512:114:0;20504:402:1;38512:114:0;-1:-1:-1;;;;;38645:16:0;;38637:66;;;;-1:-1:-1;;;38637:66:0;;21113:2:1;38637:66:0;;;21095:21:1;21152:2;21132:18;;;21125:30;21191:34;21171:18;;;21164:62;-1:-1:-1;;;21242:18:1;;;21235:35;21287:19;;38637:66:0;20911:401:1;38637:66:0;38824:49;38841:1;38845:7;38854:13;:18;;;38824:8;:49::i;:::-;-1:-1:-1;;;;;38886:18:0;;;;;;:12;:18;;;;;:31;;38916:1;;38886:18;:31;;38916:1;;-1:-1:-1;;;;;38886:31:0;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;38886:31:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;38928:16:0;;-1:-1:-1;38928:16:0;;;:12;:16;;;;;:29;;-1:-1:-1;;;38928:16:0;;:29;;-1:-1:-1;;38928:29:0;;:::i;:::-;;;-1:-1:-1;;;;;38928:29:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38991:43:0;;;;;;;;-1:-1:-1;;;;;38991:43:0;;;;;;39017:15;38991:43;;;;;;;;;-1:-1:-1;38968:20:0;;;:11;:20;;;;;;:66;;;;;;;;;-1:-1:-1;;;38968:66:0;-1:-1:-1;;;;;;38968:66:0;;;;;;;;;;;39296:11;38980:7;-1:-1:-1;39296:11:0;:::i;:::-;39363:1;39322:24;;;:11;:24;;;;;:29;39274:33;;-1:-1:-1;;;;;;39322:29:0;39318:288;;39386:20;39394:11;35819:4;35853:12;-1:-1:-1;35843:22:0;35762:111;39386:20;39382:213;;;39454:125;;;;;;;;39491:18;;-1:-1:-1;;;;;39454:125:0;;;;;;39532:28;;;;39454:125;;;;;;;;;;-1:-1:-1;39427:24:0;;;:11;:24;;;;;;;:152;;;;;;;;;-1:-1:-1;;;39427:152:0;-1:-1:-1;;;;;;39427:152:0;;;;;;;;;;;;39382:213;39642:7;39638:2;-1:-1:-1;;;;;39623:27:0;39632:4;-1:-1:-1;;;;;39623:27:0;;;;;;;;;;;39661:42;38106:1605;;;38002:1709;;;:::o;40189:950::-;40283:24;;40326:12;40318:49;;;;-1:-1:-1;;;40318:49:0;;22028:2:1;40318:49:0;;;22010:21:1;22067:2;22047:18;;;22040:30;22106:26;22086:18;;;22079:54;22150:18;;40318:49:0;21826:348:1;40318:49:0;40378:16;40428:1;40397:28;40417:8;40397:17;:28;:::i;:::-;:32;;;;:::i;:::-;40378:51;-1:-1:-1;40455:18:0;40472:1;40455:14;:18;:::i;:::-;40444:8;:29;40440:91;;;40501:18;40518:1;40501:14;:18;:::i;:::-;40490:29;;40440:91;40654:17;40662:8;35819:4;35853:12;-1:-1:-1;35843:22:0;35762:111;40654:17;40646:68;;;;-1:-1:-1;;;40646:68:0;;22381:2:1;40646:68:0;;;22363:21:1;22420:2;22400:18;;;22393:30;22459:34;22439:18;;;22432:62;-1:-1:-1;;;22510:18:1;;;22503:36;22556:19;;40646:68:0;22179:402:1;40646:68:0;40742:17;40725:357;40766:8;40761:1;:13;40725:357;;40831:1;40800:14;;;:11;:14;;;;;:19;-1:-1:-1;;;;;40800:19:0;40796:275;;40854:31;40888:14;40900:1;40888:11;:14::i;:::-;40938:117;;;;;;;;40975:14;;-1:-1:-1;;;;;40938:117:0;;;;;;41012:24;;;;40938:117;;;;;;;;;;-1:-1:-1;40921:14:0;;;:11;:14;;;;;;;:134;;;;;;;;;-1:-1:-1;;;40921:134:0;-1:-1:-1;;;;;;40921:134:0;;;;;;;;;;;;-1:-1:-1;40796:275:0;40776:3;;;;:::i;:::-;;;;40725:357;;;-1:-1:-1;41119:12:0;:8;41130:1;41119:12;:::i;:::-;41092:24;:39;-1:-1:-1;;;40189:950:0:o;31014:682::-;-1:-1:-1;;;;;;;;;;;;;;;;;31149:16:0;31157:7;35819:4;35853:12;-1:-1:-1;35843:22:0;35762:111;31149:16;31141:71;;;;-1:-1:-1;;;31141:71:0;;22788:2:1;31141:71:0;;;22770:21:1;22827:2;22807:18;;;22800:30;22866:34;22846:18;;;22839:62;-1:-1:-1;;;22917:18:1;;;22910:40;22967:19;;31141:71:0;22586:406:1;31141:71:0;31225:26;31277:12;31266:7;:23;31262:103;;31327:22;31337:12;31327:7;:22;:::i;:::-;:26;;31352:1;31327:26;:::i;:::-;31306:47;;31262:103;31397:7;31377:242;31414:18;31406:4;:26;31377:242;;31457:31;31491:17;;;:11;:17;;;;;;;;;31457:51;;;;;;;;;-1:-1:-1;;;;;31457:51:0;;;;;-1:-1:-1;;;31457:51:0;;;;;;;;;;;;31527:28;31523:85;;31583:9;31014:682;-1:-1:-1;;;;31014:682:0:o;31523:85::-;-1:-1:-1;31434:6:0;;;;:::i;:::-;;;;31377:242;;;-1:-1:-1;31631:57:0;;-1:-1:-1;;;31631:57:0;;23340:2:1;31631:57:0;;;23322:21:1;23379:2;23359:18;;;23352:30;23418:34;23398:18;;;23391:62;-1:-1:-1;;;23469:18:1;;;23462:45;23524:19;;31631:57:0;23138:411:1;3047:173:0;3122:6;;;-1:-1:-1;;;;;3139:17:0;;;-1:-1:-1;;;;;;3139:17:0;;;;;;;3172:40;;3122:6;;;3139:17;3122:6;;3172:40;;3103:16;;3172:40;3092:128;3047:173;:::o;41704:985::-;41859:4;-1:-1:-1;;;;;41880:13:0;;15353:20;15401:8;41876:806;;41933:175;;-1:-1:-1;;;41933:175:0;;-1:-1:-1;;;;;41933:36:0;;;;;:175;;778:10;;42027:4;;42054:7;;42084:5;;41933:175;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41933:175:0;;;;;;;;-1:-1:-1;;41933:175:0;;;;;;;;;;;;:::i;:::-;;;41912:715;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42295:13:0;;42291:321;;42338:109;;-1:-1:-1;;;42338:109:0;;;;;;;:::i;42291:321::-;42562:6;42556:13;42547:6;42543:2;42539:15;42532:38;41912:715;-1:-1:-1;;;;;;42172:55:0;-1:-1:-1;;;42172:55:0;;-1:-1:-1;42165:62:0;;41876:806;-1:-1:-1;42666:4:0;42659:11;;23117:723;23173:13;23394:10;23390:53;;-1:-1:-1;;23421:10:0;;;;;;;;;;;;-1:-1:-1;;;23421:10:0;;;;;23117:723::o;23390:53::-;23468:5;23453:12;23509:78;23516:9;;23509:78;;23542:8;;;;:::i;:::-;;-1:-1:-1;23565:10:0;;-1:-1:-1;23573:2:0;23565:10;;:::i;:::-;;;23509:78;;;23597:19;23629:6;23619:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23619:17:0;;23597:39;;23647:154;23654:10;;23647:154;;23681:11;23691:1;23681:11;;:::i;:::-;;-1:-1:-1;23750:10:0;23758:2;23750:5;:10;:::i;:::-;23737:24;;:2;:24;:::i;:::-;23724:39;;23707:6;23714;23707:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;23707:56:0;;;;;;;;-1:-1:-1;23778:11:0;23787:2;23778:11;;:::i;:::-;;;23647:154;;30740:266;30801:7;-1:-1:-1;;;;;30843:19:0;;30821:118;;;;-1:-1:-1;;;30821:118:0;;24753:2:1;30821:118:0;;;24735:21:1;24792:2;24772:18;;;24765:30;24831:34;24811:18;;;24804:62;-1:-1:-1;;;24882:18:1;;;24875:47;24939:19;;30821:118:0;24551:413:1;30821:118:0;-1:-1:-1;;;;;;30965:19:0;;;;;:12;:19;;;;;:32;-1:-1:-1;;;30965:32:0;;-1:-1:-1;;;;;30965:32:0;;30740:266::o;36348:1400::-;36471:20;36494:12;-1:-1:-1;;;;;36525:16:0;;36517:62;;;;-1:-1:-1;;;36517:62:0;;25171:2:1;36517:62:0;;;25153:21:1;25210:2;25190:18;;;25183:30;25249:34;25229:18;;;25222:62;-1:-1:-1;;;25300:18:1;;;25293:31;25341:19;;36517:62:0;24969:397:1;36517:62:0;36724:21;36732:12;35819:4;35853:12;-1:-1:-1;35843:22:0;35762:111;36724:21;36723:22;36715:64;;;;-1:-1:-1;;;36715:64:0;;25573:2:1;36715:64:0;;;25555:21:1;25612:2;25592:18;;;25585:30;25651:31;25631:18;;;25624:59;25700:18;;36715:64:0;25371:353:1;36715:64:0;36810:12;36798:8;:24;;36790:71;;;;-1:-1:-1;;;36790:71:0;;25931:2:1;36790:71:0;;;25913:21:1;25970:2;25950:18;;;25943:30;26009:34;25989:18;;;25982:62;-1:-1:-1;;;26060:18:1;;;26053:32;26102:19;;36790:71:0;25729:398:1;36790:71:0;-1:-1:-1;;;;;36981:16:0;;36948:30;36981:16;;;:12;:16;;;;;;;;;36948:49;;;;;;;;;-1:-1:-1;;;;;36948:49:0;;;;;-1:-1:-1;;;36948:49:0;;;;;;;;;;;37027:135;;;;;;;;37053:19;;36948:49;;37027:135;;;37053:39;;37083:8;;37053:39;:::i;:::-;-1:-1:-1;;;;;37027:135:0;;;;;37142:8;37107:11;:24;;;:44;;;;:::i;:::-;-1:-1:-1;;;;;37027:135:0;;;;;;-1:-1:-1;;;;;37008:16:0;;;;;;;:12;:16;;;;;;;;:154;;;;;;;;-1:-1:-1;;;37008:154:0;;;;;;;;;;;;37201:43;;;;;;;;;;;37227:15;37201:43;;;;;;;;37173:25;;;:11;:25;;;;;;:71;;;;;;;;;-1:-1:-1;;;37173:71:0;-1:-1:-1;;;;;;37173:71:0;;;;;;;;;;;;;;;;;;37185:12;;37305:325;37329:8;37325:1;:12;37305:325;;;37364:38;;37389:12;;-1:-1:-1;;;;;37364:38:0;;;37381:1;;37364:38;;37381:1;;37364:38;37443:59;37474:1;37478:2;37482:12;37496:5;37443:22;:59::i;:::-;37417:172;;;;-1:-1:-1;;;37417:172:0;;;;;;;:::i;:::-;37604:14;;;;:::i;:::-;;;;37339:3;;;;;:::i;:::-;;;;37305:325;;;-1:-1:-1;37642:12:0;:27;;;37680:60;35152:355;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;:::-;384:5;150:245;-1:-1:-1;;;150:245:1:o;592:173::-;660:20;;-1:-1:-1;;;;;709:31:1;;699:42;;689:70;;755:1;752;745:12;689:70;592:173;;;:::o;770:186::-;829:6;882:2;870:9;861:7;857:23;853:32;850:52;;;898:1;895;888:12;850:52;921:29;940:9;921:29;:::i;961:258::-;1033:1;1043:113;1057:6;1054:1;1051:13;1043:113;;;1133:11;;;1127:18;1114:11;;;1107:39;1079:2;1072:10;1043:113;;;1174:6;1171:1;1168:13;1165:48;;;-1:-1:-1;;1209:1:1;1191:16;;1184:27;961:258::o;1224:::-;1266:3;1304:5;1298:12;1331:6;1326:3;1319:19;1347:63;1403:6;1396:4;1391:3;1387:14;1380:4;1373:5;1369:16;1347:63;:::i;:::-;1464:2;1443:15;-1:-1:-1;;1439:29:1;1430:39;;;;1471:4;1426:50;;1224:258;-1:-1:-1;;1224:258:1:o;1487:220::-;1636:2;1625:9;1618:21;1599:4;1656:45;1697:2;1686:9;1682:18;1674:6;1656:45;:::i;1712:180::-;1771:6;1824:2;1812:9;1803:7;1799:23;1795:32;1792:52;;;1840:1;1837;1830:12;1792:52;-1:-1:-1;1863:23:1;;1712:180;-1:-1:-1;1712:180:1:o;2105:254::-;2173:6;2181;2234:2;2222:9;2213:7;2209:23;2205:32;2202:52;;;2250:1;2247;2240:12;2202:52;2273:29;2292:9;2273:29;:::i;:::-;2263:39;2349:2;2334:18;;;;2321:32;;-1:-1:-1;;;2105:254:1:o;2364:156::-;2430:20;;2490:4;2479:16;;2469:27;;2459:55;;2510:1;2507;2500:12;2525:387;2609:6;2617;2625;2633;2686:3;2674:9;2665:7;2661:23;2657:33;2654:53;;;2703:1;2700;2693:12;2654:53;2739:9;2726:23;2716:33;;2796:2;2785:9;2781:18;2768:32;2758:42;;2847:2;2836:9;2832:18;2819:32;2809:42;;2870:36;2902:2;2891:9;2887:18;2870:36;:::i;:::-;2860:46;;2525:387;;;;;;;:::o;3099:328::-;3176:6;3184;3192;3245:2;3233:9;3224:7;3220:23;3216:32;3213:52;;;3261:1;3258;3251:12;3213:52;3284:29;3303:9;3284:29;:::i;:::-;3274:39;;3332:38;3366:2;3355:9;3351:18;3332:38;:::i;:::-;3322:48;;3417:2;3406:9;3402:18;3389:32;3379:42;;3099:328;;;;;:::o;3432:160::-;3497:20;;3553:13;;3546:21;3536:32;;3526:60;;3582:1;3579;3572:12;3597:180;3653:6;3706:2;3694:9;3685:7;3681:23;3677:32;3674:52;;;3722:1;3719;3712:12;3674:52;3745:26;3761:9;3745:26;:::i;3782:127::-;3843:10;3838:3;3834:20;3831:1;3824:31;3874:4;3871:1;3864:15;3898:4;3895:1;3888:15;3914:632;3979:5;4009:18;4050:2;4042:6;4039:14;4036:40;;;4056:18;;:::i;:::-;4131:2;4125:9;4099:2;4185:15;;-1:-1:-1;;4181:24:1;;;4207:2;4177:33;4173:42;4161:55;;;4231:18;;;4251:22;;;4228:46;4225:72;;;4277:18;;:::i;:::-;4317:10;4313:2;4306:22;4346:6;4337:15;;4376:6;4368;4361:22;4416:3;4407:6;4402:3;4398:16;4395:25;4392:45;;;4433:1;4430;4423:12;4392:45;4483:6;4478:3;4471:4;4463:6;4459:17;4446:44;4538:1;4531:4;4522:6;4514;4510:19;4506:30;4499:41;;;;3914:632;;;;;:::o;4551:451::-;4620:6;4673:2;4661:9;4652:7;4648:23;4644:32;4641:52;;;4689:1;4686;4679:12;4641:52;4729:9;4716:23;4762:18;4754:6;4751:30;4748:50;;;4794:1;4791;4784:12;4748:50;4817:22;;4870:4;4862:13;;4858:27;-1:-1:-1;4848:55:1;;4899:1;4896;4889:12;4848:55;4922:74;4988:7;4983:2;4970:16;4965:2;4961;4957:11;4922:74;:::i;5554:254::-;5619:6;5627;5680:2;5668:9;5659:7;5655:23;5651:32;5648:52;;;5696:1;5693;5686:12;5648:52;5719:29;5738:9;5719:29;:::i;:::-;5709:39;;5767:35;5798:2;5787:9;5783:18;5767:35;:::i;:::-;5757:45;;5554:254;;;;;:::o;5813:667::-;5908:6;5916;5924;5932;5985:3;5973:9;5964:7;5960:23;5956:33;5953:53;;;6002:1;5999;5992:12;5953:53;6025:29;6044:9;6025:29;:::i;:::-;6015:39;;6073:38;6107:2;6096:9;6092:18;6073:38;:::i;:::-;6063:48;;6158:2;6147:9;6143:18;6130:32;6120:42;;6213:2;6202:9;6198:18;6185:32;6240:18;6232:6;6229:30;6226:50;;;6272:1;6269;6262:12;6226:50;6295:22;;6348:4;6340:13;;6336:27;-1:-1:-1;6326:55:1;;6377:1;6374;6367:12;6326:55;6400:74;6466:7;6461:2;6448:16;6443:2;6439;6435:11;6400:74;:::i;:::-;6390:84;;;5813:667;;;;;;;:::o;6485:393::-;6569:6;6577;6585;6593;6646:3;6634:9;6625:7;6621:23;6617:33;6614:53;;;6663:1;6660;6653:12;6614:53;6686:29;6705:9;6686:29;:::i;:::-;6676:39;;6762:2;6751:9;6747:18;6734:32;6724:42;;6813:2;6802:9;6798:18;6785:32;6775:42;;6836:36;6868:2;6857:9;6853:18;6836:36;:::i;6883:260::-;6951:6;6959;7012:2;7000:9;6991:7;6987:23;6983:32;6980:52;;;7028:1;7025;7018:12;6980:52;7051:29;7070:9;7051:29;:::i;:::-;7041:39;;7099:38;7133:2;7122:9;7118:18;7099:38;:::i;7148:356::-;7350:2;7332:21;;;7369:18;;;7362:30;7428:34;7423:2;7408:18;;7401:62;7495:2;7480:18;;7148:356::o;7509:380::-;7588:1;7584:12;;;;7631;;;7652:61;;7706:4;7698:6;7694:17;7684:27;;7652:61;7759:2;7751:6;7748:14;7728:18;7725:38;7722:161;;;7805:10;7800:3;7796:20;7793:1;7786:31;7840:4;7837:1;7830:15;7868:4;7865:1;7858:15;7722:161;;7509:380;;;:::o;9137:350::-;9339:2;9321:21;;;9378:2;9358:18;;;9351:30;9417:28;9412:2;9397:18;;9390:56;9478:2;9463:18;;9137:350::o;9492:355::-;9694:2;9676:21;;;9733:2;9713:18;;;9706:30;9772:33;9767:2;9752:18;;9745:61;9838:2;9823:18;;9492:355::o;9852:127::-;9913:10;9908:3;9904:20;9901:1;9894:31;9944:4;9941:1;9934:15;9968:4;9965:1;9958:15;9984:128;10024:3;10055:1;10051:6;10048:1;10045:13;10042:39;;;10061:18;;:::i;:::-;-1:-1:-1;10097:9:1;;9984:128::o;10117:342::-;10319:2;10301:21;;;10358:2;10338:18;;;10331:30;-1:-1:-1;;;10392:2:1;10377:18;;10370:48;10450:2;10435:18;;10117:342::o;11512:168::-;11552:7;11618:1;11614;11610:6;11606:14;11603:1;11600:21;11595:1;11588:9;11581:17;11577:45;11574:71;;;11625:18;;:::i;:::-;-1:-1:-1;11665:9:1;;11512:168::o;12088:135::-;12127:3;-1:-1:-1;;12148:17:1;;12145:43;;;12168:18;;:::i;:::-;-1:-1:-1;12215:1:1;12204:13;;12088:135::o;14167:127::-;14228:10;14223:3;14219:20;14216:1;14209:31;14259:4;14256:1;14249:15;14283:4;14280:1;14273:15;14299:120;14339:1;14365;14355:35;;14370:18;;:::i;:::-;-1:-1:-1;14404:9:1;;14299:120::o;14634:348::-;14836:2;14818:21;;;14875:2;14855:18;;;14848:30;14914:26;14909:2;14894:18;;14887:54;14973:2;14958:18;;14634:348::o;14987:415::-;15189:2;15171:21;;;15228:2;15208:18;;;15201:30;15267:34;15262:2;15247:18;;15240:62;-1:-1:-1;;;15333:2:1;15318:18;;15311:49;15392:3;15377:19;;14987:415::o;17541:973::-;17626:12;;17591:3;;17681:1;17701:18;;;;17754;;;;17781:61;;17835:4;17827:6;17823:17;17813:27;;17781:61;17861:2;17909;17901:6;17898:14;17878:18;17875:38;17872:161;;;17955:10;17950:3;17946:20;17943:1;17936:31;17990:4;17987:1;17980:15;18018:4;18015:1;18008:15;17872:161;18049:18;18076:104;;;;18194:1;18189:319;;;;18042:466;;18076:104;-1:-1:-1;;18109:24:1;;18097:37;;18154:16;;;;-1:-1:-1;18076:104:1;;18189:319;17488:1;17481:14;;;17525:4;17512:18;;18283:1;18297:165;18311:6;18308:1;18305:13;18297:165;;;18389:14;;18376:11;;;18369:35;18432:16;;;;18326:10;;18297:165;;;18301:3;;18491:6;18486:3;18482:16;18475:23;;18042:466;;;;;;;17541:973;;;;:::o;18519:197::-;18647:3;18672:38;18706:3;18698:6;18672:38;:::i;18721:472::-;18925:3;18953:38;18987:3;18979:6;18953:38;:::i;:::-;19020:6;19014:13;19036:52;19081:6;19077:2;19070:4;19062:6;19058:17;19036:52;:::i;:::-;19110:15;19134:21;;;-1:-1:-1;;19182:4:1;19171:16;;18721:472;-1:-1:-1;;18721:472:1:o;19955:125::-;19995:4;20023:1;20020;20017:8;20014:34;;;20028:18;;:::i;:::-;-1:-1:-1;20065:9:1;;19955:125::o;21317:246::-;21357:4;-1:-1:-1;;;;;21470:10:1;;;;21440;;21492:12;;;21489:38;;;21507:18;;:::i;:::-;21544:13;;21317:246;-1:-1:-1;;;21317:246:1:o;21568:253::-;21608:3;-1:-1:-1;;;;;21697:2:1;21694:1;21690:10;21727:2;21724:1;21720:10;21758:3;21754:2;21750:12;21745:3;21742:21;21739:47;;;21766:18;;:::i;:::-;21802:13;;21568:253;-1:-1:-1;;;;21568:253:1:o;22997:136::-;23036:3;23064:5;23054:39;;23073:18;;:::i;:::-;-1:-1:-1;;;23109:18:1;;22997:136::o;23554:489::-;-1:-1:-1;;;;;23823:15:1;;;23805:34;;23875:15;;23870:2;23855:18;;23848:43;23922:2;23907:18;;23900:34;;;23970:3;23965:2;23950:18;;23943:31;;;23748:4;;23991:46;;24017:19;;24009:6;23991:46;:::i;:::-;23983:54;23554:489;-1:-1:-1;;;;;;23554:489:1:o;24048:249::-;24117:6;24170:2;24158:9;24149:7;24145:23;24141:32;24138:52;;;24186:1;24183;24176:12;24138:52;24218:9;24212:16;24237:30;24261:5;24237:30;:::i;24302:112::-;24334:1;24360;24350:35;;24365:18;;:::i;:::-;-1:-1:-1;24399:9:1;;24302:112::o;24419:127::-;24480:10;24475:3;24471:20;24468:1;24461:31;24511:4;24508:1;24501:15;24535:4;24532:1;24525:15

Swarm Source

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