ETH Price: $3,672.98 (+2.43%)

Token

ERC-20: Alien Scum Fleet (ASF)
 

Overview

Max Total Supply

1,250 ASF

Holders

369

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
24 ASF
0x9a19a8b4c6e6ad8bf6ff72cebc44ea5f306996d4
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:
ASF

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

// Sources flattened with hardhat v2.8.3 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

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

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

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

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

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


pragma solidity 0.8.9;





contract ASF is ERC721A, Ownable, ReentrancyGuard, ControlledAccess {
    using Strings for uint256; 
    /** Contract Functionality Variables */
    uint256 public constant maxPublicMintPerAddress = 10;
    uint256 public constant maxPresaleMintPerAddress = 5;
    uint256 public constant mintPrice = 0.042 ether;
    uint256 public constant whitelistMintPrice = 0.0169 ether;
    bool public publicSaleActive = false;
    bool public presaleActive = false;

    /** URI Variables */
    bytes32 public uriSuffix = ".json";
    string private _baseTokenURI = "";
    string public hiddenMetadataUri = "ipfs://QmVJf7dx8h9c7FPBN17LoSzRNNHjdgnvXqUG9KG3y8yT7F/hidden.json";

    /** Constructor - initialize the contract by setting the name, symbol, 
        max amount an address can mint, and the total collection size. */
    constructor() ERC721A( "Alien Scum Fleet", "ASF", maxPublicMintPerAddress, 6969) {
    }

    /** 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 Compliance 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 withdraw() external onlyOwner nonReentrant {
        uint256 sendAmount = address(this).balance;

        address lawi = payable(0xdC2719e36B1028Ad840B21Cd08D4F395c09A7015); 
        address bunzo = payable(0x987F613dD3460bDCEd24Eeebfe13dE9Bf9D8d2B8); 
        address robatic = payable(0xDd730Aa1583396214Aa2D92Cfa92880b9d93E201); 
        address lashes = payable(0x141cA54Db6F8277917e0554b30F2B3270F65EB67); 
        address willy = payable(0x4Bd3BB6B1D03c8844476e525fF291627FbC3c0eA); 
        address yeti = payable(0x66c17Dcef1B364014573Ae0F869ad1c05fe01c89); 
        address dale = payable(0x64e293dd4BBA0756895cdB8FE3a2f8E2f4AD4071); 
        address marv = payable(0xEcf02b27e4f6Ff7E3C609652DE4B37F65A74d86B); 
        address community = payable(0xA868Ce0B203031B2E72330e8512c8729770c0759); 

        bool success;
        (success, ) = lawi.call{value: ((sendAmount * 1575) / 10000)}("");
        require(success, "Transaction unsuccessful");
        (success, ) = bunzo.call{value: ((sendAmount * 1575) / 10000)}("");
        require(success, "Transaction unsuccessful");
        (success, ) = robatic.call{value: ((sendAmount * 1575) / 10000)}("");
        require(success, "Transaction unsuccessful");
        (success, ) = lashes.call{value: ((sendAmount * 1575) / 10000)}("");
        require(success, "Transaction unsuccessful");
        (success, ) = willy.call{value: ((sendAmount * 3) / 100)}("");
        require(success, "Transaction unsuccessful");
        (success, ) = yeti.call{value: ((sendAmount * 12) / 100)}("");
        require(success, "Transaction unsuccessful");
        (success, ) = dale.call{value: ((sendAmount * 1) / 100)}("");
        require(success, "Transaction unsuccessful");
        (success, ) = marv.call{value: ((sendAmount * 1) / 100)}("");
        require(success, "Transaction unsuccessful");
        (success, ) = community.call{value: ((sendAmount * 20) / 100)}("");
        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 togglePresaleActive() public onlyOwner {
        presaleActive = !presaleActive;
    }

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

   /** 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":[],"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":"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":[],"name":"togglePresaleActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"togglePublicSaleActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","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":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60008080556007819055600a805461ffff60a01b1916905564173539b7b760d91b600b5560e0604081905260c08290526200003e91600c919062000237565b50604051806080016040528060418152602001620037f06041913980516200006f91600d9160209091019062000237565b503480156200007d57600080fd5b506040518060400160405280601081526020016f105b1a595b8814d8dd5b48119b19595d60821b8152506040518060400160405280600381526020016220a9a360e91b815250600a611b3960008111620001355760405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20636f6c6c656374696f6e206d757374206861766520612060448201526d6e6f6e7a65726f20737570706c7960901b60648201526084015b60405180910390fd5b60008211620001975760405162461bcd60e51b815260206004820152602760248201527f455243373231413a206d61782062617463682073697a65206d757374206265206044820152666e6f6e7a65726f60c81b60648201526084016200012c565b8351620001ac90600190602087019062000237565b508251620001c290600290602086019062000237565b5060a09190915260805250620001da905033620001e5565b60016009556200031a565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200024590620002dd565b90600052602060002090601f016020900481019282620002695760008555620002b4565b82601f106200028457805160ff1916838001178555620002b4565b82800160010185558215620002b4579182015b82811115620002b457825182559160200191906001019062000297565b50620002c2929150620002c6565b5090565b5b80821115620002c25760008155600101620002c7565b600181811c90821680620002f257607f821691505b602082108114156200031457634e487b7160e01b600052602260045260246000fd5b50919050565b60805160a0516134866200036a600039600081816125230152818161254d0152612a00015260008181610b33015281816114bb0152818161179101528181612328015261235a01526134866000f3fe6080604052600436106102515760003560e01c80636352211e11610139578063a22cb465116100b6578063c87b56dd1161007a578063c87b56dd146106b9578063d7224ba0146106d9578063dc33e681146106ef578063dfb1b5451461070f578063e985e9c514610724578063f2fde38b1461076d57600080fd5b8063a22cb46514610623578063a45ba8e714610643578063b88d4fde14610658578063bc8893b414610678578063c1dd27dc1461069957600080fd5b806389b0649b116100fd57806389b0649b1461057a5780638da5cb5b1461058f5780639231ab2a146105ad57806395d89b41146105fb578063a0712d681461061057600080fd5b80636352211e146104f55780636817c76c1461051557806370a0823114610530578063715018a61461055057806383c6d18a1461056557600080fd5b80632f745c59116101d25780634f6ccce7116101965780634f6ccce71461043e578063512507c61461045e57806353135ca01461047e5780635503a0e81461049f57806355f804b3146104b55780635b7633d0146104d557600080fd5b80632f745c59146103ae57806335c6aaf8146103ce5780633ccfd60b146103e957806342842e0e146103fe578063484b973c1461041e57600080fd5b80630c894cfe116102195780630c894cfe146103275780631749dc261461033c57806318160ddd1461034f57806323b872dd1461036e5780632d20fb601461038e57600080fd5b806301ffc9a714610256578063046dc1661461028b57806306fdde03146102ad578063081812fc146102cf578063095ea7b314610307575b600080fd5b34801561026257600080fd5b50610276610271366004612cc4565b61078d565b60405190151581526020015b60405180910390f35b34801561029757600080fd5b506102ab6102a6366004612d04565b6107fa565b005b3480156102b957600080fd5b506102c261084f565b6040516102829190612d77565b3480156102db57600080fd5b506102ef6102ea366004612d8a565b6108e1565b6040516001600160a01b039091168152602001610282565b34801561031357600080fd5b506102ab610322366004612da3565b61096c565b34801561033357600080fd5b506102ab610a84565b6102ab61034a366004612dde565b610acf565b34801561035b57600080fd5b506000545b604051908152602001610282565b34801561037a57600080fd5b506102ab610389366004612e1d565b610ca9565b34801561039a57600080fd5b506102ab6103a9366004612d8a565b610cb4565b3480156103ba57600080fd5b506103606103c9366004612da3565b610d17565b3480156103da57600080fd5b50610360663c0a75e0b4400081565b3480156103f557600080fd5b506102ab610e85565b34801561040a57600080fd5b506102ab610419366004612e1d565b611455565b34801561042a57600080fd5b506102ab610439366004612da3565b611470565b34801561044a57600080fd5b50610360610459366004612d8a565b611519565b34801561046a57600080fd5b506102ab610479366004612ee5565b61157b565b34801561048a57600080fd5b50600a5461027690600160a81b900460ff1681565b3480156104ab57600080fd5b50610360600b5481565b3480156104c157600080fd5b506102ab6104d0366004612ee5565b6115b8565b3480156104e157600080fd5b50600a546102ef906001600160a01b031681565b34801561050157600080fd5b506102ef610510366004612d8a565b6115f5565b34801561052157600080fd5b50610360669536c70891000081565b34801561053c57600080fd5b5061036061054b366004612d04565b611607565b34801561055c57600080fd5b506102ab611698565b34801561057157600080fd5b50610360600581565b34801561058657600080fd5b506102ab6116ce565b34801561059b57600080fd5b506008546001600160a01b03166102ef565b3480156105b957600080fd5b506105cd6105c8366004612d8a565b611719565b6040805182516001600160a01b0316815260209283015167ffffffffffffffff169281019290925201610282565b34801561060757600080fd5b506102c2611736565b6102ab61061e366004612d8a565b611745565b34801561062f57600080fd5b506102ab61063e366004612f2e565b611905565b34801561064f57600080fd5b506102c26119ca565b34801561066457600080fd5b506102ab610673366004612f6a565b611a58565b34801561068457600080fd5b50600a5461027690600160a01b900460ff1681565b3480156106a557600080fd5b506102766106b4366004612fe6565b611a91565b3480156106c557600080fd5b506102c26106d4366004612d8a565b611c10565b3480156106e557600080fd5b5061036060075481565b3480156106fb57600080fd5b5061036061070a366004612d04565b611d8d565b34801561071b57600080fd5b50610360600a81565b34801561073057600080fd5b5061027661073f366004613021565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b34801561077957600080fd5b506102ab610788366004612d04565b611d98565b60006001600160e01b031982166380ac58cd60e01b14806107be57506001600160e01b03198216635b5e139f60e01b145b806107d957506001600160e01b0319821663780e9d6360e01b145b806107f457506301ffc9a760e01b6001600160e01b03198316145b92915050565b6008546001600160a01b0316331461082d5760405162461bcd60e51b815260040161082490613054565b60405180910390fd5b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b60606001805461085e90613089565b80601f016020809104026020016040519081016040528092919081815260200182805461088a90613089565b80156108d75780601f106108ac576101008083540402835291602001916108d7565b820191906000526020600020905b8154815290600101906020018083116108ba57829003601f168201915b5050505050905090565b60006108ee826000541190565b6109505760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b6064820152608401610824565b506000908152600560205260409020546001600160a01b031690565b6000610977826115f5565b9050806001600160a01b0316836001600160a01b031614156109e65760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b6064820152608401610824565b336001600160a01b0382161480610a025750610a02813361073f565b610a745760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c000000000000006064820152608401610824565b610a7f838383611e33565b505050565b6008546001600160a01b03163314610aae5760405162461bcd60e51b815260040161082490613054565b600a805460ff60a01b198116600160a01b9182900460ff1615909102179055565b323314610aee5760405162461bcd60e51b8152600401610824906130c4565b828282610afd33848484611a91565b610b0657600080fd5b60026009541415610b295760405162461bcd60e51b8152600401610824906130fb565b60026009558660057f000000000000000000000000000000000000000000000000000000000000000082610b5c60005490565b610b669190613148565b1115610b845760405162461bcd60e51b815260040161082490613160565b80821115610bca5760405162461bcd60e51b8152602060048201526013602482015272125b9d985b1a59081b5a5b9d08185b5bdd5b9d606a1b6044820152606401610824565b8082610bd533611d8d565b610bdf9190613148565b1115610c265760405162461bcd60e51b815260206004820152601660248201527543616e206e6f74206d696e742074686973206d616e7960501b6044820152606401610824565b600a54600160a81b900460ff16610c765760405162461bcd60e51b8152602060048201526014602482015273283932b9b0b6329034b9903737ba103634bb329760611b6044820152606401610824565b610c80338a611e8f565b610c99610c94663c0a75e0b440008b61318c565b611ea9565b5050600160095550505050505050565b610a7f838383611f2f565b6008546001600160a01b03163314610cde5760405162461bcd60e51b815260040161082490613054565b60026009541415610d015760405162461bcd60e51b8152600401610824906130fb565b6002600955610d0f816122b7565b506001600955565b6000610d2283611607565b8210610d7b5760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604482015261647360f01b6064820152608401610824565b600080549080805b83811015610e25576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915215610dd657805192505b876001600160a01b0316836001600160a01b03161415610e125786841415610e04575093506107f492505050565b83610e0e816131ab565b9450505b5080610e1d816131ab565b915050610d83565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201526d0deeedccae440c4f240d2dcc8caf60931b6064820152608401610824565b6008546001600160a01b03163314610eaf5760405162461bcd60e51b815260040161082490613054565b60026009541415610ed25760405162461bcd60e51b8152600401610824906130fb565b60026009554773dc2719e36b1028ad840b21cd08d4f395c09a701573987f613dd3460bdced24eeebfe13de9bf9d8d2b873dd730aa1583396214aa2d92cfa92880b9d93e20173141ca54db6f8277917e0554b30f2b3270f65eb67734bd3bb6b1d03c8844476e525ff291627fbc3c0ea7366c17dcef1b364014573ae0f869ad1c05fe01c897364e293dd4bba0756895cdb8fe3a2f8e2f4ad407173ecf02b27e4f6ff7e3c609652de4b37f65a74d86b73a868ce0b203031b2e72330e8512c8729770c0759600089612710610fa78d61062761318c565b610fb191906131dc565b604051600081818185875af1925050503d8060008114610fed576040519150601f19603f3d011682016040523d82523d6000602084013e610ff2565b606091505b505080915050806110155760405162461bcd60e51b8152600401610824906131f0565b6001600160a01b03891661271061102e8d61062761318c565b61103891906131dc565b604051600081818185875af1925050503d8060008114611074576040519150601f19603f3d011682016040523d82523d6000602084013e611079565b606091505b5050809150508061109c5760405162461bcd60e51b8152600401610824906131f0565b6001600160a01b0388166127106110b58d61062761318c565b6110bf91906131dc565b604051600081818185875af1925050503d80600081146110fb576040519150601f19603f3d011682016040523d82523d6000602084013e611100565b606091505b505080915050806111235760405162461bcd60e51b8152600401610824906131f0565b6001600160a01b03871661271061113c8d61062761318c565b61114691906131dc565b604051600081818185875af1925050503d8060008114611182576040519150601f19603f3d011682016040523d82523d6000602084013e611187565b606091505b505080915050806111aa5760405162461bcd60e51b8152600401610824906131f0565b6001600160a01b03861660646111c18d600361318c565b6111cb91906131dc565b604051600081818185875af1925050503d8060008114611207576040519150601f19603f3d011682016040523d82523d6000602084013e61120c565b606091505b5050809150508061122f5760405162461bcd60e51b8152600401610824906131f0565b6001600160a01b03851660646112468d600c61318c565b61125091906131dc565b604051600081818185875af1925050503d806000811461128c576040519150601f19603f3d011682016040523d82523d6000602084013e611291565b606091505b505080915050806112b45760405162461bcd60e51b8152600401610824906131f0565b6001600160a01b03841660646112cb8d600161318c565b6112d591906131dc565b604051600081818185875af1925050503d8060008114611311576040519150601f19603f3d011682016040523d82523d6000602084013e611316565b606091505b505080915050806113395760405162461bcd60e51b8152600401610824906131f0565b6001600160a01b03831660646113508d600161318c565b61135a91906131dc565b604051600081818185875af1925050503d8060008114611396576040519150601f19603f3d011682016040523d82523d6000602084013e61139b565b606091505b505080915050806113be5760405162461bcd60e51b8152600401610824906131f0565b6001600160a01b03821660646113d58d601461318c565b6113df91906131dc565b604051600081818185875af1925050503d806000811461141b576040519150601f19603f3d011682016040523d82523d6000602084013e611420565b606091505b505080915050806114435760405162461bcd60e51b8152600401610824906131f0565b50506001600955505050505050505050565b610a7f83838360405180602001604052806000815250611a58565b32331461148f5760405162461bcd60e51b8152600401610824906130c4565b6008546001600160a01b031633146114b95760405162461bcd60e51b815260040161082490613054565b7f00000000000000000000000000000000000000000000000000000000000000006114e360005490565b6114ed9083613148565b111561150b5760405162461bcd60e51b815260040161082490613160565b6115158282611e8f565b5050565b6000805482106115775760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756044820152626e647360e81b6064820152608401610824565b5090565b6008546001600160a01b031633146115a55760405162461bcd60e51b815260040161082490613054565b805161151590600d906020840190612c1e565b6008546001600160a01b031633146115e25760405162461bcd60e51b815260040161082490613054565b805161151590600c906020840190612c1e565b6000611600826124a1565b5192915050565b60006001600160a01b0382166116735760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b6064820152608401610824565b506001600160a01b03166000908152600460205260409020546001600160801b031690565b6008546001600160a01b031633146116c25760405162461bcd60e51b815260040161082490613054565b6116cc600061264b565b565b6008546001600160a01b031633146116f85760405162461bcd60e51b815260040161082490613054565b600a805460ff60a81b198116600160a81b9182900460ff1615909102179055565b60408051808201909152600080825260208201526107f4826124a1565b60606002805461085e90613089565b3233146117645760405162461bcd60e51b8152600401610824906130c4565b600260095414156117875760405162461bcd60e51b8152600401610824906130fb565b600260095580600a7f0000000000000000000000000000000000000000000000000000000000000000826117ba60005490565b6117c49190613148565b11156117e25760405162461bcd60e51b815260040161082490613160565b808211156118285760405162461bcd60e51b8152602060048201526013602482015272125b9d985b1a59081b5a5b9d08185b5bdd5b9d606a1b6044820152606401610824565b808261183333611d8d565b61183d9190613148565b11156118845760405162461bcd60e51b815260206004820152601660248201527543616e206e6f74206d696e742074686973206d616e7960501b6044820152606401610824565b600a54600160a01b900460ff166118dd5760405162461bcd60e51b815260206004820152601860248201527f5075626c69632073616c65206973206e6f74206c6976652e00000000000000006044820152606401610824565b6118e73384611e8f565b6118fb610c94669536c7089100008561318c565b5050600160095550565b6001600160a01b03821633141561195e5760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c65720000000000006044820152606401610824565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600d80546119d790613089565b80601f0160208091040260200160405190810160405280929190818152602001828054611a0390613089565b8015611a505780601f10611a2557610100808354040283529160200191611a50565b820191906000526020600020905b815481529060010190602001808311611a3357829003601f168201915b505050505081565b611a63848484611f2f565b611a6f8484848461269d565b611a8b5760405162461bcd60e51b815260040161082490613227565b50505050565b600080611aa66008546001600160a01b031690565b604080516001600160a01b03928316602082015291881690820152606001604051602081830303815290604052805190602001209050600081604051602001611b1b91907f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c810191909152603c0190565b60408051601f198184030181528282528051602091820120600080855291840180845281905260ff88169284019290925260608301899052608083018890529092509060019060a0016020604051602081039080840390855afa158015611b86573d6000803e3d6000fd5b5050604051601f190151600a549092506001600160a01b038084169116149050611bf25760405162461bcd60e51b815260206004820152601860248201527f5369676e617475726520646f6573206e6f74206d6174636800000000000000006044820152606401610824565b600a546001600160a01b03908116911614925050505b949350505050565b6060611c1d826000541190565b611c5e5760405162461bcd60e51b81526020600482015260126024820152714e6f6e6578697374656e7420746f6b656e2160701b6044820152606401610824565b6040805160008152602081018083528151902091611c7f91600c9101613314565b604051602081830303815290604052805190602001201415611d2d57600d8054611ca890613089565b80601f0160208091040260200160405190810160405280929190818152602001828054611cd490613089565b8015611d215780601f10611cf657610100808354040283529160200191611d21565b820191906000526020600020905b815481529060010190602001808311611d0457829003601f168201915b50505050509050919050565b6000600c8054611d3c90613089565b905011611d5857604051806020016040528060008152506107f4565b600c611d63836127a7565b600b54604051602001611d7893929190613320565b60405160208183030381529060405292915050565b60006107f4826128a5565b6008546001600160a01b03163314611dc25760405162461bcd60e51b815260040161082490613054565b6001600160a01b038116611e275760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610824565b611e308161264b565b50565b60008281526005602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b611515828260405180602001604052806000815250612943565b80341015611ef15760405162461bcd60e51b815260206004820152601560248201527409ccacac840e8de40e6cadcc840dadee4ca40cae8d605b1b6044820152606401610824565b80341115611e3057336108fc611f07833461334b565b6040518115909202916000818181858888f19350505050158015611515573d6000803e3d6000fd5b6000611f3a826124a1565b80519091506000906001600160a01b0316336001600160a01b03161480611f71575033611f66846108e1565b6001600160a01b0316145b80611f8357508151611f83903361073f565b905080611fed5760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b6064820152608401610824565b846001600160a01b031682600001516001600160a01b0316146120615760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b6064820152608401610824565b6001600160a01b0384166120c55760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b6064820152608401610824565b6120d56000848460000151611e33565b6001600160a01b03851660009081526004602052604081208054600192906121079084906001600160801b0316613362565b82546101009290920a6001600160801b038181021990931691831602179091556001600160a01b038616600090815260046020526040812080546001945090926121539185911661338a565b82546001600160801b039182166101009390930a9283029190920219909116179055506040805180820182526001600160a01b03808716825267ffffffffffffffff428116602080850191825260008981526003909152948520935184549151909216600160a01b026001600160e01b031990911691909216171790556121db846001613148565b6000818152600360205260409020549091506001600160a01b031661226d57612205816000541190565b1561226d5760408051808201825284516001600160a01b03908116825260208087015167ffffffffffffffff9081168285019081526000878152600390935294909120925183549451909116600160a01b026001600160e01b03199094169116179190911790555b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b600754816123075760405162461bcd60e51b815260206004820152601860248201527f7175616e74697479206d757374206265206e6f6e7a65726f00000000000000006044820152606401610824565b600060016123158484613148565b61231f919061334b565b905061234c60017f000000000000000000000000000000000000000000000000000000000000000061334b565b8111156123815761237e60017f000000000000000000000000000000000000000000000000000000000000000061334b565b90505b61238c816000541190565b6123e75760405162461bcd60e51b815260206004820152602660248201527f6e6f7420656e6f756768206d696e7465642079657420666f722074686973206360448201526506c65616e75760d41b6064820152608401610824565b815b81811161248d576000818152600360205260409020546001600160a01b031661247b576000612417826124a1565b60408051808201825282516001600160a01b03908116825260209384015167ffffffffffffffff9081168584019081526000888152600390965293909420915182549351909416600160a01b026001600160e01b0319909316931692909217179055505b80612485816131ab565b9150506123e9565b50612499816001613148565b600755505050565b60408051808201909152600080825260208201526124c0826000541190565b61251f5760405162461bcd60e51b815260206004820152602a60248201527f455243373231413a206f776e657220717565727920666f72206e6f6e657869736044820152693a32b73a103a37b5b2b760b11b6064820152608401610824565b60007f00000000000000000000000000000000000000000000000000000000000000008310612580576125727f00000000000000000000000000000000000000000000000000000000000000008461334b565b61257d906001613148565b90505b825b8181106125ea576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff1691830191909152156125d757949350505050565b50806125e2816133b5565b915050612582565b5060405162461bcd60e51b815260206004820152602f60248201527f455243373231413a20756e61626c6520746f2064657465726d696e652074686560448201526e1037bbb732b91037b3103a37b5b2b760891b6064820152608401610824565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006001600160a01b0384163b1561279f57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906126e19033908990889088906004016133cc565b602060405180830381600087803b1580156126fb57600080fd5b505af192505050801561272b575060408051601f3d908101601f1916820190925261272891810190613409565b60015b612785573d808015612759576040519150601f19603f3d011682016040523d82523d6000602084013e61275e565b606091505b50805161277d5760405162461bcd60e51b815260040161082490613227565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611c08565b506001611c08565b6060816127cb5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156127f557806127df816131ab565b91506127ee9050600a836131dc565b91506127cf565b60008167ffffffffffffffff81111561281057612810612e59565b6040519080825280601f01601f19166020018201604052801561283a576020820181803683370190505b5090505b8415611c085761284f60018361334b565b915061285c600a86613426565b612867906030613148565b60f81b81838151811061287c5761287c61343a565b60200101906001600160f81b031916908160001a90535061289e600a866131dc565b945061283e565b60006001600160a01b0382166129175760405162461bcd60e51b815260206004820152603160248201527f455243373231413a206e756d626572206d696e74656420717565727920666f7260448201527020746865207a65726f206164647265737360781b6064820152608401610824565b506001600160a01b0316600090815260046020526040902054600160801b90046001600160801b031690565b6000546001600160a01b0384166129a65760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610824565b6129b1816000541190565b156129fe5760405162461bcd60e51b815260206004820152601d60248201527f455243373231413a20746f6b656e20616c7265616479206d696e7465640000006044820152606401610824565b7f0000000000000000000000000000000000000000000000000000000000000000831115612a795760405162461bcd60e51b815260206004820152602260248201527f455243373231413a207175616e7469747920746f206d696e7420746f6f2068696044820152610ced60f31b6064820152608401610824565b6001600160a01b0384166000908152600460209081526040918290208251808401845290546001600160801b038082168352600160801b9091041691810191909152815180830190925280519091908190612ad590879061338a565b6001600160801b03168152602001858360200151612af3919061338a565b6001600160801b039081169091526001600160a01b0380881660008181526004602090815260408083208751978301518716600160801b0297909616969096179094558451808601865291825267ffffffffffffffff4281168386019081528883526003909552948120915182549451909516600160a01b026001600160e01b031990941694909216939093179190911790915582905b85811015612c135760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4612bd7600088848861269d565b612bf35760405162461bcd60e51b815260040161082490613227565b81612bfd816131ab565b9250508080612c0b906131ab565b915050612b8a565b5060008190556122af565b828054612c2a90613089565b90600052602060002090601f016020900481019282612c4c5760008555612c92565b82601f10612c6557805160ff1916838001178555612c92565b82800160010185558215612c92579182015b82811115612c92578251825591602001919060010190612c77565b506115779291505b808211156115775760008155600101612c9a565b6001600160e01b031981168114611e3057600080fd5b600060208284031215612cd657600080fd5b8135612ce181612cae565b9392505050565b80356001600160a01b0381168114612cff57600080fd5b919050565b600060208284031215612d1657600080fd5b612ce182612ce8565b60005b83811015612d3a578181015183820152602001612d22565b83811115611a8b5750506000910152565b60008151808452612d63816020860160208601612d1f565b601f01601f19169290920160200192915050565b602081526000612ce16020830184612d4b565b600060208284031215612d9c57600080fd5b5035919050565b60008060408385031215612db657600080fd5b612dbf83612ce8565b946020939093013593505050565b803560ff81168114612cff57600080fd5b60008060008060808587031215612df457600080fd5b843593506020850135925060408501359150612e1260608601612dcd565b905092959194509250565b600080600060608486031215612e3257600080fd5b612e3b84612ce8565b9250612e4960208501612ce8565b9150604084013590509250925092565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115612e8a57612e8a612e59565b604051601f8501601f19908116603f01168101908282118183101715612eb257612eb2612e59565b81604052809350858152868686011115612ecb57600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215612ef757600080fd5b813567ffffffffffffffff811115612f0e57600080fd5b8201601f81018413612f1f57600080fd5b611c0884823560208401612e6f565b60008060408385031215612f4157600080fd5b612f4a83612ce8565b915060208301358015158114612f5f57600080fd5b809150509250929050565b60008060008060808587031215612f8057600080fd5b612f8985612ce8565b9350612f9760208601612ce8565b925060408501359150606085013567ffffffffffffffff811115612fba57600080fd5b8501601f81018713612fcb57600080fd5b612fda87823560208401612e6f565b91505092959194509250565b60008060008060808587031215612ffc57600080fd5b61300585612ce8565b93506020850135925060408501359150612e1260608601612dcd565b6000806040838503121561303457600080fd5b61303d83612ce8565b915061304b60208401612ce8565b90509250929050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c9082168061309d57607f821691505b602082108114156130be57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252601a908201527f43616c6c657220697320616e6f7468657220636f6e7472616374000000000000604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6000821982111561315b5761315b613132565b500190565b60208082526012908201527113585e081cdd5c1c1b1e481c995858da195960721b604082015260600190565b60008160001904831182151516156131a6576131a6613132565b500290565b60006000198214156131bf576131bf613132565b5060010190565b634e487b7160e01b600052601260045260246000fd5b6000826131eb576131eb6131c6565b500490565b60208082526018908201527f5472616e73616374696f6e20756e7375636365737366756c0000000000000000604082015260600190565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b8054600090600181811c908083168061329457607f831692505b60208084108214156132b657634e487b7160e01b600052602260045260246000fd5b8180156132ca57600181146132db57613308565b60ff19861689528489019650613308565b60008881526020902060005b868110156133005781548b8201529085019083016132e7565b505084890196505b50505050505092915050565b6000612ce1828461327a565b600061332c828661327a565b845161333c818360208901612d1f565b01928352505060200192915050565b60008282101561335d5761335d613132565b500390565b60006001600160801b038381169083168181101561338257613382613132565b039392505050565b60006001600160801b038083168185168083038211156133ac576133ac613132565b01949350505050565b6000816133c4576133c4613132565b506000190190565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906133ff90830184612d4b565b9695505050505050565b60006020828403121561341b57600080fd5b8151612ce181612cae565b600082613435576134356131c6565b500690565b634e487b7160e01b600052603260045260246000fdfea2646970667358221220deb56047bdc5ec86ea47f224e5fb1b570462e94ddc93c32e30b5e0a49ae5a1a964736f6c63430008090033697066733a2f2f516d564a6637647838683963374650424e31374c6f537a524e4e486a64676e7658715547394b47337938795437462f68696464656e2e6a736f6e

Deployed Bytecode

0x6080604052600436106102515760003560e01c80636352211e11610139578063a22cb465116100b6578063c87b56dd1161007a578063c87b56dd146106b9578063d7224ba0146106d9578063dc33e681146106ef578063dfb1b5451461070f578063e985e9c514610724578063f2fde38b1461076d57600080fd5b8063a22cb46514610623578063a45ba8e714610643578063b88d4fde14610658578063bc8893b414610678578063c1dd27dc1461069957600080fd5b806389b0649b116100fd57806389b0649b1461057a5780638da5cb5b1461058f5780639231ab2a146105ad57806395d89b41146105fb578063a0712d681461061057600080fd5b80636352211e146104f55780636817c76c1461051557806370a0823114610530578063715018a61461055057806383c6d18a1461056557600080fd5b80632f745c59116101d25780634f6ccce7116101965780634f6ccce71461043e578063512507c61461045e57806353135ca01461047e5780635503a0e81461049f57806355f804b3146104b55780635b7633d0146104d557600080fd5b80632f745c59146103ae57806335c6aaf8146103ce5780633ccfd60b146103e957806342842e0e146103fe578063484b973c1461041e57600080fd5b80630c894cfe116102195780630c894cfe146103275780631749dc261461033c57806318160ddd1461034f57806323b872dd1461036e5780632d20fb601461038e57600080fd5b806301ffc9a714610256578063046dc1661461028b57806306fdde03146102ad578063081812fc146102cf578063095ea7b314610307575b600080fd5b34801561026257600080fd5b50610276610271366004612cc4565b61078d565b60405190151581526020015b60405180910390f35b34801561029757600080fd5b506102ab6102a6366004612d04565b6107fa565b005b3480156102b957600080fd5b506102c261084f565b6040516102829190612d77565b3480156102db57600080fd5b506102ef6102ea366004612d8a565b6108e1565b6040516001600160a01b039091168152602001610282565b34801561031357600080fd5b506102ab610322366004612da3565b61096c565b34801561033357600080fd5b506102ab610a84565b6102ab61034a366004612dde565b610acf565b34801561035b57600080fd5b506000545b604051908152602001610282565b34801561037a57600080fd5b506102ab610389366004612e1d565b610ca9565b34801561039a57600080fd5b506102ab6103a9366004612d8a565b610cb4565b3480156103ba57600080fd5b506103606103c9366004612da3565b610d17565b3480156103da57600080fd5b50610360663c0a75e0b4400081565b3480156103f557600080fd5b506102ab610e85565b34801561040a57600080fd5b506102ab610419366004612e1d565b611455565b34801561042a57600080fd5b506102ab610439366004612da3565b611470565b34801561044a57600080fd5b50610360610459366004612d8a565b611519565b34801561046a57600080fd5b506102ab610479366004612ee5565b61157b565b34801561048a57600080fd5b50600a5461027690600160a81b900460ff1681565b3480156104ab57600080fd5b50610360600b5481565b3480156104c157600080fd5b506102ab6104d0366004612ee5565b6115b8565b3480156104e157600080fd5b50600a546102ef906001600160a01b031681565b34801561050157600080fd5b506102ef610510366004612d8a565b6115f5565b34801561052157600080fd5b50610360669536c70891000081565b34801561053c57600080fd5b5061036061054b366004612d04565b611607565b34801561055c57600080fd5b506102ab611698565b34801561057157600080fd5b50610360600581565b34801561058657600080fd5b506102ab6116ce565b34801561059b57600080fd5b506008546001600160a01b03166102ef565b3480156105b957600080fd5b506105cd6105c8366004612d8a565b611719565b6040805182516001600160a01b0316815260209283015167ffffffffffffffff169281019290925201610282565b34801561060757600080fd5b506102c2611736565b6102ab61061e366004612d8a565b611745565b34801561062f57600080fd5b506102ab61063e366004612f2e565b611905565b34801561064f57600080fd5b506102c26119ca565b34801561066457600080fd5b506102ab610673366004612f6a565b611a58565b34801561068457600080fd5b50600a5461027690600160a01b900460ff1681565b3480156106a557600080fd5b506102766106b4366004612fe6565b611a91565b3480156106c557600080fd5b506102c26106d4366004612d8a565b611c10565b3480156106e557600080fd5b5061036060075481565b3480156106fb57600080fd5b5061036061070a366004612d04565b611d8d565b34801561071b57600080fd5b50610360600a81565b34801561073057600080fd5b5061027661073f366004613021565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b34801561077957600080fd5b506102ab610788366004612d04565b611d98565b60006001600160e01b031982166380ac58cd60e01b14806107be57506001600160e01b03198216635b5e139f60e01b145b806107d957506001600160e01b0319821663780e9d6360e01b145b806107f457506301ffc9a760e01b6001600160e01b03198316145b92915050565b6008546001600160a01b0316331461082d5760405162461bcd60e51b815260040161082490613054565b60405180910390fd5b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b60606001805461085e90613089565b80601f016020809104026020016040519081016040528092919081815260200182805461088a90613089565b80156108d75780601f106108ac576101008083540402835291602001916108d7565b820191906000526020600020905b8154815290600101906020018083116108ba57829003601f168201915b5050505050905090565b60006108ee826000541190565b6109505760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b6064820152608401610824565b506000908152600560205260409020546001600160a01b031690565b6000610977826115f5565b9050806001600160a01b0316836001600160a01b031614156109e65760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b6064820152608401610824565b336001600160a01b0382161480610a025750610a02813361073f565b610a745760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c000000000000006064820152608401610824565b610a7f838383611e33565b505050565b6008546001600160a01b03163314610aae5760405162461bcd60e51b815260040161082490613054565b600a805460ff60a01b198116600160a01b9182900460ff1615909102179055565b323314610aee5760405162461bcd60e51b8152600401610824906130c4565b828282610afd33848484611a91565b610b0657600080fd5b60026009541415610b295760405162461bcd60e51b8152600401610824906130fb565b60026009558660057f0000000000000000000000000000000000000000000000000000000000001b3982610b5c60005490565b610b669190613148565b1115610b845760405162461bcd60e51b815260040161082490613160565b80821115610bca5760405162461bcd60e51b8152602060048201526013602482015272125b9d985b1a59081b5a5b9d08185b5bdd5b9d606a1b6044820152606401610824565b8082610bd533611d8d565b610bdf9190613148565b1115610c265760405162461bcd60e51b815260206004820152601660248201527543616e206e6f74206d696e742074686973206d616e7960501b6044820152606401610824565b600a54600160a81b900460ff16610c765760405162461bcd60e51b8152602060048201526014602482015273283932b9b0b6329034b9903737ba103634bb329760611b6044820152606401610824565b610c80338a611e8f565b610c99610c94663c0a75e0b440008b61318c565b611ea9565b5050600160095550505050505050565b610a7f838383611f2f565b6008546001600160a01b03163314610cde5760405162461bcd60e51b815260040161082490613054565b60026009541415610d015760405162461bcd60e51b8152600401610824906130fb565b6002600955610d0f816122b7565b506001600955565b6000610d2283611607565b8210610d7b5760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604482015261647360f01b6064820152608401610824565b600080549080805b83811015610e25576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915215610dd657805192505b876001600160a01b0316836001600160a01b03161415610e125786841415610e04575093506107f492505050565b83610e0e816131ab565b9450505b5080610e1d816131ab565b915050610d83565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201526d0deeedccae440c4f240d2dcc8caf60931b6064820152608401610824565b6008546001600160a01b03163314610eaf5760405162461bcd60e51b815260040161082490613054565b60026009541415610ed25760405162461bcd60e51b8152600401610824906130fb565b60026009554773dc2719e36b1028ad840b21cd08d4f395c09a701573987f613dd3460bdced24eeebfe13de9bf9d8d2b873dd730aa1583396214aa2d92cfa92880b9d93e20173141ca54db6f8277917e0554b30f2b3270f65eb67734bd3bb6b1d03c8844476e525ff291627fbc3c0ea7366c17dcef1b364014573ae0f869ad1c05fe01c897364e293dd4bba0756895cdb8fe3a2f8e2f4ad407173ecf02b27e4f6ff7e3c609652de4b37f65a74d86b73a868ce0b203031b2e72330e8512c8729770c0759600089612710610fa78d61062761318c565b610fb191906131dc565b604051600081818185875af1925050503d8060008114610fed576040519150601f19603f3d011682016040523d82523d6000602084013e610ff2565b606091505b505080915050806110155760405162461bcd60e51b8152600401610824906131f0565b6001600160a01b03891661271061102e8d61062761318c565b61103891906131dc565b604051600081818185875af1925050503d8060008114611074576040519150601f19603f3d011682016040523d82523d6000602084013e611079565b606091505b5050809150508061109c5760405162461bcd60e51b8152600401610824906131f0565b6001600160a01b0388166127106110b58d61062761318c565b6110bf91906131dc565b604051600081818185875af1925050503d80600081146110fb576040519150601f19603f3d011682016040523d82523d6000602084013e611100565b606091505b505080915050806111235760405162461bcd60e51b8152600401610824906131f0565b6001600160a01b03871661271061113c8d61062761318c565b61114691906131dc565b604051600081818185875af1925050503d8060008114611182576040519150601f19603f3d011682016040523d82523d6000602084013e611187565b606091505b505080915050806111aa5760405162461bcd60e51b8152600401610824906131f0565b6001600160a01b03861660646111c18d600361318c565b6111cb91906131dc565b604051600081818185875af1925050503d8060008114611207576040519150601f19603f3d011682016040523d82523d6000602084013e61120c565b606091505b5050809150508061122f5760405162461bcd60e51b8152600401610824906131f0565b6001600160a01b03851660646112468d600c61318c565b61125091906131dc565b604051600081818185875af1925050503d806000811461128c576040519150601f19603f3d011682016040523d82523d6000602084013e611291565b606091505b505080915050806112b45760405162461bcd60e51b8152600401610824906131f0565b6001600160a01b03841660646112cb8d600161318c565b6112d591906131dc565b604051600081818185875af1925050503d8060008114611311576040519150601f19603f3d011682016040523d82523d6000602084013e611316565b606091505b505080915050806113395760405162461bcd60e51b8152600401610824906131f0565b6001600160a01b03831660646113508d600161318c565b61135a91906131dc565b604051600081818185875af1925050503d8060008114611396576040519150601f19603f3d011682016040523d82523d6000602084013e61139b565b606091505b505080915050806113be5760405162461bcd60e51b8152600401610824906131f0565b6001600160a01b03821660646113d58d601461318c565b6113df91906131dc565b604051600081818185875af1925050503d806000811461141b576040519150601f19603f3d011682016040523d82523d6000602084013e611420565b606091505b505080915050806114435760405162461bcd60e51b8152600401610824906131f0565b50506001600955505050505050505050565b610a7f83838360405180602001604052806000815250611a58565b32331461148f5760405162461bcd60e51b8152600401610824906130c4565b6008546001600160a01b031633146114b95760405162461bcd60e51b815260040161082490613054565b7f0000000000000000000000000000000000000000000000000000000000001b396114e360005490565b6114ed9083613148565b111561150b5760405162461bcd60e51b815260040161082490613160565b6115158282611e8f565b5050565b6000805482106115775760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756044820152626e647360e81b6064820152608401610824565b5090565b6008546001600160a01b031633146115a55760405162461bcd60e51b815260040161082490613054565b805161151590600d906020840190612c1e565b6008546001600160a01b031633146115e25760405162461bcd60e51b815260040161082490613054565b805161151590600c906020840190612c1e565b6000611600826124a1565b5192915050565b60006001600160a01b0382166116735760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b6064820152608401610824565b506001600160a01b03166000908152600460205260409020546001600160801b031690565b6008546001600160a01b031633146116c25760405162461bcd60e51b815260040161082490613054565b6116cc600061264b565b565b6008546001600160a01b031633146116f85760405162461bcd60e51b815260040161082490613054565b600a805460ff60a81b198116600160a81b9182900460ff1615909102179055565b60408051808201909152600080825260208201526107f4826124a1565b60606002805461085e90613089565b3233146117645760405162461bcd60e51b8152600401610824906130c4565b600260095414156117875760405162461bcd60e51b8152600401610824906130fb565b600260095580600a7f0000000000000000000000000000000000000000000000000000000000001b39826117ba60005490565b6117c49190613148565b11156117e25760405162461bcd60e51b815260040161082490613160565b808211156118285760405162461bcd60e51b8152602060048201526013602482015272125b9d985b1a59081b5a5b9d08185b5bdd5b9d606a1b6044820152606401610824565b808261183333611d8d565b61183d9190613148565b11156118845760405162461bcd60e51b815260206004820152601660248201527543616e206e6f74206d696e742074686973206d616e7960501b6044820152606401610824565b600a54600160a01b900460ff166118dd5760405162461bcd60e51b815260206004820152601860248201527f5075626c69632073616c65206973206e6f74206c6976652e00000000000000006044820152606401610824565b6118e73384611e8f565b6118fb610c94669536c7089100008561318c565b5050600160095550565b6001600160a01b03821633141561195e5760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c65720000000000006044820152606401610824565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600d80546119d790613089565b80601f0160208091040260200160405190810160405280929190818152602001828054611a0390613089565b8015611a505780601f10611a2557610100808354040283529160200191611a50565b820191906000526020600020905b815481529060010190602001808311611a3357829003601f168201915b505050505081565b611a63848484611f2f565b611a6f8484848461269d565b611a8b5760405162461bcd60e51b815260040161082490613227565b50505050565b600080611aa66008546001600160a01b031690565b604080516001600160a01b03928316602082015291881690820152606001604051602081830303815290604052805190602001209050600081604051602001611b1b91907f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c810191909152603c0190565b60408051601f198184030181528282528051602091820120600080855291840180845281905260ff88169284019290925260608301899052608083018890529092509060019060a0016020604051602081039080840390855afa158015611b86573d6000803e3d6000fd5b5050604051601f190151600a549092506001600160a01b038084169116149050611bf25760405162461bcd60e51b815260206004820152601860248201527f5369676e617475726520646f6573206e6f74206d6174636800000000000000006044820152606401610824565b600a546001600160a01b03908116911614925050505b949350505050565b6060611c1d826000541190565b611c5e5760405162461bcd60e51b81526020600482015260126024820152714e6f6e6578697374656e7420746f6b656e2160701b6044820152606401610824565b6040805160008152602081018083528151902091611c7f91600c9101613314565b604051602081830303815290604052805190602001201415611d2d57600d8054611ca890613089565b80601f0160208091040260200160405190810160405280929190818152602001828054611cd490613089565b8015611d215780601f10611cf657610100808354040283529160200191611d21565b820191906000526020600020905b815481529060010190602001808311611d0457829003601f168201915b50505050509050919050565b6000600c8054611d3c90613089565b905011611d5857604051806020016040528060008152506107f4565b600c611d63836127a7565b600b54604051602001611d7893929190613320565b60405160208183030381529060405292915050565b60006107f4826128a5565b6008546001600160a01b03163314611dc25760405162461bcd60e51b815260040161082490613054565b6001600160a01b038116611e275760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610824565b611e308161264b565b50565b60008281526005602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b611515828260405180602001604052806000815250612943565b80341015611ef15760405162461bcd60e51b815260206004820152601560248201527409ccacac840e8de40e6cadcc840dadee4ca40cae8d605b1b6044820152606401610824565b80341115611e3057336108fc611f07833461334b565b6040518115909202916000818181858888f19350505050158015611515573d6000803e3d6000fd5b6000611f3a826124a1565b80519091506000906001600160a01b0316336001600160a01b03161480611f71575033611f66846108e1565b6001600160a01b0316145b80611f8357508151611f83903361073f565b905080611fed5760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b6064820152608401610824565b846001600160a01b031682600001516001600160a01b0316146120615760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b6064820152608401610824565b6001600160a01b0384166120c55760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b6064820152608401610824565b6120d56000848460000151611e33565b6001600160a01b03851660009081526004602052604081208054600192906121079084906001600160801b0316613362565b82546101009290920a6001600160801b038181021990931691831602179091556001600160a01b038616600090815260046020526040812080546001945090926121539185911661338a565b82546001600160801b039182166101009390930a9283029190920219909116179055506040805180820182526001600160a01b03808716825267ffffffffffffffff428116602080850191825260008981526003909152948520935184549151909216600160a01b026001600160e01b031990911691909216171790556121db846001613148565b6000818152600360205260409020549091506001600160a01b031661226d57612205816000541190565b1561226d5760408051808201825284516001600160a01b03908116825260208087015167ffffffffffffffff9081168285019081526000878152600390935294909120925183549451909116600160a01b026001600160e01b03199094169116179190911790555b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b600754816123075760405162461bcd60e51b815260206004820152601860248201527f7175616e74697479206d757374206265206e6f6e7a65726f00000000000000006044820152606401610824565b600060016123158484613148565b61231f919061334b565b905061234c60017f0000000000000000000000000000000000000000000000000000000000001b3961334b565b8111156123815761237e60017f0000000000000000000000000000000000000000000000000000000000001b3961334b565b90505b61238c816000541190565b6123e75760405162461bcd60e51b815260206004820152602660248201527f6e6f7420656e6f756768206d696e7465642079657420666f722074686973206360448201526506c65616e75760d41b6064820152608401610824565b815b81811161248d576000818152600360205260409020546001600160a01b031661247b576000612417826124a1565b60408051808201825282516001600160a01b03908116825260209384015167ffffffffffffffff9081168584019081526000888152600390965293909420915182549351909416600160a01b026001600160e01b0319909316931692909217179055505b80612485816131ab565b9150506123e9565b50612499816001613148565b600755505050565b60408051808201909152600080825260208201526124c0826000541190565b61251f5760405162461bcd60e51b815260206004820152602a60248201527f455243373231413a206f776e657220717565727920666f72206e6f6e657869736044820152693a32b73a103a37b5b2b760b11b6064820152608401610824565b60007f000000000000000000000000000000000000000000000000000000000000000a8310612580576125727f000000000000000000000000000000000000000000000000000000000000000a8461334b565b61257d906001613148565b90505b825b8181106125ea576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff1691830191909152156125d757949350505050565b50806125e2816133b5565b915050612582565b5060405162461bcd60e51b815260206004820152602f60248201527f455243373231413a20756e61626c6520746f2064657465726d696e652074686560448201526e1037bbb732b91037b3103a37b5b2b760891b6064820152608401610824565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006001600160a01b0384163b1561279f57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906126e19033908990889088906004016133cc565b602060405180830381600087803b1580156126fb57600080fd5b505af192505050801561272b575060408051601f3d908101601f1916820190925261272891810190613409565b60015b612785573d808015612759576040519150601f19603f3d011682016040523d82523d6000602084013e61275e565b606091505b50805161277d5760405162461bcd60e51b815260040161082490613227565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611c08565b506001611c08565b6060816127cb5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156127f557806127df816131ab565b91506127ee9050600a836131dc565b91506127cf565b60008167ffffffffffffffff81111561281057612810612e59565b6040519080825280601f01601f19166020018201604052801561283a576020820181803683370190505b5090505b8415611c085761284f60018361334b565b915061285c600a86613426565b612867906030613148565b60f81b81838151811061287c5761287c61343a565b60200101906001600160f81b031916908160001a90535061289e600a866131dc565b945061283e565b60006001600160a01b0382166129175760405162461bcd60e51b815260206004820152603160248201527f455243373231413a206e756d626572206d696e74656420717565727920666f7260448201527020746865207a65726f206164647265737360781b6064820152608401610824565b506001600160a01b0316600090815260046020526040902054600160801b90046001600160801b031690565b6000546001600160a01b0384166129a65760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610824565b6129b1816000541190565b156129fe5760405162461bcd60e51b815260206004820152601d60248201527f455243373231413a20746f6b656e20616c7265616479206d696e7465640000006044820152606401610824565b7f000000000000000000000000000000000000000000000000000000000000000a831115612a795760405162461bcd60e51b815260206004820152602260248201527f455243373231413a207175616e7469747920746f206d696e7420746f6f2068696044820152610ced60f31b6064820152608401610824565b6001600160a01b0384166000908152600460209081526040918290208251808401845290546001600160801b038082168352600160801b9091041691810191909152815180830190925280519091908190612ad590879061338a565b6001600160801b03168152602001858360200151612af3919061338a565b6001600160801b039081169091526001600160a01b0380881660008181526004602090815260408083208751978301518716600160801b0297909616969096179094558451808601865291825267ffffffffffffffff4281168386019081528883526003909552948120915182549451909516600160a01b026001600160e01b031990941694909216939093179190911790915582905b85811015612c135760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4612bd7600088848861269d565b612bf35760405162461bcd60e51b815260040161082490613227565b81612bfd816131ab565b9250508080612c0b906131ab565b915050612b8a565b5060008190556122af565b828054612c2a90613089565b90600052602060002090601f016020900481019282612c4c5760008555612c92565b82601f10612c6557805160ff1916838001178555612c92565b82800160010185558215612c92579182015b82811115612c92578251825591602001919060010190612c77565b506115779291505b808211156115775760008155600101612c9a565b6001600160e01b031981168114611e3057600080fd5b600060208284031215612cd657600080fd5b8135612ce181612cae565b9392505050565b80356001600160a01b0381168114612cff57600080fd5b919050565b600060208284031215612d1657600080fd5b612ce182612ce8565b60005b83811015612d3a578181015183820152602001612d22565b83811115611a8b5750506000910152565b60008151808452612d63816020860160208601612d1f565b601f01601f19169290920160200192915050565b602081526000612ce16020830184612d4b565b600060208284031215612d9c57600080fd5b5035919050565b60008060408385031215612db657600080fd5b612dbf83612ce8565b946020939093013593505050565b803560ff81168114612cff57600080fd5b60008060008060808587031215612df457600080fd5b843593506020850135925060408501359150612e1260608601612dcd565b905092959194509250565b600080600060608486031215612e3257600080fd5b612e3b84612ce8565b9250612e4960208501612ce8565b9150604084013590509250925092565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115612e8a57612e8a612e59565b604051601f8501601f19908116603f01168101908282118183101715612eb257612eb2612e59565b81604052809350858152868686011115612ecb57600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215612ef757600080fd5b813567ffffffffffffffff811115612f0e57600080fd5b8201601f81018413612f1f57600080fd5b611c0884823560208401612e6f565b60008060408385031215612f4157600080fd5b612f4a83612ce8565b915060208301358015158114612f5f57600080fd5b809150509250929050565b60008060008060808587031215612f8057600080fd5b612f8985612ce8565b9350612f9760208601612ce8565b925060408501359150606085013567ffffffffffffffff811115612fba57600080fd5b8501601f81018713612fcb57600080fd5b612fda87823560208401612e6f565b91505092959194509250565b60008060008060808587031215612ffc57600080fd5b61300585612ce8565b93506020850135925060408501359150612e1260608601612dcd565b6000806040838503121561303457600080fd5b61303d83612ce8565b915061304b60208401612ce8565b90509250929050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c9082168061309d57607f821691505b602082108114156130be57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252601a908201527f43616c6c657220697320616e6f7468657220636f6e7472616374000000000000604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6000821982111561315b5761315b613132565b500190565b60208082526012908201527113585e081cdd5c1c1b1e481c995858da195960721b604082015260600190565b60008160001904831182151516156131a6576131a6613132565b500290565b60006000198214156131bf576131bf613132565b5060010190565b634e487b7160e01b600052601260045260246000fd5b6000826131eb576131eb6131c6565b500490565b60208082526018908201527f5472616e73616374696f6e20756e7375636365737366756c0000000000000000604082015260600190565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b8054600090600181811c908083168061329457607f831692505b60208084108214156132b657634e487b7160e01b600052602260045260246000fd5b8180156132ca57600181146132db57613308565b60ff19861689528489019650613308565b60008881526020902060005b868110156133005781548b8201529085019083016132e7565b505084890196505b50505050505092915050565b6000612ce1828461327a565b600061332c828661327a565b845161333c818360208901612d1f565b01928352505060200192915050565b60008282101561335d5761335d613132565b500390565b60006001600160801b038381169083168181101561338257613382613132565b039392505050565b60006001600160801b038083168185168083038211156133ac576133ac613132565b01949350505050565b6000816133c4576133c4613132565b506000190190565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906133ff90830184612d4b565b9695505050505050565b60006020828403121561341b57600080fd5b8151612ce181612cae565b600082613435576134356131c6565b500690565b634e487b7160e01b600052603260045260246000fdfea2646970667358221220deb56047bdc5ec86ea47f224e5fb1b570462e94ddc93c32e30b5e0a49ae5a1a964736f6c63430008090033

Deployed Bytecode Sourcemap

45813:7865:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29848:422;;;;;;;;;;-1:-1:-1;29848:422:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;29848:422:0;;;;;;;;44704:110;;;;;;;;;;-1:-1:-1;44704:110:0;;;;;:::i;:::-;;:::i;:::-;;31809:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;33504:292::-;;;;;;;;;;-1:-1:-1;33504:292:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2061:32:1;;;2043:51;;2031:2;2016:18;33504:292:0;1897:203:1;33025:413:0;;;;;;;;;;-1:-1:-1;33025:413:0;;;;;:::i;:::-;;:::i;53297:106::-;;;;;;;;;;;;;:::i;48003:468::-;;;;;;:::i;:::-;;:::i;28204:100::-;;;;;;;;;;-1:-1:-1;28257:7:0;28284:12;28204:100;;;3063:25:1;;;3051:2;3036:18;28204:100:0;2917:177:1;34531:162:0;;;;;;;;;;-1:-1:-1;34531:162:0;;;;;:::i;:::-;;:::i;53517:156::-;;;;;;;;;;-1:-1:-1;53517:156:0;;;;;:::i;:::-;;:::i;28912:864::-;;;;;;;;;;-1:-1:-1;28912:864:0;;;;;:::i;:::-;;:::i;46138:57::-;;;;;;;;;;;;46183:12;46138:57;;50318:2022;;;;;;;;;;;;;:::i;34764:177::-;;;;;;;;;;-1:-1:-1;34764:177:0;;;;;:::i;:::-;;:::i;52448:205::-;;;;;;;;;;-1:-1:-1;52448:205:0;;;;;:::i;:::-;;:::i;28381:228::-;;;;;;;;;;-1:-1:-1;28381:228:0;;;;;:::i;:::-;;:::i;53046:138::-;;;;;;;;;;-1:-1:-1;53046:138:0;;;;;:::i;:::-;;:::i;46245:33::-;;;;;;;;;;-1:-1:-1;46245:33:0;;;;-1:-1:-1;;;46245:33:0;;;;;;46313:34;;;;;;;;;;;;;;;;52839:102;;;;;;;;;;-1:-1:-1;52839:102:0;;;;;:::i;:::-;;:::i;44259:28::-;;;;;;;;;;-1:-1:-1;44259:28:0;;;;-1:-1:-1;;;;;44259:28:0;;;31618:124;;;;;;;;;;-1:-1:-1;31618:124:0;;;;;:::i;:::-;;:::i;46084:47::-;;;;;;;;;;;;46120:11;46084:47;;30334:258;;;;;;;;;;-1:-1:-1;30334:258:0;;;;;:::i;:::-;;:::i;2561:94::-;;;;;;;;;;;;;:::i;46025:52::-;;;;;;;;;;;;46076:1;46025:52;;53192:97;;;;;;;;;;;;;:::i;1910:87::-;;;;;;;;;;-1:-1:-1;1983:6:0;;-1:-1:-1;;;;;1983:6:0;1910:87;;48978:167;;;;;;;;;;-1:-1:-1;48978:167:0;;;;;:::i;:::-;;:::i;:::-;;;;5069:13:1;;-1:-1:-1;;;;;5065:39:1;5047:58;;5165:4;5153:17;;;5147:24;5173:18;5143:49;5121:20;;;5114:79;;;;5020:18;48978:167:0;4839:360:1;31978:104:0;;;;;;;;;;;;;:::i;47588:373::-;;;;;;:::i;:::-;;:::i;33868:311::-;;;;;;;;;;-1:-1:-1;33868:311:0;;;;;:::i;:::-;;:::i;46394:101::-;;;;;;;;;;;;;:::i;35012:355::-;;;;;;;;;;-1:-1:-1;35012:355:0;;;;;:::i;:::-;;:::i;46202:36::-;;;;;;;;;;-1:-1:-1;46202:36:0;;;;-1:-1:-1;;;46202:36:0;;;;;;45234:505;;;;;;;;;;-1:-1:-1;45234:505:0;;;;;:::i;:::-;;:::i;49640:569::-;;;;;;;;;;-1:-1:-1;49640:569:0;;;;;:::i;:::-;;:::i;39893:43::-;;;;;;;;;;;;;;;;48794:113;;;;;;;;;;-1:-1:-1;48794:113:0;;;;;:::i;:::-;;:::i;45966:52::-;;;;;;;;;;;;46016:2;45966:52;;34250:214;;;;;;;;;;-1:-1:-1;34250:214:0;;;;;:::i;:::-;-1:-1:-1;;;;;34421:25:0;;;34392:4;34421:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;34250:214;2810:229;;;;;;;;;;-1:-1:-1;2810:229:0;;;;;:::i;:::-;;:::i;29848:422::-;29995:4;-1:-1:-1;;;;;;30037:40:0;;-1:-1:-1;;;30037:40:0;;:105;;-1:-1:-1;;;;;;;30094:48:0;;-1:-1:-1;;;30094:48:0;30037:105;:172;;;-1:-1:-1;;;;;;;30159:50:0;;-1:-1:-1;;;30159:50:0;30037:172;:225;;;-1:-1:-1;;;;;;;;;;25687:40:0;;;30226:36;30017:245;29848:422;-1:-1:-1;;29848:422:0:o;44704:110::-;1983:6;;-1:-1:-1;;;;;1983:6:0;778:10;2130:23;2122:68;;;;-1:-1:-1;;;2122:68:0;;;;;;;:::i;:::-;;;;;;;;;44780:13:::1;:26:::0;;-1:-1:-1;;;;;;44780:26:0::1;-1:-1:-1::0;;;;;44780:26:0;;;::::1;::::0;;;::::1;::::0;;44704:110::o;31809:100::-;31863:13;31896:5;31889:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31809:100;:::o;33504:292::-;33608:7;33655:16;33663:7;35679:4;35713:12;-1:-1:-1;35703:22:0;35622:111;33655:16;33633:111;;;;-1:-1:-1;;;33633:111:0;;7839:2:1;33633:111:0;;;7821:21:1;7878:2;7858:18;;;7851:30;7917:34;7897:18;;;7890:62;-1:-1:-1;;;7968:18:1;;;7961:43;8021:19;;33633:111:0;7637:409:1;33633:111:0;-1:-1:-1;33764:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;33764:24:0;;33504:292::o;33025:413::-;33098:13;33114:24;33130:7;33114:15;:24::i;:::-;33098:40;;33163:5;-1:-1:-1;;;;;33157:11:0;:2;-1:-1:-1;;;;;33157:11:0;;;33149:58;;;;-1:-1:-1;;;33149:58:0;;8253:2:1;33149:58:0;;;8235:21:1;8292:2;8272:18;;;8265:30;8331:34;8311:18;;;8304:62;-1:-1:-1;;;8382:18:1;;;8375:32;8424:19;;33149:58:0;8051:398:1;33149:58:0;778:10;-1:-1:-1;;;;;33242:21:0;;;;:62;;-1:-1:-1;33267:37:0;33284:5;778:10;34250:214;:::i;33267:37::-;33220:169;;;;-1:-1:-1;;;33220:169:0;;8656:2:1;33220:169:0;;;8638:21:1;8695:2;8675:18;;;8668:30;8734:34;8714:18;;;8707:62;8805:27;8785:18;;;8778:55;8850:19;;33220:169:0;8454:421:1;33220:169:0;33402:28;33411:2;33415:7;33424:5;33402:8;:28::i;:::-;33087:351;33025:413;;:::o;53297:106::-;1983:6;;-1:-1:-1;;;;;1983:6:0;778:10;2130:23;2122:68;;;;-1:-1:-1;;;2122:68:0;;;;;;;:::i;:::-;53379:16:::1;::::0;;-1:-1:-1;;;;53359:36:0;::::1;-1:-1:-1::0;;;53379:16:0;;;::::1;;;53378:17;53359:36:::0;;::::1;;::::0;;53297:106::o;48003:468::-;46859:9;46872:10;46859:23;46851:62;;;;-1:-1:-1;;;46851:62:0;;;;;;;:::i;:::-;48158:2:::1;48162;48166;44631:44;44652:10;44664:2;44668;44672;44631:20;:44::i;:::-;44623: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;48234:8;46076:1:::3;47301:14;48234:8:::0;47272:13:::3;28257:7:::0;28284:12;;28204:100;47272:13:::3;:25;;;;:::i;:::-;:43;;47264:74;;;;-1:-1:-1::0;;;47264:74:0::3;;;;;;;:::i;:::-;47388:14;47375:9;:27;;47349:77;;;::::0;-1:-1:-1;;;47349:77:0;;10409:2:1;47349:77:0::3;::::0;::::3;10391:21:1::0;10448:2;10428:18;;;10421:30;-1:-1:-1;;;10467:18:1;;;10460:49;10526:18;;47349:77:0::3;10207:343:1::0;47349:77:0::3;47486:14;47473:9;47446:24;47459:10;47446:12;:24::i;:::-;:36;;;;:::i;:::-;:54;;47438:89;;;::::0;-1:-1:-1;;;47438:89:0;;10757:2:1;47438:89:0::3;::::0;::::3;10739:21:1::0;10796:2;10776:18;;;10769:30;-1:-1:-1;;;10815:18:1;;;10808:52;10877:18;;47438:89:0::3;10555:346:1::0;47438:89:0::3;48329:13:::4;::::0;-1:-1:-1;;;48329:13:0;::::4;;;48321:46;;;::::0;-1:-1:-1;;;48321:46:0;;11108:2:1;48321:46:0::4;::::0;::::4;11090:21:1::0;11147:2;11127:18;;;11120:30;-1:-1:-1;;;11166:18:1;;;11159:50;11226:18;;48321:46:0::4;10906:344:1::0;48321:46:0::4;48378:31;48388:10;48400:8;48378:9;:31::i;:::-;48420:43;48433:29;46183:12;48433:8:::0;:29:::4;:::i;:::-;48420:12;:43::i;:::-;-1:-1:-1::0;;4905:1:0::2;5855:7;:22:::0;-1:-1:-1;;;;;;;48003:468:0:o;34531:162::-;34657:28;34667:4;34673:2;34677:7;34657:9;:28::i;53517: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;53637:28:::2;53656:8:::0;53637:18:::2;:28::i;:::-;-1:-1:-1::0;4905:1:0::1;5855:7;:22:::0;53517:156::o;28912:864::-;29037:7;29078:16;29088:5;29078:9;:16::i;:::-;29070:5;:24;29062:71;;;;-1:-1:-1;;;29062:71:0;;11630:2:1;29062:71:0;;;11612:21:1;11669:2;11649:18;;;11642:30;11708:34;11688:18;;;11681:62;-1:-1:-1;;;11759:18:1;;;11752:32;11801:19;;29062:71:0;11428:398:1;29062:71:0;29144:22;28284:12;;;29144:22;;29276:426;29300:14;29296:1;:18;29276:426;;;29336:31;29370:14;;;:11;:14;;;;;;;;;29336:48;;;;;;;;;-1:-1:-1;;;;;29336:48:0;;;;;-1:-1:-1;;;29336:48:0;;;;;;;;;;;;29403:28;29399:103;;29472:14;;;-1:-1:-1;29399:103:0;29541:5;-1:-1:-1;;;;;29520:26:0;:17;-1:-1:-1;;;;;29520:26:0;;29516:175;;;29586:5;29571:11;:20;29567:77;;;-1:-1:-1;29623:1:0;-1:-1:-1;29616:8:0;;-1:-1:-1;;;29616:8:0;29567:77;29662:13;;;;:::i;:::-;;;;29516:175;-1:-1:-1;29316:3:0;;;;:::i;:::-;;;;29276:426;;;-1:-1:-1;29712:56:0;;-1:-1:-1;;;29712:56:0;;12173:2:1;29712:56:0;;;12155:21:1;12212:2;12192:18;;;12185:30;12251:34;12231:18;;;12224:62;-1:-1:-1;;;12302:18:1;;;12295:44;12356:19;;29712:56:0;11971:410:1;50318:2022:0;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;50402:21:::2;50459:42;50538;50619;50699;50778;50856;50934;51012;51095;50381:18;50459:42:::0;51229:5:::2;51208:17;50402:21:::0;51221:4:::2;51208:17;:::i;:::-;51207:27;;;;:::i;:::-;51189:51;::::0;::::2;::::0;;;;;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51175:65;;;;;51259:7;51251:44;;;;-1:-1:-1::0;;;51251:44:0::2;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;51320:10:0;::::2;51361:5;51340:17;:10:::0;51353:4:::2;51340:17;:::i;:::-;51339:27;;;;:::i;:::-;51320:52;::::0;::::2;::::0;;;;;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51306:66;;;;;51391:7;51383:44;;;;-1:-1:-1::0;;;51383:44:0::2;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;51452:12:0;::::2;51495:5;51474:17;:10:::0;51487:4:::2;51474:17;:::i;:::-;51473:27;;;;:::i;:::-;51452:54;::::0;::::2;::::0;;;;;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51438:68;;;;;51525:7;51517:44;;;;-1:-1:-1::0;;;51517:44:0::2;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;51586:11:0;::::2;51628:5;51607:17;:10:::0;51620:4:::2;51607:17;:::i;:::-;51606:27;;;;:::i;:::-;51586:53;::::0;::::2;::::0;;;;;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51572:67;;;;;51658:7;51650:44;;;;-1:-1:-1::0;;;51650:44:0::2;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;51719:10:0;::::2;51757:3;51739:14;:10:::0;51752:1:::2;51739:14;:::i;:::-;51738:22;;;;:::i;:::-;51719:47;::::0;::::2;::::0;;;;;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51705:61;;;;;51785:7;51777:44;;;;-1:-1:-1::0;;;51777:44:0::2;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;51846:9:0;::::2;51884:3;51865:15;:10:::0;51878:2:::2;51865:15;:::i;:::-;51864:23;;;;:::i;:::-;51846:47;::::0;::::2;::::0;;;;;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51832:61;;;;;51912:7;51904:44;;;;-1:-1:-1::0;;;51904:44:0::2;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;51973:9:0;::::2;52010:3;51992:14;:10:::0;52005:1:::2;51992:14;:::i;:::-;51991:22;;;;:::i;:::-;51973:46;::::0;::::2;::::0;;;;;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51959:60;;;;;52038:7;52030:44;;;;-1:-1:-1::0;;;52030:44:0::2;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;52099:9:0;::::2;52136:3;52118:14;:10:::0;52131:1:::2;52118:14;:::i;:::-;52117:22;;;;:::i;:::-;52099:46;::::0;::::2;::::0;;;;;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52085:60;;;;;52164:7;52156:44;;;;-1:-1:-1::0;;;52156:44:0::2;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;52225:14:0;::::2;52268:3;52249:15;:10:::0;52262:2:::2;52249:15;:::i;:::-;52248:23;;;;:::i;:::-;52225:52;::::0;::::2;::::0;;;;;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52211:66;;;;;52296:7;52288:44;;;;-1:-1:-1::0;;;52288:44:0::2;;;;;;;:::i;:::-;-1:-1:-1::0;;4905:1:0::1;5855:7;:22:::0;-1:-1:-1;;;;;;;;;50318:2022:0:o;34764:177::-;34894:39;34911:4;34917:2;34921:7;34894:39;;;;;;;;;;;;:16;:39::i;52448:205::-;46859:9;46872:10;46859:23;46851:62;;;;-1:-1:-1;;;46851: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;:::-;52574:14:::2;52557:13;28257:7:::0;28284:12;;28204:100;52557:13:::2;52546:24;::::0;:8;:24:::2;:::i;:::-;:42;;52538:73;;;;-1:-1:-1::0;;;52538:73:0::2;;;;;;;:::i;:::-;52622:23;52632:2;52636:8;52622:9;:23::i;:::-;52448:205:::0;;:::o;28381:228::-;28484:7;28284:12;;28517:5;:21;28509:69;;;;-1:-1:-1;;;28509:69:0;;13408:2:1;28509:69:0;;;13390:21:1;13447:2;13427:18;;;13420:30;13486:34;13466:18;;;13459:62;-1:-1:-1;;;13537:18:1;;;13530:33;13580:19;;28509:69:0;13206:399:1;28509:69:0;-1:-1:-1;28596:5:0;28381:228::o;53046:138::-;1983:6;;-1:-1:-1;;;;;1983:6:0;778:10;2130:23;2122:68;;;;-1:-1:-1;;;2122:68:0;;;;;;;:::i;:::-;53138:38;;::::1;::::0;:17:::1;::::0;:38:::1;::::0;::::1;::::0;::::1;:::i;52839:102::-:0;1983:6;;-1:-1:-1;;;;;1983:6:0;778:10;2130:23;2122:68;;;;-1:-1:-1;;;2122:68:0;;;;;;;:::i;:::-;52910:23;;::::1;::::0;:13:::1;::::0;:23:::1;::::0;::::1;::::0;::::1;:::i;31618:124::-:0;31682:7;31709:20;31721:7;31709:11;:20::i;:::-;:25;;31618:124;-1:-1:-1;;31618:124:0:o;30334:258::-;30398:7;-1:-1:-1;;;;;30440:19:0;;30418:112;;;;-1:-1:-1;;;30418:112:0;;13812:2:1;30418:112:0;;;13794:21:1;13851:2;13831:18;;;13824:30;13890:34;13870:18;;;13863:62;-1:-1:-1;;;13941:18:1;;;13934:41;13992:19;;30418:112:0;13610:407:1;30418:112:0;-1:-1:-1;;;;;;30556:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;30556:27:0;;30334: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;53192:97::-;1983:6;;-1:-1:-1;;;;;1983:6:0;778:10;2130:23;2122:68;;;;-1:-1:-1;;;2122:68:0;;;;;;;:::i;:::-;53268:13:::1;::::0;;-1:-1:-1;;;;53251:30:0;::::1;-1:-1:-1::0;;;53268:13:0;;;::::1;;;53267:14;53251:30:::0;;::::1;;::::0;;53192:97::o;48978:167::-;-1:-1:-1;;;;;;;;;;;;;;;;;49117:20:0;49129:7;49117:11;:20::i;31978:104::-;32034:13;32067:7;32060:14;;;;;:::i;47588:373::-;46859:9;46872:10;46859:23;46851:62;;;;-1:-1:-1;;;46851: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;47723:8;46016:2:::2;47301:14;47723:8:::0;47272:13:::2;28257:7:::0;28284:12;;28204:100;47272:13:::2;:25;;;;:::i;:::-;:43;;47264:74;;;;-1:-1:-1::0;;;47264:74:0::2;;;;;;;:::i;:::-;47388:14;47375:9;:27;;47349:77;;;::::0;-1:-1:-1;;;47349:77:0;;10409:2:1;47349:77:0::2;::::0;::::2;10391:21:1::0;10448:2;10428:18;;;10421:30;-1:-1:-1;;;10467:18:1;;;10460:49;10526:18;;47349:77:0::2;10207:343:1::0;47349:77:0::2;47486:14;47473:9;47446:24;47459:10;47446:12;:24::i;:::-;:36;;;;:::i;:::-;:54;;47438:89;;;::::0;-1:-1:-1;;;47438:89:0;;10757:2:1;47438:89:0::2;::::0;::::2;10739:21:1::0;10796:2;10776:18;;;10769:30;-1:-1:-1;;;10815:18:1;;;10808:52;10877:18;;47438:89:0::2;10555:346:1::0;47438:89:0::2;47821:16:::3;::::0;-1:-1:-1;;;47821:16:0;::::3;;;47813:53;;;::::0;-1:-1:-1;;;47813:53:0;;14224:2:1;47813:53:0::3;::::0;::::3;14206:21:1::0;14263:2;14243:18;;;14236:30;14302:26;14282:18;;;14275:54;14346:18;;47813:53:0::3;14022:348:1::0;47813:53:0::3;47877:31;47887:10;47899:8;47877:9;:31::i;:::-;47919:34;47932:20;46120:11;47932:8:::0;:20:::3;:::i;47919:34::-;-1:-1:-1::0;;4905:1:0::1;5855:7;:22:::0;-1:-1:-1;47588:373:0:o;33868:311::-;-1:-1:-1;;;;;33986:24:0;;778:10;33986:24;;33978:63;;;;-1:-1:-1;;;33978:63:0;;14577:2:1;33978:63:0;;;14559:21:1;14616:2;14596:18;;;14589:30;14655:28;14635:18;;;14628:56;14701:18;;33978:63:0;14375:350:1;33978:63:0;778:10;34054:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;34054:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;34054:53:0;;;;;;;;;;34123:48;;540:41:1;;;34054:42:0;;778:10;34123:48;;513:18:1;34123:48:0;;;;;;;33868:311;;:::o;46394:101::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;35012:355::-;35171:28;35181:4;35187:2;35191:7;35171:9;:28::i;:::-;35232:48;35255:4;35261:2;35265:7;35274:5;35232:22;:48::i;:::-;35210:149;;;;-1:-1:-1;;;35210:149:0;;;;;;;:::i;:::-;35012:355;;;;:::o;45234:505::-;45376:4;45393:12;45429:7;1983:6;;-1:-1:-1;;;;;1983:6:0;;1910:87;45429:7;45418:25;;;-1:-1:-1;;;;;15380:15:1;;;45418:25:0;;;15362:34:1;15432:15;;;15412:18;;;15405:43;15297:18;;45418:25:0;;;;;;;;;;;;45408:36;;;;;;45393:51;;45455:15;45550:4;45497:58;;;;;;;15701:66:1;15689:79;;15793:2;15784:12;;15777:28;;;;15830:2;15821:12;;15459:380;45497:58:0;;;;-1:-1:-1;;45497:58:0;;;;;;;;;45473:93;;45497:58;45473:93;;;;45577:11;45591:30;;;;;;;;;16071:25:1;;;16144:4;16132:17;;16112:18;;;16105:45;;;;16166:18;;;16159:34;;;16209:18;;;16202:34;;;45473:93:0;;-1:-1:-1;45577:11:0;45591:30;;16043:19:1;;45591:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;45591:30:0;;-1:-1:-1;;45591:30:0;;45642:13;;45591:30;;-1:-1:-1;;;;;;45642:20:0;;;:13;;:20;;-1:-1:-1;45634:57:0;;;;-1:-1:-1;;;45634:57:0;;16449:2:1;45634:57:0;;;16431:21:1;16488:2;16468:18;;;16461:30;16527:26;16507:18;;;16500:54;16571:18;;45634:57:0;16247:348:1;45634:57:0;45711:13;;-1:-1:-1;;;;;45711:13:0;;;:20;;;;-1:-1:-1;;;45234:505:0;;;;;;;:::o;49640:569::-;49759:13;49798:17;49806:8;35679:4;35713:12;-1:-1:-1;35703:22:0;35622:111;49798:17;49790:48;;;;-1:-1:-1;;;49790:48:0;;16802:2:1;49790:48:0;;;16784:21:1;16841:2;16821:18;;;16814:30;-1:-1:-1;;;16860:18:1;;;16853:48;16918:18;;49790:48:0;16600:342:1;49790:48:0;49911:20;;;;;;;;;;;;49901:31;;;;;49865;;49882:13;;49865:31;;:::i;:::-;;;;;;;;;;;;;49855:42;;;;;;:77;49851:134;;;49956:17;49949:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49640:569;;;:::o;49851:134::-;50047:1;50023:13;50017:27;;;;;:::i;:::-;;;:31;:184;;;;;;;;;;;;;;;;;50114:13;50129:19;:8;:17;:19::i;:::-;50150:9;;50097:63;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;49997:204;49640:569;-1:-1:-1;;49640:569:0:o;48794:113::-;48852:7;48879:20;48893:5;48879:13;:20::i;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;;19143:2:1;2891:110:0::1;::::0;::::1;19125:21:1::0;19182:2;19162:18;;;19155:30;19221:34;19201:18;;;19194:62;-1:-1:-1;;;19272:18:1;;;19265:36;19318:19;;2891:110:0::1;18941:402:1::0;2891:110:0::1;3012:19;3022:8;3012:9;:19::i;:::-;2810:229:::0;:::o;39689:196::-;39804:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;39804:29:0;-1:-1:-1;;;;;39804:29:0;;;;;;;;;39849:28;;39804:24;;39849:28;;;;;;;39689:196;;;:::o;35741:104::-;35810:27;35820:2;35824:8;35810:27;;;;;;;;;;;;:9;:27::i;49280:223::-;49357:5;49344:9;:18;;49336:52;;;;-1:-1:-1;;;49336:52:0;;19550:2:1;49336:52:0;;;19532:21:1;19589:2;19569:18;;;19562:30;-1:-1:-1;;;19608:18:1;;;19601:51;19669:18;;49336:52:0;19348:345:1;49336:52:0;49415:5;49403:9;:17;49399:97;;;49445:10;49437:47;49466:17;49478:5;49466:9;:17;:::i;:::-;49437:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37862:1709;37977:35;38015:20;38027:7;38015:11;:20::i;:::-;38090:18;;37977:58;;-1:-1:-1;38048:22:0;;-1:-1:-1;;;;;38074:34:0;778:10;-1:-1:-1;;;;;38074:34:0;;:87;;;-1:-1:-1;778:10:0;38125:20;38137:7;38125:11;:20::i;:::-;-1:-1:-1;;;;;38125:36:0;;38074:87;:154;;;-1:-1:-1;38195:18:0;;38178:50;;778:10;34250:214;:::i;38178:50::-;38048:181;;38264:17;38242:117;;;;-1:-1:-1;;;38242:117:0;;20030:2:1;38242:117:0;;;20012:21:1;20069:2;20049:18;;;20042:30;20108:34;20088:18;;;20081:62;-1:-1:-1;;;20159:18:1;;;20152:48;20217:19;;38242:117:0;19828:414:1;38242:117:0;38416:4;-1:-1:-1;;;;;38394:26:0;:13;:18;;;-1:-1:-1;;;;;38394:26:0;;38372:114;;;;-1:-1:-1;;;38372:114:0;;20449:2:1;38372:114:0;;;20431:21:1;20488:2;20468:18;;;20461:30;20527:34;20507:18;;;20500:62;-1:-1:-1;;;20578:18:1;;;20571:36;20624:19;;38372:114:0;20247:402:1;38372:114:0;-1:-1:-1;;;;;38505:16:0;;38497:66;;;;-1:-1:-1;;;38497:66:0;;20856:2:1;38497:66:0;;;20838:21:1;20895:2;20875:18;;;20868:30;20934:34;20914:18;;;20907:62;-1:-1:-1;;;20985:18:1;;;20978:35;21030:19;;38497:66:0;20654:401:1;38497:66:0;38684:49;38701:1;38705:7;38714:13;:18;;;38684:8;:49::i;:::-;-1:-1:-1;;;;;38746:18:0;;;;;;:12;:18;;;;;:31;;38776:1;;38746:18;:31;;38776:1;;-1:-1:-1;;;;;38746:31:0;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;38746:31:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;38788:16:0;;-1:-1:-1;38788:16:0;;;:12;:16;;;;;:29;;-1:-1:-1;;;38788:16:0;;:29;;-1:-1:-1;;38788:29:0;;:::i;:::-;;;-1:-1:-1;;;;;38788:29:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38851:43:0;;;;;;;;-1:-1:-1;;;;;38851:43:0;;;;;;38877:15;38851:43;;;;;;;;;-1:-1:-1;38828:20:0;;;:11;:20;;;;;;:66;;;;;;;;;-1:-1:-1;;;38828:66:0;-1:-1:-1;;;;;;38828:66:0;;;;;;;;;;;39156:11;38840:7;-1:-1:-1;39156:11:0;:::i;:::-;39223:1;39182:24;;;:11;:24;;;;;:29;39134:33;;-1:-1:-1;;;;;;39182:29:0;39178:288;;39246:20;39254:11;35679:4;35713:12;-1:-1:-1;35703:22:0;35622:111;39246:20;39242:213;;;39314:125;;;;;;;;39351:18;;-1:-1:-1;;;;;39314:125:0;;;;;;39392:28;;;;39314:125;;;;;;;;;;-1:-1:-1;39287:24:0;;;:11;:24;;;;;;;:152;;;;;;;;;-1:-1:-1;;;39287:152:0;-1:-1:-1;;;;;;39287:152:0;;;;;;;;;;;;39242:213;39502:7;39498:2;-1:-1:-1;;;;;39483:27:0;39492:4;-1:-1:-1;;;;;39483:27:0;;;;;;;;;;;39521:42;37966:1605;;;37862:1709;;;:::o;40049:950::-;40143:24;;40186:12;40178:49;;;;-1:-1:-1;;;40178:49:0;;21771:2:1;40178:49:0;;;21753:21:1;21810:2;21790:18;;;21783:30;21849:26;21829:18;;;21822:54;21893:18;;40178:49:0;21569:348:1;40178:49:0;40238:16;40288:1;40257:28;40277:8;40257:17;:28;:::i;:::-;:32;;;;:::i;:::-;40238:51;-1:-1:-1;40315:18:0;40332:1;40315:14;:18;:::i;:::-;40304:8;:29;40300:91;;;40361:18;40378:1;40361:14;:18;:::i;:::-;40350:29;;40300:91;40514:17;40522:8;35679:4;35713:12;-1:-1:-1;35703:22:0;35622:111;40514:17;40506:68;;;;-1:-1:-1;;;40506:68:0;;22124:2:1;40506:68:0;;;22106:21:1;22163:2;22143:18;;;22136:30;22202:34;22182:18;;;22175:62;-1:-1:-1;;;22253:18:1;;;22246:36;22299:19;;40506:68:0;21922:402:1;40506:68:0;40602:17;40585:357;40626:8;40621:1;:13;40585:357;;40691:1;40660:14;;;:11;:14;;;;;:19;-1:-1:-1;;;;;40660:19:0;40656:275;;40714:31;40748:14;40760:1;40748:11;:14::i;:::-;40798:117;;;;;;;;40835:14;;-1:-1:-1;;;;;40798:117:0;;;;;;40872:24;;;;40798:117;;;;;;;;;;-1:-1:-1;40781:14:0;;;:11;:14;;;;;;;:134;;;;;;;;;-1:-1:-1;;;40781:134:0;-1:-1:-1;;;;;;40781:134:0;;;;;;;;;;;;-1:-1:-1;40656:275:0;40636:3;;;;:::i;:::-;;;;40585:357;;;-1:-1:-1;40979:12:0;:8;40990:1;40979:12;:::i;:::-;40952:24;:39;-1:-1:-1;;;40049:950:0:o;30874:682::-;-1:-1:-1;;;;;;;;;;;;;;;;;31009:16:0;31017:7;35679:4;35713:12;-1:-1:-1;35703:22:0;35622:111;31009:16;31001:71;;;;-1:-1:-1;;;31001:71:0;;22531:2:1;31001:71:0;;;22513:21:1;22570:2;22550:18;;;22543:30;22609:34;22589:18;;;22582:62;-1:-1:-1;;;22660:18:1;;;22653:40;22710:19;;31001:71:0;22329:406:1;31001:71:0;31085:26;31137:12;31126:7;:23;31122:103;;31187:22;31197:12;31187:7;:22;:::i;:::-;:26;;31212:1;31187:26;:::i;:::-;31166:47;;31122:103;31257:7;31237:242;31274:18;31266:4;:26;31237:242;;31317:31;31351:17;;;:11;:17;;;;;;;;;31317:51;;;;;;;;;-1:-1:-1;;;;;31317:51:0;;;;;-1:-1:-1;;;31317:51:0;;;;;;;;;;;;31387:28;31383:85;;31443:9;30874:682;-1:-1:-1;;;;30874:682:0:o;31383:85::-;-1:-1:-1;31294:6:0;;;;:::i;:::-;;;;31237:242;;;-1:-1:-1;31491:57:0;;-1:-1:-1;;;31491:57:0;;23083:2:1;31491:57:0;;;23065:21:1;23122:2;23102:18;;;23095:30;23161:34;23141:18;;;23134:62;-1:-1:-1;;;23212:18:1;;;23205:45;23267:19;;31491:57:0;22881: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;41564:985::-;41719:4;-1:-1:-1;;;;;41740:13:0;;15213:20;15261:8;41736:806;;41793:175;;-1:-1:-1;;;41793:175:0;;-1:-1:-1;;;;;41793:36:0;;;;;:175;;778:10;;41887:4;;41914:7;;41944:5;;41793:175;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41793:175:0;;;;;;;;-1:-1:-1;;41793:175:0;;;;;;;;;;;;:::i;:::-;;;41772:715;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42155:13:0;;42151:321;;42198:109;;-1:-1:-1;;;42198:109:0;;;;;;;:::i;42151:321::-;42422:6;42416:13;42407:6;42403:2;42399:15;42392:38;41772:715;-1:-1:-1;;;;;;42032:55:0;-1:-1:-1;;;42032:55:0;;-1:-1:-1;42025:62:0;;41736:806;-1:-1:-1;42526:4:0;42519:11;;22977:723;23033:13;23254:10;23250:53;;-1:-1:-1;;23281:10:0;;;;;;;;;;;;-1:-1:-1;;;23281:10:0;;;;;22977:723::o;23250:53::-;23328:5;23313:12;23369:78;23376:9;;23369:78;;23402:8;;;;:::i;:::-;;-1:-1:-1;23425:10:0;;-1:-1:-1;23433:2:0;23425:10;;:::i;:::-;;;23369:78;;;23457:19;23489:6;23479:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23479:17:0;;23457:39;;23507:154;23514:10;;23507:154;;23541:11;23551:1;23541:11;;:::i;:::-;;-1:-1:-1;23610:10:0;23618:2;23610:5;:10;:::i;:::-;23597:24;;:2;:24;:::i;:::-;23584:39;;23567:6;23574;23567:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;23567:56:0;;;;;;;;-1:-1:-1;23638:11:0;23647:2;23638:11;;:::i;:::-;;;23507:154;;30600:266;30661:7;-1:-1:-1;;;;;30703:19:0;;30681:118;;;;-1:-1:-1;;;30681:118:0;;24496:2:1;30681:118:0;;;24478:21:1;24535:2;24515:18;;;24508:30;24574:34;24554:18;;;24547:62;-1:-1:-1;;;24625:18:1;;;24618:47;24682:19;;30681:118:0;24294:413:1;30681:118:0;-1:-1:-1;;;;;;30825:19:0;;;;;:12;:19;;;;;:32;-1:-1:-1;;;30825:32:0;;-1:-1:-1;;;;;30825:32:0;;30600:266::o;36208:1400::-;36331:20;36354:12;-1:-1:-1;;;;;36385:16:0;;36377:62;;;;-1:-1:-1;;;36377:62:0;;24914:2:1;36377:62:0;;;24896:21:1;24953:2;24933:18;;;24926:30;24992:34;24972:18;;;24965:62;-1:-1:-1;;;25043:18:1;;;25036:31;25084:19;;36377:62:0;24712:397:1;36377:62:0;36584:21;36592:12;35679:4;35713:12;-1:-1:-1;35703:22:0;35622:111;36584:21;36583:22;36575:64;;;;-1:-1:-1;;;36575:64:0;;25316:2:1;36575:64:0;;;25298:21:1;25355:2;25335:18;;;25328:30;25394:31;25374:18;;;25367:59;25443:18;;36575:64:0;25114:353:1;36575:64:0;36670:12;36658:8;:24;;36650:71;;;;-1:-1:-1;;;36650:71:0;;25674:2:1;36650:71:0;;;25656:21:1;25713:2;25693:18;;;25686:30;25752:34;25732:18;;;25725:62;-1:-1:-1;;;25803:18:1;;;25796:32;25845:19;;36650:71:0;25472:398:1;36650:71:0;-1:-1:-1;;;;;36841:16:0;;36808:30;36841:16;;;:12;:16;;;;;;;;;36808:49;;;;;;;;;-1:-1:-1;;;;;36808:49:0;;;;;-1:-1:-1;;;36808:49:0;;;;;;;;;;;36887:135;;;;;;;;36913:19;;36808:49;;36887:135;;;36913:39;;36943:8;;36913:39;:::i;:::-;-1:-1:-1;;;;;36887:135:0;;;;;37002:8;36967:11;:24;;;:44;;;;:::i;:::-;-1:-1:-1;;;;;36887:135:0;;;;;;-1:-1:-1;;;;;36868:16:0;;;;;;;:12;:16;;;;;;;;:154;;;;;;;;-1:-1:-1;;;36868:154:0;;;;;;;;;;;;37061:43;;;;;;;;;;;37087:15;37061:43;;;;;;;;37033:25;;;:11;:25;;;;;;:71;;;;;;;;;-1:-1:-1;;;37033:71:0;-1:-1:-1;;;;;;37033:71:0;;;;;;;;;;;;;;;;;;37045:12;;37165:325;37189:8;37185:1;:12;37165:325;;;37224:38;;37249:12;;-1:-1:-1;;;;;37224:38:0;;;37241:1;;37224:38;;37241:1;;37224:38;37303:59;37334:1;37338:2;37342:12;37356:5;37303:22;:59::i;:::-;37277:172;;;;-1:-1:-1;;;37277:172:0;;;;;;;:::i;:::-;37464:14;;;;:::i;:::-;;;;37199:3;;;;;:::i;:::-;;;;37165:325;;;-1:-1:-1;37502:12:0;:27;;;37540:60;35012: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:127::-;3493:10;3488:3;3484:20;3481:1;3474:31;3524:4;3521:1;3514:15;3548:4;3545:1;3538:15;3564:632;3629:5;3659:18;3700:2;3692:6;3689:14;3686:40;;;3706:18;;:::i;:::-;3781:2;3775:9;3749:2;3835:15;;-1:-1:-1;;3831:24:1;;;3857:2;3827:33;3823:42;3811:55;;;3881:18;;;3901:22;;;3878:46;3875:72;;;3927:18;;:::i;:::-;3967:10;3963:2;3956:22;3996:6;3987:15;;4026:6;4018;4011:22;4066:3;4057:6;4052:3;4048:16;4045:25;4042:45;;;4083:1;4080;4073:12;4042:45;4133:6;4128:3;4121:4;4113:6;4109:17;4096:44;4188:1;4181:4;4172:6;4164;4160:19;4156:30;4149:41;;;;3564:632;;;;;:::o;4201:451::-;4270:6;4323:2;4311:9;4302:7;4298:23;4294:32;4291:52;;;4339:1;4336;4329:12;4291:52;4379:9;4366:23;4412:18;4404:6;4401:30;4398:50;;;4444:1;4441;4434:12;4398:50;4467:22;;4520:4;4512:13;;4508:27;-1:-1:-1;4498:55:1;;4549:1;4546;4539:12;4498:55;4572:74;4638:7;4633:2;4620:16;4615:2;4611;4607:11;4572:74;:::i;5204:347::-;5269:6;5277;5330:2;5318:9;5309:7;5305:23;5301:32;5298:52;;;5346:1;5343;5336:12;5298:52;5369:29;5388:9;5369:29;:::i;:::-;5359:39;;5448:2;5437:9;5433:18;5420:32;5495:5;5488:13;5481:21;5474:5;5471:32;5461:60;;5517:1;5514;5507:12;5461:60;5540:5;5530:15;;;5204:347;;;;;:::o;5556:667::-;5651:6;5659;5667;5675;5728:3;5716:9;5707:7;5703:23;5699:33;5696:53;;;5745:1;5742;5735:12;5696:53;5768:29;5787:9;5768:29;:::i;:::-;5758:39;;5816:38;5850:2;5839:9;5835:18;5816:38;:::i;:::-;5806:48;;5901:2;5890:9;5886:18;5873:32;5863:42;;5956:2;5945:9;5941:18;5928:32;5983:18;5975:6;5972:30;5969:50;;;6015:1;6012;6005:12;5969:50;6038:22;;6091:4;6083:13;;6079:27;-1:-1:-1;6069:55:1;;6120:1;6117;6110:12;6069:55;6143:74;6209:7;6204:2;6191:16;6186:2;6182;6178:11;6143:74;:::i;:::-;6133:84;;;5556:667;;;;;;;:::o;6228:393::-;6312:6;6320;6328;6336;6389:3;6377:9;6368:7;6364:23;6360:33;6357:53;;;6406:1;6403;6396:12;6357:53;6429:29;6448:9;6429:29;:::i;:::-;6419:39;;6505:2;6494:9;6490:18;6477:32;6467:42;;6556:2;6545:9;6541:18;6528:32;6518:42;;6579:36;6611:2;6600:9;6596:18;6579:36;:::i;6626:260::-;6694:6;6702;6755:2;6743:9;6734:7;6730:23;6726:32;6723:52;;;6771:1;6768;6761:12;6723:52;6794:29;6813:9;6794:29;:::i;:::-;6784:39;;6842:38;6876:2;6865:9;6861:18;6842:38;:::i;:::-;6832:48;;6626:260;;;;;:::o;6891:356::-;7093:2;7075:21;;;7112:18;;;7105:30;7171:34;7166:2;7151:18;;7144:62;7238:2;7223:18;;6891:356::o;7252:380::-;7331:1;7327:12;;;;7374;;;7395:61;;7449:4;7441:6;7437:17;7427:27;;7395:61;7502:2;7494:6;7491:14;7471:18;7468:38;7465:161;;;7548:10;7543:3;7539:20;7536:1;7529:31;7583:4;7580:1;7573:15;7611:4;7608:1;7601:15;7465:161;;7252:380;;;:::o;8880:350::-;9082:2;9064:21;;;9121:2;9101:18;;;9094:30;9160:28;9155:2;9140:18;;9133:56;9221:2;9206:18;;8880:350::o;9235:355::-;9437:2;9419:21;;;9476:2;9456:18;;;9449:30;9515:33;9510:2;9495:18;;9488:61;9581:2;9566:18;;9235:355::o;9595:127::-;9656:10;9651:3;9647:20;9644:1;9637:31;9687:4;9684:1;9677:15;9711:4;9708:1;9701:15;9727:128;9767:3;9798:1;9794:6;9791:1;9788:13;9785:39;;;9804:18;;:::i;:::-;-1:-1:-1;9840:9:1;;9727:128::o;9860:342::-;10062:2;10044:21;;;10101:2;10081:18;;;10074:30;-1:-1:-1;;;10135:2:1;10120:18;;10113:48;10193:2;10178:18;;9860:342::o;11255:168::-;11295:7;11361:1;11357;11353:6;11349:14;11346:1;11343:21;11338:1;11331:9;11324:17;11320:45;11317:71;;;11368:18;;:::i;:::-;-1:-1:-1;11408:9:1;;11255:168::o;11831:135::-;11870:3;-1:-1:-1;;11891:17:1;;11888:43;;;11911:18;;:::i;:::-;-1:-1:-1;11958:1:1;11947:13;;11831:135::o;12386:127::-;12447:10;12442:3;12438:20;12435:1;12428:31;12478:4;12475:1;12468:15;12502:4;12499:1;12492:15;12518:120;12558:1;12584;12574:35;;12589:18;;:::i;:::-;-1:-1:-1;12623:9:1;;12518:120::o;12853:348::-;13055:2;13037:21;;;13094:2;13074:18;;;13067:30;13133:26;13128:2;13113:18;;13106:54;13192:2;13177:18;;12853:348::o;14730:415::-;14932:2;14914:21;;;14971:2;14951:18;;;14944:30;15010:34;15005:2;14990:18;;14983:62;-1:-1:-1;;;15076:2:1;15061:18;;15054:49;15135:3;15120:19;;14730:415::o;17284:973::-;17369:12;;17334:3;;17424:1;17444:18;;;;17497;;;;17524:61;;17578:4;17570:6;17566:17;17556:27;;17524:61;17604:2;17652;17644:6;17641:14;17621:18;17618:38;17615:161;;;17698:10;17693:3;17689:20;17686:1;17679:31;17733:4;17730:1;17723:15;17761:4;17758:1;17751:15;17615:161;17792:18;17819:104;;;;17937:1;17932:319;;;;17785:466;;17819:104;-1:-1:-1;;17852:24:1;;17840:37;;17897:16;;;;-1:-1:-1;17819:104:1;;17932:319;17231:1;17224:14;;;17268:4;17255:18;;18026:1;18040:165;18054:6;18051:1;18048:13;18040:165;;;18132:14;;18119:11;;;18112:35;18175:16;;;;18069:10;;18040:165;;;18044:3;;18234:6;18229:3;18225:16;18218:23;;17785:466;;;;;;;17284:973;;;;:::o;18262:197::-;18390:3;18415:38;18449:3;18441:6;18415:38;:::i;18464:472::-;18668:3;18696:38;18730:3;18722:6;18696:38;:::i;:::-;18763:6;18757:13;18779:52;18824:6;18820:2;18813:4;18805:6;18801:17;18779:52;:::i;:::-;18853:15;18877:21;;;-1:-1:-1;;18925:4:1;18914:16;;18464:472;-1:-1:-1;;18464:472:1:o;19698:125::-;19738:4;19766:1;19763;19760:8;19757:34;;;19771:18;;:::i;:::-;-1:-1:-1;19808:9:1;;19698:125::o;21060:246::-;21100:4;-1:-1:-1;;;;;21213:10:1;;;;21183;;21235:12;;;21232:38;;;21250:18;;:::i;:::-;21287:13;;21060:246;-1:-1:-1;;;21060:246:1:o;21311:253::-;21351:3;-1:-1:-1;;;;;21440:2:1;21437:1;21433:10;21470:2;21467:1;21463:10;21501:3;21497:2;21493:12;21488:3;21485:21;21482:47;;;21509:18;;:::i;:::-;21545:13;;21311:253;-1:-1:-1;;;;21311:253:1:o;22740:136::-;22779:3;22807:5;22797:39;;22816:18;;:::i;:::-;-1:-1:-1;;;22852:18:1;;22740:136::o;23297:489::-;-1:-1:-1;;;;;23566:15:1;;;23548:34;;23618:15;;23613:2;23598:18;;23591:43;23665:2;23650:18;;23643:34;;;23713:3;23708:2;23693:18;;23686:31;;;23491:4;;23734:46;;23760:19;;23752:6;23734:46;:::i;:::-;23726:54;23297:489;-1:-1:-1;;;;;;23297:489:1:o;23791:249::-;23860:6;23913:2;23901:9;23892:7;23888:23;23884:32;23881:52;;;23929:1;23926;23919:12;23881:52;23961:9;23955:16;23980:30;24004:5;23980:30;:::i;24045:112::-;24077:1;24103;24093:35;;24108:18;;:::i;:::-;-1:-1:-1;24142:9:1;;24045:112::o;24162:127::-;24223:10;24218:3;24214:20;24211:1;24204:31;24254:4;24251:1;24244:15;24278:4;24275:1;24268:15

Swarm Source

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