ETH Price: $2,657.34 (-2.98%)

Token

EliteCruiseNFT (ECN)
 

Overview

Max Total Supply

0 ECN

Holders

11

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 ECN
0xb20146e2c229fc0469a86a68709ee7eb5051defa
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:
EliteCruiseNFT

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-05-07
*/

// File: contracts/ICruiseNFTMarketplace.sol


pragma solidity >=0.8.0;

struct CruiseMembership {
    uint256 tokenId;
    string tokenURI;
    address mintedBy;
    address currentOwner;
    address previousOwner;
    uint256 price;
    bool isForSale;
    bool isWithheld;
    uint16 votingCount;
}
// File: @openzeppelin/contracts/security/ReentrancyGuard.sol


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

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

// File: @openzeppelin/contracts/access/Ownable.sol


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol


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

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol


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

pragma solidity ^0.8.0;


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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            super.supportsInterface(interfaceId);
    }

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

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender);
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);

        _afterTokenTransfer(address(0), to, tokenId);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

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

        emit Transfer(owner, address(0), tokenId);

        _afterTokenTransfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

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

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

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

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

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

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

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

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


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

pragma solidity ^0.8.0;


/**
 * @dev ERC721 token with storage based token URI management.
 */
abstract contract ERC721URIStorage is ERC721 {
    using Strings for uint256;

    // Optional mapping for token URIs
    mapping(uint256 => string) private _tokenURIs;

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

        string memory _tokenURI = _tokenURIs[tokenId];
        string memory base = _baseURI();

        // If there is no base URI, return the token URI.
        if (bytes(base).length == 0) {
            return _tokenURI;
        }
        // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
        if (bytes(_tokenURI).length > 0) {
            return string(abi.encodePacked(base, _tokenURI));
        }

        return super.tokenURI(tokenId);
    }

    /**
     * @dev Sets `_tokenURI` as the tokenURI of `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
        require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token");
        _tokenURIs[tokenId] = _tokenURI;
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual override {
        super._burn(tokenId);

        if (bytes(_tokenURIs[tokenId]).length != 0) {
            delete _tokenURIs[tokenId];
        }
    }
}

// File: contracts/EliteCruiseNFT.sol


pragma solidity >=0.8.0;






contract EliteCruiseNFT is ERC721, ERC721URIStorage, Ownable, ReentrancyGuard {

    string public baseURI = "";
    uint256 public mintIndex = 1;
    uint256 public availSupply = 950;
    uint256 public withheldSupply = 50;
    uint256 public mintPrice = 1 ether;
    uint32 public denominator = 1000;
    address public daoContract;

    mapping(uint256 => CruiseMembership) public allCruiseElite;

    mapping(address => uint256) public mintedTotal;

    uint256 public maxCountPerWallet = 10;

    address private  cruiseOperationsWallet = 0x2947d8134f148B2A7Ed22C10FAfC4d6Cd42C1054;
    address private  devWallet = 0x1695e62192959A93625EdD8993A2c44faed666Ac;
    address private  investorGBWallet = 0x49C4D560C2b8C2C72962dA8B02B1C428d745a6Fd;
    address private  futureEmploymentWallet = 0xce9F8dDA015702E40cF697aDd3D55E2cF122c641;
    address private  ownershipWallet = 0xe34f72eD903c9f997B9f8658a1b082fd55093DA7;
    address private  eMaloneCDWallet = 0x79C61C20e9C407E4D768a78F7350B78157530183;
    address private  cruiseDaoWalletForCommunity = 0x12A75919B84810e02B1BD4b30b9C47da4c893B10;
    address private  cruiseDaoCharityWallet = 0xD48b024D9d0751f19Ab3D255101405EB534Ea76A;

    constructor() ERC721("EliteCruiseNFT", "ECN") {
        daoContract = msg.sender;
    }

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

    function _burn(uint256 tokenId) internal override(ERC721, ERC721URIStorage) {
        super._burn(tokenId);
    }

    function setBaseUri(string memory _uri) external onlyOwner {
        baseURI = _uri;
    }

    function tokenURI(uint256 tokenId)
        public
        view
        virtual
        override(ERC721, ERC721URIStorage)
        returns (string memory)
    {
        return super.tokenURI(tokenId);
    }

    function getMintIndex() public view returns(uint256) {
        return mintIndex;
    }

    function mint(string memory _tokenURI) public payable {
        if (msg.sender == cruiseOperationsWallet) {
            require(withheldSupply > 0, "Supply exceeded");
            _safeMint(msg.sender, mintIndex);
            _setTokenURI(mintIndex, _tokenURI);
            withheldSupply -= 1;

            CruiseMembership memory newCruiseElite = CruiseMembership(
                mintIndex,
                _tokenURI,
                msg.sender,
                msg.sender,
                address(0),
                0,
                false,
                true,
                5
            );
            allCruiseElite[mintIndex] = newCruiseElite;
            mintIndex += 1;
        } else {
            require(availSupply > 0, "Supply exceeded");
            require(mintedTotal[msg.sender] < maxCountPerWallet, "Count per wallet exceeded");
            require(msg.value == mintPrice, "Ether value incorrect");
            _safeMint(msg.sender, mintIndex);
            _setTokenURI(mintIndex, _tokenURI);
            mintedTotal[msg.sender] += 1;
            availSupply -= 1;

            CruiseMembership memory newCruiseElite = CruiseMembership(
                mintIndex,
                _tokenURI,
                msg.sender,
                msg.sender,
                address(0),
                mintPrice,
                false,
                false,
                5
            );
            allCruiseElite[mintIndex] = newCruiseElite;
            mintIndex += 1;
            distribute(mintPrice);
        }
        
    }

    function changeTokenPrice(uint256 _tokenId, uint256 _newPrice) public {
        // require caller of the function is not an empty address
        require(msg.sender != address(0), "Shouldn't be empty address");
        // require that token should exist
        require(_exists(_tokenId), "Token not exist");
        // require that token should not be withheld
        require(!allCruiseElite[_tokenId].isWithheld, "Token shuold be reserve one");
        // get the token's owner
        address tokenOwner = ownerOf(_tokenId);
        // check that token's owner should be equal to the caller of the function
        require(tokenOwner == msg.sender, "Invalid owner");
        
        CruiseMembership memory cruiseElite = allCruiseElite[_tokenId];
        // update token's price with new price
        cruiseElite.price = _newPrice;
        // set and update that token in the mapping
        allCruiseElite[_tokenId] = cruiseElite;
    }

    // switch between set for sale and set not for sale
    function toggleForSale(uint256 _tokenId) public {
        // require caller of the function is not an empty address
        require(msg.sender != address(0), "Shouldn't be empty address");
        // require that token should exist
        require(_exists(_tokenId), "Token not exist");
        // require that token should not be withheld
        require(!allCruiseElite[_tokenId].isWithheld, "Token shuold be reserve one");
        // get the token's owner
        address tokenOwner = ownerOf(_tokenId);
        // check that token's owner should be equal to the caller of the function
        require(tokenOwner == msg.sender, "Invalid owner");
        
        CruiseMembership memory cruiseElite = allCruiseElite[_tokenId];
        // if token's forSale is false make it true and vice versa
        if(cruiseElite.isForSale) {
            cruiseElite.isForSale = false;
        } else {
            cruiseElite.isForSale = true;
        }
        // set and update that token in the mapping
        allCruiseElite[_tokenId] = cruiseElite;
    }

    function distribute(uint256 _amount) private {
        payable(cruiseOperationsWallet).transfer(_amount * 150 / denominator);
        payable(devWallet).transfer(_amount * 40 / denominator);
        payable(investorGBWallet).transfer(_amount * 40 / denominator);
        payable(futureEmploymentWallet).transfer(_amount * 20 / denominator);
        payable(ownershipWallet).transfer(_amount * 200 / denominator);
        payable(eMaloneCDWallet).transfer(_amount * 100 / denominator);
        payable(cruiseDaoWalletForCommunity).transfer(_amount * 400 / denominator);
        payable(cruiseDaoCharityWallet).transfer(_amount * 50 / denominator);
    }

    function purchaseToken(uint256 _tokenId) public payable nonReentrant {
        // check if the function caller is not an zero account address
        require(msg.sender != address(0), "Shouldn't be empty address");
        // check if the token id of the token being bought exists or not
        require(_exists(_tokenId), "Token not exist");
        // get the token's owner
        address tokenOwner = ownerOf(_tokenId);
        // token's owner should not be an zero address account
        require(tokenOwner != address(0), "Owner can't be empty address");
        // require that token should not be withheld
        require(!allCruiseElite[_tokenId].isWithheld, "Token shuold not be withheld");
        // the one who wants to buy the token should not be the token's owner
        require(tokenOwner != msg.sender, "Shouldn't be owner");
   
        CruiseMembership memory cruiseElite = allCruiseElite[_tokenId];
        // price sent in to buy should be equal to or more than the token's price
        require(msg.value == cruiseElite.price, "Ether value incorrect");
        // token should be for sale
        require(cruiseElite.isForSale, "Token is not for sale");
        // shouldn't be cruise operations wallet
        require(msg.sender != cruiseOperationsWallet, "Shouldn't be operations wallet");

        payable(cruiseElite.currentOwner).transfer(cruiseElite.price * 9 / 10);
        distribute(cruiseElite.price / 10);

        // transfer the token from owner to the caller of the function (buyer)
        _transfer(tokenOwner, msg.sender, _tokenId);
        
        
        // update the token's previous owner
        cruiseElite.previousOwner = cruiseElite.currentOwner;
        // update the token's current owner
        cruiseElite.currentOwner = msg.sender;
        // set and update that token in the mapping
        allCruiseElite[_tokenId] = cruiseElite;
    }

    function transferWithheldToken(uint256 _tokenId, address _to) public nonReentrant {
        // shouldn't be cruise operations wallet
        require(msg.sender == cruiseOperationsWallet, "Should be operations wallet");
        // require that token should not be withheld
        require(allCruiseElite[_tokenId].isWithheld, "Token shuold be withheld");
        // owner should not be an zero address account
        require(_to != address(0), "Owner can't be empty address");
        // get the token's owner
        address tokenOwner = ownerOf(_tokenId);
        _transfer(tokenOwner, _to, _tokenId);
        CruiseMembership memory cruiseElite = allCruiseElite[_tokenId];
        cruiseElite.previousOwner = cruiseElite.currentOwner;
        cruiseElite.currentOwner = _to;
        allCruiseElite[_tokenId] = cruiseElite;
    }

    function withdrawFunds(address _to) external onlyOwner {
        payable(_to).transfer(address(this).balance);
    }

    function setDaoContract(address _dao) public onlyOwner {
        daoContract = _dao;
    }

    function decreaseVotingEntry(uint256 _tokenId, uint16 _decreaseCount) external {
        require(msg.sender != address(0), "Shouldn't be empty address");
        require(msg.sender == daoContract, "Should be DAO contract");
        CruiseMembership memory cruiseSelect = allCruiseElite[_tokenId];
        require(cruiseSelect.votingCount >= _decreaseCount, "Left entries shouldn't be smaller than decrease count");
        cruiseSelect.votingCount -= _decreaseCount;
        allCruiseElite[_tokenId] = cruiseSelect;
    }

    function getTokenData(uint256 _tokenId) external view returns (CruiseMembership memory) {
        return allCruiseElite[_tokenId];
    }

}

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":"uint256","name":"","type":"uint256"}],"name":"allCruiseElite","outputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"tokenURI","type":"string"},{"internalType":"address","name":"mintedBy","type":"address"},{"internalType":"address","name":"currentOwner","type":"address"},{"internalType":"address","name":"previousOwner","type":"address"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"bool","name":"isForSale","type":"bool"},{"internalType":"bool","name":"isWithheld","type":"bool"},{"internalType":"uint16","name":"votingCount","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"availSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"changeTokenPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"daoContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint16","name":"_decreaseCount","type":"uint16"}],"name":"decreaseVotingEntry","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"denominator","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMintIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getTokenData","outputs":[{"components":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"tokenURI","type":"string"},{"internalType":"address","name":"mintedBy","type":"address"},{"internalType":"address","name":"currentOwner","type":"address"},{"internalType":"address","name":"previousOwner","type":"address"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"bool","name":"isForSale","type":"bool"},{"internalType":"bool","name":"isWithheld","type":"bool"},{"internalType":"uint16","name":"votingCount","type":"uint16"}],"internalType":"struct CruiseMembership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxCountPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_tokenURI","type":"string"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintedTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"purchaseToken","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setBaseUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_dao","type":"address"}],"name":"setDaoContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"toggleForSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"address","name":"_to","type":"address"}],"name":"transferWithheldToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"}],"name":"withdrawFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withheldSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

60a06040819052600060808190526200001b9160099162000259565b506001600a9081556103b6600b556032600c55670de0b6b3a7640000600d55600e805463ffffffff19166103e8179055601155601280546001600160a01b0319908116732947d8134f148b2a7ed22c10fafc4d6cd42c105417909155601380548216731695e62192959a93625edd8993a2c44faed666ac1790556014805482167349c4d560c2b8c2c72962da8b02b1c428d745a6fd17905560158054821673ce9f8dda015702e40cf697add3d55e2cf122c64117905560168054821673e34f72ed903c9f997b9f8658a1b082fd55093da71790556017805482167379c61c20e9c407e4d768a78f7350b781575301831790556018805482167312a75919b84810e02b1bd4b30b9c47da4c893b101790556019805490911673d48b024d9d0751f19ab3d255101405eb534ea76a1790553480156200015757600080fd5b50604080518082018252600e81526d115b1a5d1950dc9d5a5cd953919560921b60208083019182528351808501909452600384526222a1a760e91b908401528151919291620001a99160009162000259565b508051620001bf90600190602084019062000259565b505050620001dc620001d66200020360201b60201c565b62000207565b6001600855600e8054600160201b600160c01b03191633640100000000021790556200033c565b3390565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200026790620002ff565b90600052602060002090601f0160209004810192826200028b5760008555620002d6565b82601f10620002a657805160ff1916838001178555620002d6565b82800160010185558215620002d6579182015b82811115620002d6578251825591602001919060010190620002b9565b50620002e4929150620002e8565b5090565b5b80821115620002e45760008155600101620002e9565b600181811c908216806200031457607f821691505b602082108114156200033657634e487b7160e01b600052602260045260246000fd5b50919050565b613ba7806200034c6000396000f3fe60806040526004361061021a5760003560e01c8063785d783f11610123578063b09afec1116100ab578063d7c0eec31161006f578063d7c0eec31461062f578063d85d3d2714610664578063e985e9c514610677578063f2fde38b146106c0578063f74f9bfd146106e057600080fd5b8063b09afec11461058f578063b56b0449146105bc578063b88d4fde146105dc578063c2db2c42146105fc578063c87b56dd1461060f57600080fd5b806396ce0795116100f257806396ce0795146104e75780639f5215dd14610519578063a0bcfc7f1461052f578063a22cb4651461054f578063a32018b91461056f57600080fd5b8063785d783f1461047e5780638da5cb5b146104945780638fb58285146104b257806395d89b41146104d257600080fd5b8063492f534b116101a65780636817c76c116101755780636817c76c146103fe57806368742da6146104145780636c0360eb1461043457806370a0823114610449578063715018a61461046957600080fd5b8063492f534b146103765780634a7ffcbc1461039657806362e8e8ac146103be5780636352211e146103de57600080fd5b8063095ea7b3116101ed578063095ea7b3146102d2578063145f798f146102f457806323b872dd1461032157806330cbc1451461034157806342842e0e1461035657600080fd5b806301ffc9a71461021f57806303a028181461025457806306fdde0314610278578063081812fc1461029a575b600080fd5b34801561022b57600080fd5b5061023f61023a3660046135f8565b6106f6565b60405190151581526020015b60405180910390f35b34801561026057600080fd5b5061026a60115481565b60405190815260200161024b565b34801561028457600080fd5b5061028d610748565b60405161024b9190613793565b3480156102a657600080fd5b506102ba6102b5366004613676565b6107da565b6040516001600160a01b03909116815260200161024b565b3480156102de57600080fd5b506102f26102ed3660046135cf565b610867565b005b34801561030057600080fd5b5061026a61030f366004613495565b60106020526000908152604090205481565b34801561032d57600080fd5b506102f261033c3660046134e1565b61097d565b34801561034d57600080fd5b50600a5461026a565b34801561036257600080fd5b506102f26103713660046134e1565b6109ae565b34801561038257600080fd5b506102f26103913660046136b0565b6109c9565b3480156103a257600080fd5b50600e546102ba9064010000000090046001600160a01b031681565b3480156103ca57600080fd5b506102f26103d93660046136da565b610cdc565b3480156103ea57600080fd5b506102ba6103f9366004613676565b610ff5565b34801561040a57600080fd5b5061026a600d5481565b34801561042057600080fd5b506102f261042f366004613495565b61106c565b34801561044057600080fd5b5061028d6110cf565b34801561045557600080fd5b5061026a610464366004613495565b61115d565b34801561047557600080fd5b506102f26111e4565b34801561048a57600080fd5b5061026a600c5481565b3480156104a057600080fd5b506007546001600160a01b03166102ba565b3480156104be57600080fd5b506102f26104cd366004613495565b61121a565b3480156104de57600080fd5b5061028d611272565b3480156104f357600080fd5b50600e546105049063ffffffff1681565b60405163ffffffff909116815260200161024b565b34801561052557600080fd5b5061026a600b5481565b34801561053b57600080fd5b506102f261054a366004613630565b611281565b34801561055b57600080fd5b506102f261056a366004613595565b6112be565b34801561057b57600080fd5b506102f261058a366004613676565b6112c9565b34801561059b57600080fd5b506105af6105aa366004613676565b61153d565b60405161024b91906138de565b3480156105c857600080fd5b506102f26105d736600461368e565b6116ac565b3480156105e857600080fd5b506102f26105f736600461351c565b611a60565b6102f261060a366004613676565b611a98565b34801561061b57600080fd5b5061028d61062a366004613676565b611fdc565b34801561063b57600080fd5b5061064f61064a366004613676565b611fe7565b60405161024b99989796959493929190613995565b6102f2610672366004613630565b6120d3565b34801561068357600080fd5b5061023f6106923660046134af565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156106cc57600080fd5b506102f26106db366004613495565b61252f565b3480156106ec57600080fd5b5061026a600a5481565b60006001600160e01b031982166380ac58cd60e01b148061072757506001600160e01b03198216635b5e139f60e01b145b8061074257506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606000805461075790613aaf565b80601f016020809104026020016040519081016040528092919081815260200182805461078390613aaf565b80156107d05780601f106107a5576101008083540402835291602001916107d0565b820191906000526020600020905b8154815290600101906020018083116107b357829003601f168201915b5050505050905090565b60006107e5826125c7565b61084b5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061087282610ff5565b9050806001600160a01b0316836001600160a01b031614156108e05760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610842565b336001600160a01b03821614806108fc57506108fc8133610692565b61096e5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610842565b61097883836125e4565b505050565b6109873382612652565b6109a35760405162461bcd60e51b815260040161084290613864565b61097883838361273c565b61097883838360405180602001604052806000815250611a60565b336109e65760405162461bcd60e51b81526004016108429061382d565b600e5464010000000090046001600160a01b03163314610a415760405162461bcd60e51b815260206004820152601660248201527514da1bdd5b1908189948111053c818dbdb9d1c9858dd60521b6044820152606401610842565b6000600f60008481526020019081526020016000206040518061012001604052908160008201548152602001600182018054610a7c90613aaf565b80601f0160208091040260200160405190810160405280929190818152602001828054610aa890613aaf565b8015610af55780601f10610aca57610100808354040283529160200191610af5565b820191906000526020600020905b815481529060010190602001808311610ad857829003601f168201915b505050918352505060028201546001600160a01b03908116602083015260038301548116604083015260048301541660608201526005820154608082015260069091015460ff808216151560a0840152610100808304909116151560c084015261ffff62010000909204821660e0909301929092529082015191925083811691161015610be25760405162461bcd60e51b815260206004820152603560248201527f4c65667420656e74726965732073686f756c646e277420626520736d616c6c656044820152741c881d1a185b88191958dc99585cd94818dbdd5b9d605a1b6064820152608401610842565b818161010001818151610bf59190613a49565b61ffff169052506000838152600f60209081526040909120825181558183015180518493610c2a92600185019291019061336a565b5060408201516002820180546001600160a01b039283166001600160a01b0319918216179091556060840151600384018054918416918316919091179055608084015160048401805491909316911617905560a0820151600582015560c08201516006909101805460e08401516101009485015161ffff16620100000263ffff00001991151590950261ff00199415159490941661ffff19909216919091179290921791909116919091179055505050565b33610cf95760405162461bcd60e51b81526004016108429061382d565b610d02826125c7565b610d1e5760405162461bcd60e51b8152600401610842906138b5565b6000828152600f6020526040902060060154610100900460ff1615610d855760405162461bcd60e51b815260206004820152601b60248201527f546f6b656e207368756f6c642062652072657365727665206f6e6500000000006044820152606401610842565b6000610d9083610ff5565b90506001600160a01b0381163314610dda5760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b21037bbb732b960991b6044820152606401610842565b6000600f60008581526020019081526020016000206040518061012001604052908160008201548152602001600182018054610e1590613aaf565b80601f0160208091040260200160405190810160405280929190818152602001828054610e4190613aaf565b8015610e8e5780601f10610e6357610100808354040283529160200191610e8e565b820191906000526020600020905b815481529060010190602001808311610e7157829003601f168201915b505050918352505060028201546001600160a01b0390811660208084019190915260038401548216604080850191909152600485015490921660608401526005840154608084015260069093015460ff808216151560a0808601919091526101008304909116151560c08501526201000090910461ffff1660e0909301929092529083018690526000878152600f8352208251815582820151805193945084939192610f429260018501929091019061336a565b5060408201516002820180546001600160a01b039283166001600160a01b0319918216179091556060840151600384018054918416918316919091179055608084015160048401805491909316911617905560a0820151600582015560c08201516006909101805460e08401516101009485015161ffff16620100000263ffff00001991151590950261ff00199415159490941661ffff1990921691909117929092179190911691909117905550505050565b6000818152600260205260408120546001600160a01b0316806107425760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610842565b6007546001600160a01b031633146110965760405162461bcd60e51b8152600401610842906137f8565b6040516001600160a01b038216904780156108fc02916000818181858888f193505050501580156110cb573d6000803e3d6000fd5b5050565b600980546110dc90613aaf565b80601f016020809104026020016040519081016040528092919081815260200182805461110890613aaf565b80156111555780601f1061112a57610100808354040283529160200191611155565b820191906000526020600020905b81548152906001019060200180831161113857829003601f168201915b505050505081565b60006001600160a01b0382166111c85760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610842565b506001600160a01b031660009081526003602052604090205490565b6007546001600160a01b0316331461120e5760405162461bcd60e51b8152600401610842906137f8565b61121860006128d8565b565b6007546001600160a01b031633146112445760405162461bcd60e51b8152600401610842906137f8565b600e80546001600160a01b0390921664010000000002640100000000600160c01b0319909216919091179055565b60606001805461075790613aaf565b6007546001600160a01b031633146112ab5760405162461bcd60e51b8152600401610842906137f8565b80516110cb90600990602084019061336a565b6110cb33838361292a565b336112e65760405162461bcd60e51b81526004016108429061382d565b6112ef816125c7565b61130b5760405162461bcd60e51b8152600401610842906138b5565b6000818152600f6020526040902060060154610100900460ff16156113725760405162461bcd60e51b815260206004820152601b60248201527f546f6b656e207368756f6c642062652072657365727665206f6e6500000000006044820152606401610842565b600061137d82610ff5565b90506001600160a01b03811633146113c75760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b21037bbb732b960991b6044820152606401610842565b6000600f6000848152602001908152602001600020604051806101200160405290816000820154815260200160018201805461140290613aaf565b80601f016020809104026020016040519081016040528092919081815260200182805461142e90613aaf565b801561147b5780601f106114505761010080835404028352916020019161147b565b820191906000526020600020905b81548152906001019060200180831161145e57829003601f168201915b505050918352505060028201546001600160a01b03908116602083015260038301548116604083015260048301541660608201526005820154608082015260069091015460ff808216151560a0840152610100820416151560c0808401919091526201000090910461ffff1660e0909201919091528101519091501561150757600060c082015261150f565b600160c08201525b6000838152600f60209081526040909120825181558183015180518493610c2a92600185019291019061336a565b604080516101208101825260008082526060602083018190529282018190529181018290526080810182905260a0810182905260c0810182905260e08101829052610100810191909152600f600083815260200190815260200160002060405180610120016040529081600082015481526020016001820180546115c090613aaf565b80601f01602080910402602001604051908101604052809291908181526020018280546115ec90613aaf565b80156116395780601f1061160e57610100808354040283529160200191611639565b820191906000526020600020905b81548152906001019060200180831161161c57829003601f168201915b505050918352505060028201546001600160a01b03908116602083015260038301548116604083015260048301541660608201526005820154608082015260069091015460ff808216151560a0840152610100820416151560c083015262010000900461ffff1660e09091015292915050565b600260085414156116ff5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610842565b60026008556012546001600160a01b0316331461175e5760405162461bcd60e51b815260206004820152601b60248201527f53686f756c64206265206f7065726174696f6e732077616c6c657400000000006044820152606401610842565b6000828152600f6020526040902060060154610100900460ff166117c45760405162461bcd60e51b815260206004820152601860248201527f546f6b656e207368756f6c64206265207769746868656c6400000000000000006044820152606401610842565b6001600160a01b03811661181a5760405162461bcd60e51b815260206004820152601c60248201527f4f776e65722063616e277420626520656d7074792061646472657373000000006044820152606401610842565b600061182583610ff5565b905061183281838561273c565b6000600f6000858152602001908152602001600020604051806101200160405290816000820154815260200160018201805461186d90613aaf565b80601f016020809104026020016040519081016040528092919081815260200182805461189990613aaf565b80156118e65780601f106118bb576101008083540402835291602001916118e6565b820191906000526020600020905b8154815290600101906020018083116118c957829003601f168201915b505050918352505060028201546001600160a01b039081166020808401919091526003840154821660408085019190915260048501548316606080860191909152600586015460808087019190915260069096015460ff808216151560a0880152610100820416151560c087015262010000900461ffff1660e09095019490945292850180518316948601949094529087169092526000878152600f83522082518155828201518051939450849391926119a89260018501929091019061336a565b5060408201516002820180546001600160a01b039283166001600160a01b0319918216179091556060840151600384018054918416918316919091179055608084015160048401805491909316911617905560a0820151600582015560c08201516006909101805460e08401516101009485015161ffff16620100000263ffff00001991151590950261ff00199415159490941661ffff19909216919091179290921791909116919091179055505060016008555050565b611a6a3383612652565b611a865760405162461bcd60e51b815260040161084290613864565b611a92848484846129f9565b50505050565b60026008541415611aeb5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610842565b600260085533611b0d5760405162461bcd60e51b81526004016108429061382d565b611b16816125c7565b611b325760405162461bcd60e51b8152600401610842906138b5565b6000611b3d82610ff5565b90506001600160a01b038116611b955760405162461bcd60e51b815260206004820152601c60248201527f4f776e65722063616e277420626520656d7074792061646472657373000000006044820152606401610842565b6000828152600f6020526040902060060154610100900460ff1615611bfc5760405162461bcd60e51b815260206004820152601c60248201527f546f6b656e207368756f6c64206e6f74206265207769746868656c64000000006044820152606401610842565b6001600160a01b038116331415611c4a5760405162461bcd60e51b815260206004820152601260248201527129b437bab6323713ba1031329037bbb732b960711b6044820152606401610842565b6000600f60008481526020019081526020016000206040518061012001604052908160008201548152602001600182018054611c8590613aaf565b80601f0160208091040260200160405190810160405280929190818152602001828054611cb190613aaf565b8015611cfe5780601f10611cd357610100808354040283529160200191611cfe565b820191906000526020600020905b815481529060010190602001808311611ce157829003601f168201915b505050918352505060028201546001600160a01b03908116602083015260038301548116604083015260048301541660608201526005820154608082015260069091015460ff808216151560a0808501919091526101008304909116151560c08401526201000090910461ffff1660e0909201919091528101519091503414611dc15760405162461bcd60e51b8152602060048201526015602482015274115d1a195c881d985b1d59481a5b98dbdc9c9958dd605a1b6044820152606401610842565b8060c00151611e0a5760405162461bcd60e51b8152602060048201526015602482015274546f6b656e206973206e6f7420666f722073616c6560581b6044820152606401610842565b6012546001600160a01b0316331415611e655760405162461bcd60e51b815260206004820152601e60248201527f53686f756c646e2774206265206f7065726174696f6e732077616c6c657400006044820152606401610842565b80606001516001600160a01b03166108fc600a8360a001516009611e899190613a2a565b611e939190613a16565b6040518115909202916000818181858888f19350505050158015611ebb573d6000803e3d6000fd5b50611ed5600a8260a00151611ed09190613a16565b612a2c565b611ee082338561273c565b6060810180516001600160a01b031660808301523390526000838152600f60209081526040909120825181558183015180518493611f2592600185019291019061336a565b5060408201516002820180546001600160a01b039283166001600160a01b0319918216179091556060840151600384018054918416918316919091179055608084015160048401805491909316911617905560a0820151600582015560c08201516006909101805460e08401516101009485015161ffff16620100000263ffff00001991151590950261ff00199415159490941661ffff199092169190911792909217919091169190911790555050600160085550565b606061074282612cfc565b600f602052600090815260409020805460018201805491929161200990613aaf565b80601f016020809104026020016040519081016040528092919081815260200182805461203590613aaf565b80156120825780601f1061205757610100808354040283529160200191612082565b820191906000526020600020905b81548152906001019060200180831161206557829003601f168201915b505050600284015460038501546004860154600587015460069097015495966001600160a01b039384169692841695509216925060ff8082169161010081049091169061ffff620100009091041689565b6012546001600160a01b031633141561229e576000600c541161212a5760405162461bcd60e51b815260206004820152600f60248201526e14dd5c1c1b1e48195e18d959591959608a1b6044820152606401610842565b61213633600a54612e5e565b612142600a5482612e78565b6001600c60008282546121559190613a6c565b90915550506040805161012081018252600a54808252602080830185815233848601819052606085015260006080850181905260a0850181905260c08501819052600160e086018190526005610100870152938152600f83529490942083518155935180519394859490936121cf9390850192019061336a565b5060408201516002820180546001600160a01b039283166001600160a01b0319918216179091556060840151600384018054918416918316919091179055608084015160048401805491909316911617905560a0820151600582015560c08201516006909101805460e08401516101009485015161ffff16620100000263ffff00001991151590950261ff00199415159490941661ffff19909216919091179290921791909116919091179055600a8054600191906000906122929084906139fe565b9091555061252c915050565b6000600b54116122e25760405162461bcd60e51b815260206004820152600f60248201526e14dd5c1c1b1e48195e18d959591959608a1b6044820152606401610842565b60115433600090815260106020526040902054106123425760405162461bcd60e51b815260206004820152601960248201527f436f756e74207065722077616c6c6574206578636565646564000000000000006044820152606401610842565b600d54341461238b5760405162461bcd60e51b8152602060048201526015602482015274115d1a195c881d985b1d59481a5b98dbdc9c9958dd605a1b6044820152606401610842565b61239733600a54612e5e565b6123a3600a5482612e78565b3360009081526010602052604081208054600192906123c39084906139fe565b925050819055506001600b60008282546123dd9190613a6c565b90915550506040805161012081018252600a548082526020808301858152338486018190526060850152600060808501819052600d5460a086015260c0850181905260e085018190526005610100860152928352600f825293909120825181559251805192938493909261245892600185019291019061336a565b5060408201516002820180546001600160a01b039283166001600160a01b0319918216179091556060840151600384018054918416918316919091179055608084015160048401805491909316911617905560a0820151600582015560c08201516006909101805460e08401516101009485015161ffff16620100000263ffff00001991151590950261ff00199415159490941661ffff19909216919091179290921791909116919091179055600a80546001919060009061251b9084906139fe565b9091555050600d546110cb90612a2c565b50565b6007546001600160a01b031633146125595760405162461bcd60e51b8152600401610842906137f8565b6001600160a01b0381166125be5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610842565b61252c816128d8565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061261982610ff5565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061265d826125c7565b6126be5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610842565b60006126c983610ff5565b9050806001600160a01b0316846001600160a01b0316148061271057506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b806127345750836001600160a01b0316612729846107da565b6001600160a01b0316145b949350505050565b826001600160a01b031661274f82610ff5565b6001600160a01b0316146127b35760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610842565b6001600160a01b0382166128155760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610842565b6128206000826125e4565b6001600160a01b0383166000908152600360205260408120805460019290612849908490613a6c565b90915550506001600160a01b03821660009081526003602052604081208054600192906128779084906139fe565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b0316141561298c5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610842565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b612a0484848461273c565b612a1084848484612f03565b611a925760405162461bcd60e51b8152600401610842906137a6565b601254600e546001600160a01b03909116906108fc9063ffffffff16612a53846096613a2a565b612a5d9190613a16565b6040518115909202916000818181858888f19350505050158015612a85573d6000803e3d6000fd5b50601354600e546001600160a01b03909116906108fc9063ffffffff16612aad846028613a2a565b612ab79190613a16565b6040518115909202916000818181858888f19350505050158015612adf573d6000803e3d6000fd5b50601454600e546001600160a01b03909116906108fc9063ffffffff16612b07846028613a2a565b612b119190613a16565b6040518115909202916000818181858888f19350505050158015612b39573d6000803e3d6000fd5b50601554600e546001600160a01b03909116906108fc9063ffffffff16612b61846014613a2a565b612b6b9190613a16565b6040518115909202916000818181858888f19350505050158015612b93573d6000803e3d6000fd5b50601654600e546001600160a01b03909116906108fc9063ffffffff16612bbb8460c8613a2a565b612bc59190613a16565b6040518115909202916000818181858888f19350505050158015612bed573d6000803e3d6000fd5b50601754600e546001600160a01b03909116906108fc9063ffffffff16612c15846064613a2a565b612c1f9190613a16565b6040518115909202916000818181858888f19350505050158015612c47573d6000803e3d6000fd5b50601854600e546001600160a01b03909116906108fc9063ffffffff16612c7084610190613a2a565b612c7a9190613a16565b6040518115909202916000818181858888f19350505050158015612ca2573d6000803e3d6000fd5b50601954600e546001600160a01b03909116906108fc9063ffffffff16612cca846032613a2a565b612cd49190613a16565b6040518115909202916000818181858888f193505050501580156110cb573d6000803e3d6000fd5b6060612d07826125c7565b612d6d5760405162461bcd60e51b815260206004820152603160248201527f45524337323155524953746f726167653a2055524920717565727920666f72206044820152703737b732bc34b9ba32b73a103a37b5b2b760791b6064820152608401610842565b60008281526006602052604081208054612d8690613aaf565b80601f0160208091040260200160405190810160405280929190818152602001828054612db290613aaf565b8015612dff5780601f10612dd457610100808354040283529160200191612dff565b820191906000526020600020905b815481529060010190602001808311612de257829003601f168201915b505050505090506000612e10613010565b9050805160001415612e23575092915050565b815115612e55578082604051602001612e3d929190613727565b60405160208183030381529060405292505050919050565b6127348461301f565b6110cb8282604051806020016040528060008152506130ea565b612e81826125c7565b612ee45760405162461bcd60e51b815260206004820152602e60248201527f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60448201526d32bc34b9ba32b73a103a37b5b2b760911b6064820152608401610842565b600082815260066020908152604090912082516109789284019061336a565b60006001600160a01b0384163b1561300557604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612f47903390899088908890600401613756565b602060405180830381600087803b158015612f6157600080fd5b505af1925050508015612f91575060408051601f3d908101601f19168201909252612f8e91810190613614565b60015b612feb573d808015612fbf576040519150601f19603f3d011682016040523d82523d6000602084013e612fc4565b606091505b508051612fe35760405162461bcd60e51b8152600401610842906137a6565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612734565b506001949350505050565b60606009805461075790613aaf565b606061302a826125c7565b61308e5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610842565b6000613098613010565b905060008151116130b857604051806020016040528060008152506130e3565b806130c28461311d565b6040516020016130d3929190613727565b6040516020818303038152906040525b9392505050565b6130f48383613237565b6131016000848484612f03565b6109785760405162461bcd60e51b8152600401610842906137a6565b6060816131415750506040805180820190915260018152600360fc1b602082015290565b8160005b811561316b578061315581613aea565b91506131649050600a83613a16565b9150613145565b60008167ffffffffffffffff81111561319457634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156131be576020820181803683370190505b5090505b8415612734576131d3600183613a6c565b91506131e0600a86613b05565b6131eb9060306139fe565b60f81b81838151811061320e57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350613230600a86613a16565b94506131c2565b6001600160a01b03821661328d5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610842565b613296816125c7565b156132e35760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610842565b6001600160a01b038216600090815260036020526040812080546001929061330c9084906139fe565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b82805461337690613aaf565b90600052602060002090601f01602090048101928261339857600085556133de565b82601f106133b157805160ff19168380011785556133de565b828001600101855582156133de579182015b828111156133de5782518255916020019190600101906133c3565b506133ea9291506133ee565b5090565b5b808211156133ea57600081556001016133ef565b600067ffffffffffffffff8084111561341e5761341e613b45565b604051601f8501601f19908116603f0116810190828211818310171561344657613446613b45565b8160405280935085815286868601111561345f57600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b038116811461349057600080fd5b919050565b6000602082840312156134a6578081fd5b6130e382613479565b600080604083850312156134c1578081fd5b6134ca83613479565b91506134d860208401613479565b90509250929050565b6000806000606084860312156134f5578081fd5b6134fe84613479565b925061350c60208501613479565b9150604084013590509250925092565b60008060008060808587031215613531578081fd5b61353a85613479565b935061354860208601613479565b925060408501359150606085013567ffffffffffffffff81111561356a578182fd5b8501601f8101871361357a578182fd5b61358987823560208401613403565b91505092959194509250565b600080604083850312156135a7578182fd5b6135b083613479565b9150602083013580151581146135c4578182fd5b809150509250929050565b600080604083850312156135e1578182fd5b6135ea83613479565b946020939093013593505050565b600060208284031215613609578081fd5b81356130e381613b5b565b600060208284031215613625578081fd5b81516130e381613b5b565b600060208284031215613641578081fd5b813567ffffffffffffffff811115613657578182fd5b8201601f81018413613667578182fd5b61273484823560208401613403565b600060208284031215613687578081fd5b5035919050565b600080604083850312156136a0578182fd5b823591506134d860208401613479565b600080604083850312156136c2578182fd5b82359150602083013561ffff811681146135c4578182fd5b600080604083850312156136ec578182fd5b50508035926020909101359150565b60008151808452613713816020860160208601613a83565b601f01601f19169290920160200192915050565b60008351613739818460208801613a83565b83519083019061374d818360208801613a83565b01949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613789908301846136fb565b9695505050505050565b6020815260006130e360208301846136fb565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601a908201527f53686f756c646e277420626520656d7074792061646472657373000000000000604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252600f908201526e151bdad95b881b9bdd08195e1a5cdd608a1b604082015260600190565b6020815281516020820152600060208301516101208060408501526139076101408501836136fb565b9150604085015161392360608601826001600160a01b03169052565b5060608501516001600160a01b03811660808601525060808501516001600160a01b03811660a08601525060a085015160c085015260c085015161396b60e086018215159052565b5060e08501516101006139818187018315159052565b9095015161ffff1693019290925250919050565b60006101208b83528060208401526139af8184018c6136fb565b6001600160a01b039a8b166040850152988a166060840152505094909616608085015260a0840192909252151560c0830152151560e082015261ffff9092166101009092019190915292915050565b60008219821115613a1157613a11613b19565b500190565b600082613a2557613a25613b2f565b500490565b6000816000190483118215151615613a4457613a44613b19565b500290565b600061ffff83811690831681811015613a6457613a64613b19565b039392505050565b600082821015613a7e57613a7e613b19565b500390565b60005b83811015613a9e578181015183820152602001613a86565b83811115611a925750506000910152565b600181811c90821680613ac357607f821691505b60208210811415613ae457634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415613afe57613afe613b19565b5060010190565b600082613b1457613b14613b2f565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461252c57600080fdfea264697066735822122020860a45cad9447c3d347123823e98ce54f0d11f2c0720d8eb4af9ff0b5076a864736f6c63430008040033

Deployed Bytecode

0x60806040526004361061021a5760003560e01c8063785d783f11610123578063b09afec1116100ab578063d7c0eec31161006f578063d7c0eec31461062f578063d85d3d2714610664578063e985e9c514610677578063f2fde38b146106c0578063f74f9bfd146106e057600080fd5b8063b09afec11461058f578063b56b0449146105bc578063b88d4fde146105dc578063c2db2c42146105fc578063c87b56dd1461060f57600080fd5b806396ce0795116100f257806396ce0795146104e75780639f5215dd14610519578063a0bcfc7f1461052f578063a22cb4651461054f578063a32018b91461056f57600080fd5b8063785d783f1461047e5780638da5cb5b146104945780638fb58285146104b257806395d89b41146104d257600080fd5b8063492f534b116101a65780636817c76c116101755780636817c76c146103fe57806368742da6146104145780636c0360eb1461043457806370a0823114610449578063715018a61461046957600080fd5b8063492f534b146103765780634a7ffcbc1461039657806362e8e8ac146103be5780636352211e146103de57600080fd5b8063095ea7b3116101ed578063095ea7b3146102d2578063145f798f146102f457806323b872dd1461032157806330cbc1451461034157806342842e0e1461035657600080fd5b806301ffc9a71461021f57806303a028181461025457806306fdde0314610278578063081812fc1461029a575b600080fd5b34801561022b57600080fd5b5061023f61023a3660046135f8565b6106f6565b60405190151581526020015b60405180910390f35b34801561026057600080fd5b5061026a60115481565b60405190815260200161024b565b34801561028457600080fd5b5061028d610748565b60405161024b9190613793565b3480156102a657600080fd5b506102ba6102b5366004613676565b6107da565b6040516001600160a01b03909116815260200161024b565b3480156102de57600080fd5b506102f26102ed3660046135cf565b610867565b005b34801561030057600080fd5b5061026a61030f366004613495565b60106020526000908152604090205481565b34801561032d57600080fd5b506102f261033c3660046134e1565b61097d565b34801561034d57600080fd5b50600a5461026a565b34801561036257600080fd5b506102f26103713660046134e1565b6109ae565b34801561038257600080fd5b506102f26103913660046136b0565b6109c9565b3480156103a257600080fd5b50600e546102ba9064010000000090046001600160a01b031681565b3480156103ca57600080fd5b506102f26103d93660046136da565b610cdc565b3480156103ea57600080fd5b506102ba6103f9366004613676565b610ff5565b34801561040a57600080fd5b5061026a600d5481565b34801561042057600080fd5b506102f261042f366004613495565b61106c565b34801561044057600080fd5b5061028d6110cf565b34801561045557600080fd5b5061026a610464366004613495565b61115d565b34801561047557600080fd5b506102f26111e4565b34801561048a57600080fd5b5061026a600c5481565b3480156104a057600080fd5b506007546001600160a01b03166102ba565b3480156104be57600080fd5b506102f26104cd366004613495565b61121a565b3480156104de57600080fd5b5061028d611272565b3480156104f357600080fd5b50600e546105049063ffffffff1681565b60405163ffffffff909116815260200161024b565b34801561052557600080fd5b5061026a600b5481565b34801561053b57600080fd5b506102f261054a366004613630565b611281565b34801561055b57600080fd5b506102f261056a366004613595565b6112be565b34801561057b57600080fd5b506102f261058a366004613676565b6112c9565b34801561059b57600080fd5b506105af6105aa366004613676565b61153d565b60405161024b91906138de565b3480156105c857600080fd5b506102f26105d736600461368e565b6116ac565b3480156105e857600080fd5b506102f26105f736600461351c565b611a60565b6102f261060a366004613676565b611a98565b34801561061b57600080fd5b5061028d61062a366004613676565b611fdc565b34801561063b57600080fd5b5061064f61064a366004613676565b611fe7565b60405161024b99989796959493929190613995565b6102f2610672366004613630565b6120d3565b34801561068357600080fd5b5061023f6106923660046134af565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156106cc57600080fd5b506102f26106db366004613495565b61252f565b3480156106ec57600080fd5b5061026a600a5481565b60006001600160e01b031982166380ac58cd60e01b148061072757506001600160e01b03198216635b5e139f60e01b145b8061074257506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606000805461075790613aaf565b80601f016020809104026020016040519081016040528092919081815260200182805461078390613aaf565b80156107d05780601f106107a5576101008083540402835291602001916107d0565b820191906000526020600020905b8154815290600101906020018083116107b357829003601f168201915b5050505050905090565b60006107e5826125c7565b61084b5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061087282610ff5565b9050806001600160a01b0316836001600160a01b031614156108e05760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610842565b336001600160a01b03821614806108fc57506108fc8133610692565b61096e5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610842565b61097883836125e4565b505050565b6109873382612652565b6109a35760405162461bcd60e51b815260040161084290613864565b61097883838361273c565b61097883838360405180602001604052806000815250611a60565b336109e65760405162461bcd60e51b81526004016108429061382d565b600e5464010000000090046001600160a01b03163314610a415760405162461bcd60e51b815260206004820152601660248201527514da1bdd5b1908189948111053c818dbdb9d1c9858dd60521b6044820152606401610842565b6000600f60008481526020019081526020016000206040518061012001604052908160008201548152602001600182018054610a7c90613aaf565b80601f0160208091040260200160405190810160405280929190818152602001828054610aa890613aaf565b8015610af55780601f10610aca57610100808354040283529160200191610af5565b820191906000526020600020905b815481529060010190602001808311610ad857829003601f168201915b505050918352505060028201546001600160a01b03908116602083015260038301548116604083015260048301541660608201526005820154608082015260069091015460ff808216151560a0840152610100808304909116151560c084015261ffff62010000909204821660e0909301929092529082015191925083811691161015610be25760405162461bcd60e51b815260206004820152603560248201527f4c65667420656e74726965732073686f756c646e277420626520736d616c6c656044820152741c881d1a185b88191958dc99585cd94818dbdd5b9d605a1b6064820152608401610842565b818161010001818151610bf59190613a49565b61ffff169052506000838152600f60209081526040909120825181558183015180518493610c2a92600185019291019061336a565b5060408201516002820180546001600160a01b039283166001600160a01b0319918216179091556060840151600384018054918416918316919091179055608084015160048401805491909316911617905560a0820151600582015560c08201516006909101805460e08401516101009485015161ffff16620100000263ffff00001991151590950261ff00199415159490941661ffff19909216919091179290921791909116919091179055505050565b33610cf95760405162461bcd60e51b81526004016108429061382d565b610d02826125c7565b610d1e5760405162461bcd60e51b8152600401610842906138b5565b6000828152600f6020526040902060060154610100900460ff1615610d855760405162461bcd60e51b815260206004820152601b60248201527f546f6b656e207368756f6c642062652072657365727665206f6e6500000000006044820152606401610842565b6000610d9083610ff5565b90506001600160a01b0381163314610dda5760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b21037bbb732b960991b6044820152606401610842565b6000600f60008581526020019081526020016000206040518061012001604052908160008201548152602001600182018054610e1590613aaf565b80601f0160208091040260200160405190810160405280929190818152602001828054610e4190613aaf565b8015610e8e5780601f10610e6357610100808354040283529160200191610e8e565b820191906000526020600020905b815481529060010190602001808311610e7157829003601f168201915b505050918352505060028201546001600160a01b0390811660208084019190915260038401548216604080850191909152600485015490921660608401526005840154608084015260069093015460ff808216151560a0808601919091526101008304909116151560c08501526201000090910461ffff1660e0909301929092529083018690526000878152600f8352208251815582820151805193945084939192610f429260018501929091019061336a565b5060408201516002820180546001600160a01b039283166001600160a01b0319918216179091556060840151600384018054918416918316919091179055608084015160048401805491909316911617905560a0820151600582015560c08201516006909101805460e08401516101009485015161ffff16620100000263ffff00001991151590950261ff00199415159490941661ffff1990921691909117929092179190911691909117905550505050565b6000818152600260205260408120546001600160a01b0316806107425760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610842565b6007546001600160a01b031633146110965760405162461bcd60e51b8152600401610842906137f8565b6040516001600160a01b038216904780156108fc02916000818181858888f193505050501580156110cb573d6000803e3d6000fd5b5050565b600980546110dc90613aaf565b80601f016020809104026020016040519081016040528092919081815260200182805461110890613aaf565b80156111555780601f1061112a57610100808354040283529160200191611155565b820191906000526020600020905b81548152906001019060200180831161113857829003601f168201915b505050505081565b60006001600160a01b0382166111c85760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610842565b506001600160a01b031660009081526003602052604090205490565b6007546001600160a01b0316331461120e5760405162461bcd60e51b8152600401610842906137f8565b61121860006128d8565b565b6007546001600160a01b031633146112445760405162461bcd60e51b8152600401610842906137f8565b600e80546001600160a01b0390921664010000000002640100000000600160c01b0319909216919091179055565b60606001805461075790613aaf565b6007546001600160a01b031633146112ab5760405162461bcd60e51b8152600401610842906137f8565b80516110cb90600990602084019061336a565b6110cb33838361292a565b336112e65760405162461bcd60e51b81526004016108429061382d565b6112ef816125c7565b61130b5760405162461bcd60e51b8152600401610842906138b5565b6000818152600f6020526040902060060154610100900460ff16156113725760405162461bcd60e51b815260206004820152601b60248201527f546f6b656e207368756f6c642062652072657365727665206f6e6500000000006044820152606401610842565b600061137d82610ff5565b90506001600160a01b03811633146113c75760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b21037bbb732b960991b6044820152606401610842565b6000600f6000848152602001908152602001600020604051806101200160405290816000820154815260200160018201805461140290613aaf565b80601f016020809104026020016040519081016040528092919081815260200182805461142e90613aaf565b801561147b5780601f106114505761010080835404028352916020019161147b565b820191906000526020600020905b81548152906001019060200180831161145e57829003601f168201915b505050918352505060028201546001600160a01b03908116602083015260038301548116604083015260048301541660608201526005820154608082015260069091015460ff808216151560a0840152610100820416151560c0808401919091526201000090910461ffff1660e0909201919091528101519091501561150757600060c082015261150f565b600160c08201525b6000838152600f60209081526040909120825181558183015180518493610c2a92600185019291019061336a565b604080516101208101825260008082526060602083018190529282018190529181018290526080810182905260a0810182905260c0810182905260e08101829052610100810191909152600f600083815260200190815260200160002060405180610120016040529081600082015481526020016001820180546115c090613aaf565b80601f01602080910402602001604051908101604052809291908181526020018280546115ec90613aaf565b80156116395780601f1061160e57610100808354040283529160200191611639565b820191906000526020600020905b81548152906001019060200180831161161c57829003601f168201915b505050918352505060028201546001600160a01b03908116602083015260038301548116604083015260048301541660608201526005820154608082015260069091015460ff808216151560a0840152610100820416151560c083015262010000900461ffff1660e09091015292915050565b600260085414156116ff5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610842565b60026008556012546001600160a01b0316331461175e5760405162461bcd60e51b815260206004820152601b60248201527f53686f756c64206265206f7065726174696f6e732077616c6c657400000000006044820152606401610842565b6000828152600f6020526040902060060154610100900460ff166117c45760405162461bcd60e51b815260206004820152601860248201527f546f6b656e207368756f6c64206265207769746868656c6400000000000000006044820152606401610842565b6001600160a01b03811661181a5760405162461bcd60e51b815260206004820152601c60248201527f4f776e65722063616e277420626520656d7074792061646472657373000000006044820152606401610842565b600061182583610ff5565b905061183281838561273c565b6000600f6000858152602001908152602001600020604051806101200160405290816000820154815260200160018201805461186d90613aaf565b80601f016020809104026020016040519081016040528092919081815260200182805461189990613aaf565b80156118e65780601f106118bb576101008083540402835291602001916118e6565b820191906000526020600020905b8154815290600101906020018083116118c957829003601f168201915b505050918352505060028201546001600160a01b039081166020808401919091526003840154821660408085019190915260048501548316606080860191909152600586015460808087019190915260069096015460ff808216151560a0880152610100820416151560c087015262010000900461ffff1660e09095019490945292850180518316948601949094529087169092526000878152600f83522082518155828201518051939450849391926119a89260018501929091019061336a565b5060408201516002820180546001600160a01b039283166001600160a01b0319918216179091556060840151600384018054918416918316919091179055608084015160048401805491909316911617905560a0820151600582015560c08201516006909101805460e08401516101009485015161ffff16620100000263ffff00001991151590950261ff00199415159490941661ffff19909216919091179290921791909116919091179055505060016008555050565b611a6a3383612652565b611a865760405162461bcd60e51b815260040161084290613864565b611a92848484846129f9565b50505050565b60026008541415611aeb5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610842565b600260085533611b0d5760405162461bcd60e51b81526004016108429061382d565b611b16816125c7565b611b325760405162461bcd60e51b8152600401610842906138b5565b6000611b3d82610ff5565b90506001600160a01b038116611b955760405162461bcd60e51b815260206004820152601c60248201527f4f776e65722063616e277420626520656d7074792061646472657373000000006044820152606401610842565b6000828152600f6020526040902060060154610100900460ff1615611bfc5760405162461bcd60e51b815260206004820152601c60248201527f546f6b656e207368756f6c64206e6f74206265207769746868656c64000000006044820152606401610842565b6001600160a01b038116331415611c4a5760405162461bcd60e51b815260206004820152601260248201527129b437bab6323713ba1031329037bbb732b960711b6044820152606401610842565b6000600f60008481526020019081526020016000206040518061012001604052908160008201548152602001600182018054611c8590613aaf565b80601f0160208091040260200160405190810160405280929190818152602001828054611cb190613aaf565b8015611cfe5780601f10611cd357610100808354040283529160200191611cfe565b820191906000526020600020905b815481529060010190602001808311611ce157829003601f168201915b505050918352505060028201546001600160a01b03908116602083015260038301548116604083015260048301541660608201526005820154608082015260069091015460ff808216151560a0808501919091526101008304909116151560c08401526201000090910461ffff1660e0909201919091528101519091503414611dc15760405162461bcd60e51b8152602060048201526015602482015274115d1a195c881d985b1d59481a5b98dbdc9c9958dd605a1b6044820152606401610842565b8060c00151611e0a5760405162461bcd60e51b8152602060048201526015602482015274546f6b656e206973206e6f7420666f722073616c6560581b6044820152606401610842565b6012546001600160a01b0316331415611e655760405162461bcd60e51b815260206004820152601e60248201527f53686f756c646e2774206265206f7065726174696f6e732077616c6c657400006044820152606401610842565b80606001516001600160a01b03166108fc600a8360a001516009611e899190613a2a565b611e939190613a16565b6040518115909202916000818181858888f19350505050158015611ebb573d6000803e3d6000fd5b50611ed5600a8260a00151611ed09190613a16565b612a2c565b611ee082338561273c565b6060810180516001600160a01b031660808301523390526000838152600f60209081526040909120825181558183015180518493611f2592600185019291019061336a565b5060408201516002820180546001600160a01b039283166001600160a01b0319918216179091556060840151600384018054918416918316919091179055608084015160048401805491909316911617905560a0820151600582015560c08201516006909101805460e08401516101009485015161ffff16620100000263ffff00001991151590950261ff00199415159490941661ffff199092169190911792909217919091169190911790555050600160085550565b606061074282612cfc565b600f602052600090815260409020805460018201805491929161200990613aaf565b80601f016020809104026020016040519081016040528092919081815260200182805461203590613aaf565b80156120825780601f1061205757610100808354040283529160200191612082565b820191906000526020600020905b81548152906001019060200180831161206557829003601f168201915b505050600284015460038501546004860154600587015460069097015495966001600160a01b039384169692841695509216925060ff8082169161010081049091169061ffff620100009091041689565b6012546001600160a01b031633141561229e576000600c541161212a5760405162461bcd60e51b815260206004820152600f60248201526e14dd5c1c1b1e48195e18d959591959608a1b6044820152606401610842565b61213633600a54612e5e565b612142600a5482612e78565b6001600c60008282546121559190613a6c565b90915550506040805161012081018252600a54808252602080830185815233848601819052606085015260006080850181905260a0850181905260c08501819052600160e086018190526005610100870152938152600f83529490942083518155935180519394859490936121cf9390850192019061336a565b5060408201516002820180546001600160a01b039283166001600160a01b0319918216179091556060840151600384018054918416918316919091179055608084015160048401805491909316911617905560a0820151600582015560c08201516006909101805460e08401516101009485015161ffff16620100000263ffff00001991151590950261ff00199415159490941661ffff19909216919091179290921791909116919091179055600a8054600191906000906122929084906139fe565b9091555061252c915050565b6000600b54116122e25760405162461bcd60e51b815260206004820152600f60248201526e14dd5c1c1b1e48195e18d959591959608a1b6044820152606401610842565b60115433600090815260106020526040902054106123425760405162461bcd60e51b815260206004820152601960248201527f436f756e74207065722077616c6c6574206578636565646564000000000000006044820152606401610842565b600d54341461238b5760405162461bcd60e51b8152602060048201526015602482015274115d1a195c881d985b1d59481a5b98dbdc9c9958dd605a1b6044820152606401610842565b61239733600a54612e5e565b6123a3600a5482612e78565b3360009081526010602052604081208054600192906123c39084906139fe565b925050819055506001600b60008282546123dd9190613a6c565b90915550506040805161012081018252600a548082526020808301858152338486018190526060850152600060808501819052600d5460a086015260c0850181905260e085018190526005610100860152928352600f825293909120825181559251805192938493909261245892600185019291019061336a565b5060408201516002820180546001600160a01b039283166001600160a01b0319918216179091556060840151600384018054918416918316919091179055608084015160048401805491909316911617905560a0820151600582015560c08201516006909101805460e08401516101009485015161ffff16620100000263ffff00001991151590950261ff00199415159490941661ffff19909216919091179290921791909116919091179055600a80546001919060009061251b9084906139fe565b9091555050600d546110cb90612a2c565b50565b6007546001600160a01b031633146125595760405162461bcd60e51b8152600401610842906137f8565b6001600160a01b0381166125be5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610842565b61252c816128d8565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061261982610ff5565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061265d826125c7565b6126be5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610842565b60006126c983610ff5565b9050806001600160a01b0316846001600160a01b0316148061271057506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b806127345750836001600160a01b0316612729846107da565b6001600160a01b0316145b949350505050565b826001600160a01b031661274f82610ff5565b6001600160a01b0316146127b35760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610842565b6001600160a01b0382166128155760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610842565b6128206000826125e4565b6001600160a01b0383166000908152600360205260408120805460019290612849908490613a6c565b90915550506001600160a01b03821660009081526003602052604081208054600192906128779084906139fe565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b0316141561298c5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610842565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b612a0484848461273c565b612a1084848484612f03565b611a925760405162461bcd60e51b8152600401610842906137a6565b601254600e546001600160a01b03909116906108fc9063ffffffff16612a53846096613a2a565b612a5d9190613a16565b6040518115909202916000818181858888f19350505050158015612a85573d6000803e3d6000fd5b50601354600e546001600160a01b03909116906108fc9063ffffffff16612aad846028613a2a565b612ab79190613a16565b6040518115909202916000818181858888f19350505050158015612adf573d6000803e3d6000fd5b50601454600e546001600160a01b03909116906108fc9063ffffffff16612b07846028613a2a565b612b119190613a16565b6040518115909202916000818181858888f19350505050158015612b39573d6000803e3d6000fd5b50601554600e546001600160a01b03909116906108fc9063ffffffff16612b61846014613a2a565b612b6b9190613a16565b6040518115909202916000818181858888f19350505050158015612b93573d6000803e3d6000fd5b50601654600e546001600160a01b03909116906108fc9063ffffffff16612bbb8460c8613a2a565b612bc59190613a16565b6040518115909202916000818181858888f19350505050158015612bed573d6000803e3d6000fd5b50601754600e546001600160a01b03909116906108fc9063ffffffff16612c15846064613a2a565b612c1f9190613a16565b6040518115909202916000818181858888f19350505050158015612c47573d6000803e3d6000fd5b50601854600e546001600160a01b03909116906108fc9063ffffffff16612c7084610190613a2a565b612c7a9190613a16565b6040518115909202916000818181858888f19350505050158015612ca2573d6000803e3d6000fd5b50601954600e546001600160a01b03909116906108fc9063ffffffff16612cca846032613a2a565b612cd49190613a16565b6040518115909202916000818181858888f193505050501580156110cb573d6000803e3d6000fd5b6060612d07826125c7565b612d6d5760405162461bcd60e51b815260206004820152603160248201527f45524337323155524953746f726167653a2055524920717565727920666f72206044820152703737b732bc34b9ba32b73a103a37b5b2b760791b6064820152608401610842565b60008281526006602052604081208054612d8690613aaf565b80601f0160208091040260200160405190810160405280929190818152602001828054612db290613aaf565b8015612dff5780601f10612dd457610100808354040283529160200191612dff565b820191906000526020600020905b815481529060010190602001808311612de257829003601f168201915b505050505090506000612e10613010565b9050805160001415612e23575092915050565b815115612e55578082604051602001612e3d929190613727565b60405160208183030381529060405292505050919050565b6127348461301f565b6110cb8282604051806020016040528060008152506130ea565b612e81826125c7565b612ee45760405162461bcd60e51b815260206004820152602e60248201527f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60448201526d32bc34b9ba32b73a103a37b5b2b760911b6064820152608401610842565b600082815260066020908152604090912082516109789284019061336a565b60006001600160a01b0384163b1561300557604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612f47903390899088908890600401613756565b602060405180830381600087803b158015612f6157600080fd5b505af1925050508015612f91575060408051601f3d908101601f19168201909252612f8e91810190613614565b60015b612feb573d808015612fbf576040519150601f19603f3d011682016040523d82523d6000602084013e612fc4565b606091505b508051612fe35760405162461bcd60e51b8152600401610842906137a6565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612734565b506001949350505050565b60606009805461075790613aaf565b606061302a826125c7565b61308e5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610842565b6000613098613010565b905060008151116130b857604051806020016040528060008152506130e3565b806130c28461311d565b6040516020016130d3929190613727565b6040516020818303038152906040525b9392505050565b6130f48383613237565b6131016000848484612f03565b6109785760405162461bcd60e51b8152600401610842906137a6565b6060816131415750506040805180820190915260018152600360fc1b602082015290565b8160005b811561316b578061315581613aea565b91506131649050600a83613a16565b9150613145565b60008167ffffffffffffffff81111561319457634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156131be576020820181803683370190505b5090505b8415612734576131d3600183613a6c565b91506131e0600a86613b05565b6131eb9060306139fe565b60f81b81838151811061320e57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350613230600a86613a16565b94506131c2565b6001600160a01b03821661328d5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610842565b613296816125c7565b156132e35760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610842565b6001600160a01b038216600090815260036020526040812080546001929061330c9084906139fe565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b82805461337690613aaf565b90600052602060002090601f01602090048101928261339857600085556133de565b82601f106133b157805160ff19168380011785556133de565b828001600101855582156133de579182015b828111156133de5782518255916020019190600101906133c3565b506133ea9291506133ee565b5090565b5b808211156133ea57600081556001016133ef565b600067ffffffffffffffff8084111561341e5761341e613b45565b604051601f8501601f19908116603f0116810190828211818310171561344657613446613b45565b8160405280935085815286868601111561345f57600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b038116811461349057600080fd5b919050565b6000602082840312156134a6578081fd5b6130e382613479565b600080604083850312156134c1578081fd5b6134ca83613479565b91506134d860208401613479565b90509250929050565b6000806000606084860312156134f5578081fd5b6134fe84613479565b925061350c60208501613479565b9150604084013590509250925092565b60008060008060808587031215613531578081fd5b61353a85613479565b935061354860208601613479565b925060408501359150606085013567ffffffffffffffff81111561356a578182fd5b8501601f8101871361357a578182fd5b61358987823560208401613403565b91505092959194509250565b600080604083850312156135a7578182fd5b6135b083613479565b9150602083013580151581146135c4578182fd5b809150509250929050565b600080604083850312156135e1578182fd5b6135ea83613479565b946020939093013593505050565b600060208284031215613609578081fd5b81356130e381613b5b565b600060208284031215613625578081fd5b81516130e381613b5b565b600060208284031215613641578081fd5b813567ffffffffffffffff811115613657578182fd5b8201601f81018413613667578182fd5b61273484823560208401613403565b600060208284031215613687578081fd5b5035919050565b600080604083850312156136a0578182fd5b823591506134d860208401613479565b600080604083850312156136c2578182fd5b82359150602083013561ffff811681146135c4578182fd5b600080604083850312156136ec578182fd5b50508035926020909101359150565b60008151808452613713816020860160208601613a83565b601f01601f19169290920160200192915050565b60008351613739818460208801613a83565b83519083019061374d818360208801613a83565b01949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613789908301846136fb565b9695505050505050565b6020815260006130e360208301846136fb565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601a908201527f53686f756c646e277420626520656d7074792061646472657373000000000000604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252600f908201526e151bdad95b881b9bdd08195e1a5cdd608a1b604082015260600190565b6020815281516020820152600060208301516101208060408501526139076101408501836136fb565b9150604085015161392360608601826001600160a01b03169052565b5060608501516001600160a01b03811660808601525060808501516001600160a01b03811660a08601525060a085015160c085015260c085015161396b60e086018215159052565b5060e08501516101006139818187018315159052565b9095015161ffff1693019290925250919050565b60006101208b83528060208401526139af8184018c6136fb565b6001600160a01b039a8b166040850152988a166060840152505094909616608085015260a0840192909252151560c0830152151560e082015261ffff9092166101009092019190915292915050565b60008219821115613a1157613a11613b19565b500190565b600082613a2557613a25613b2f565b500490565b6000816000190483118215151615613a4457613a44613b19565b500290565b600061ffff83811690831681811015613a6457613a64613b19565b039392505050565b600082821015613a7e57613a7e613b19565b500390565b60005b83811015613a9e578181015183820152602001613a86565b83811115611a925750506000910152565b600181811c90821680613ac357607f821691505b60208210811415613ae457634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415613afe57613afe613b19565b5060010190565b600082613b1457613b14613b2f565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461252c57600080fdfea264697066735822122020860a45cad9447c3d347123823e98ce54f0d11f2c0720d8eb4af9ff0b5076a864736f6c63430008040033

Deployed Bytecode Sourcemap

42425:10037:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27224:305;;;;;;;;;;-1:-1:-1;27224:305:0;;;;;:::i;:::-;;:::i;:::-;;;6993:14:1;;6986:22;6968:41;;6956:2;6941:18;27224:305:0;;;;;;;;42897:37;;;;;;;;;;;;;;;;;;;21905:25:1;;;21893:2;21878:18;42897:37:0;21860:76:1;28169:100:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;29729:221::-;;;;;;;;;;-1:-1:-1;29729:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;6291:32:1;;;6273:51;;6261:2;6246:18;29729:221:0;6228:102:1;29252:411:0;;;;;;;;;;-1:-1:-1;29252:411:0;;;;;:::i;:::-;;:::i;:::-;;42842:46;;;;;;;;;;-1:-1:-1;42842:46:0;;;;;:::i;:::-;;;;;;;;;;;;;;30479:339;;;;;;;;;;-1:-1:-1;30479:339:0;;;;;:::i;:::-;;:::i;44294:88::-;;;;;;;;;;-1:-1:-1;44365:9:0;;44294:88;;30889:185;;;;;;;;;;-1:-1:-1;30889:185:0;;;;;:::i;:::-;;:::i;51783:528::-;;;;;;;;;;-1:-1:-1;51783:528:0;;;;;:::i;:::-;;:::i;42740:26::-;;;;;;;;;;-1:-1:-1;42740:26:0;;;;;;;-1:-1:-1;;;;;42740:26:0;;;45993:960;;;;;;;;;;-1:-1:-1;45993:960:0;;;;;:::i;:::-;;:::i;27863:239::-;;;;;;;;;;-1:-1:-1;27863:239:0;;;;;:::i;:::-;;:::i;42660:34::-;;;;;;;;;;;;;;;;51557:118;;;;;;;;;;-1:-1:-1;51557:118:0;;;;;:::i;:::-;;:::i;42512:26::-;;;;;;;;;;;;;:::i;27593:208::-;;;;;;;;;;-1:-1:-1;27593:208:0;;;;;:::i;:::-;;:::i;7807:103::-;;;;;;;;;;;;;:::i;42619:34::-;;;;;;;;;;;;;;;;7156:87;;;;;;;;;;-1:-1:-1;7229:6:0;;-1:-1:-1;;;;;7229:6:0;7156:87;;51683:92;;;;;;;;;;-1:-1:-1;51683:92:0;;;;;:::i;:::-;;:::i;28338:104::-;;;;;;;;;;;;;:::i;42701:32::-;;;;;;;;;;-1:-1:-1;42701:32:0;;;;;;;;;;;23030:10:1;23018:23;;;23000:42;;22988:2;22973:18;42701:32:0;22955:93:1;42580:32:0;;;;;;;;;;;;;;;;43973:92;;;;;;;;;;-1:-1:-1;43973:92:0;;;;;:::i;:::-;;:::i;30022:155::-;;;;;;;;;;-1:-1:-1;30022:155:0;;;;;:::i;:::-;;:::i;47018:1071::-;;;;;;;;;;-1:-1:-1;47018:1071:0;;;;;:::i;:::-;;:::i;52319:138::-;;;;;;;;;;-1:-1:-1;52319:138:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;50704:845::-;;;;;;;;;;-1:-1:-1;50704:845:0;;;;;:::i;:::-;;:::i;31145:328::-;;;;;;;;;;-1:-1:-1;31145:328:0;;;;;:::i;:::-;;:::i;48766:1930::-;;;;;;:::i;:::-;;:::i;44073:213::-;;;;;;;;;;-1:-1:-1;44073:213:0;;;;;:::i;:::-;;:::i;42775:58::-;;;;;;;;;;-1:-1:-1;42775:58:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;:::i;44390:1595::-;;;;;;:::i;:::-;;:::i;30248:164::-;;;;;;;;;;-1:-1:-1;30248:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;30369:25:0;;;30345:4;30369:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;30248:164;8065:201;;;;;;;;;;-1:-1:-1;8065:201:0;;;;;:::i;:::-;;:::i;42545:28::-;;;;;;;;;;;;;;;;27224:305;27326:4;-1:-1:-1;;;;;;27363:40:0;;-1:-1:-1;;;27363:40:0;;:105;;-1:-1:-1;;;;;;;27420:48:0;;-1:-1:-1;;;27420:48:0;27363:105;:158;;;-1:-1:-1;;;;;;;;;;20072:40:0;;;27485:36;27343:178;27224:305;-1:-1:-1;;27224:305:0:o;28169:100::-;28223:13;28256:5;28249:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28169:100;:::o;29729:221::-;29805:7;29833:16;29841:7;29833;:16::i;:::-;29825:73;;;;-1:-1:-1;;;29825:73:0;;15883:2:1;29825:73:0;;;15865:21:1;15922:2;15902:18;;;15895:30;15961:34;15941:18;;;15934:62;-1:-1:-1;;;16012:18:1;;;16005:42;16064:19;;29825:73:0;;;;;;;;;-1:-1:-1;29918:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;29918:24:0;;29729:221::o;29252:411::-;29333:13;29349:23;29364:7;29349:14;:23::i;:::-;29333:39;;29397:5;-1:-1:-1;;;;;29391:11:0;:2;-1:-1:-1;;;;;29391:11:0;;;29383:57;;;;-1:-1:-1;;;29383:57:0;;17778:2:1;29383:57:0;;;17760:21:1;17817:2;17797:18;;;17790:30;17856:34;17836:18;;;17829:62;-1:-1:-1;;;17907:18:1;;;17900:31;17948:19;;29383:57:0;17750:223:1;29383:57:0;5960:10;-1:-1:-1;;;;;29475:21:0;;;;:62;;-1:-1:-1;29500:37:0;29517:5;5960:10;30248:164;:::i;29500:37::-;29453:168;;;;-1:-1:-1;;;29453:168:0;;13443:2:1;29453:168:0;;;13425:21:1;13482:2;13462:18;;;13455:30;13521:34;13501:18;;;13494:62;13592:26;13572:18;;;13565:54;13636:19;;29453:168:0;13415:246:1;29453:168:0;29634:21;29643:2;29647:7;29634:8;:21::i;:::-;29252:411;;;:::o;30479:339::-;30674:41;5960:10;30707:7;30674:18;:41::i;:::-;30666:103;;;;-1:-1:-1;;;30666:103:0;;;;;;;:::i;:::-;30782:28;30792:4;30798:2;30802:7;30782:9;:28::i;30889:185::-;31027:39;31044:4;31050:2;31054:7;31027:39;;;;;;;;;;;;:16;:39::i;51783:528::-;51881:10;51873:63;;;;-1:-1:-1;;;51873:63:0;;;;;;;:::i;:::-;51969:11;;;;;-1:-1:-1;;;;;51969:11:0;51955:10;:25;51947:60;;;;-1:-1:-1;;;51947:60:0;;18180:2:1;51947:60:0;;;18162:21:1;18219:2;18199:18;;;18192:30;-1:-1:-1;;;18238:18:1;;;18231:52;18300:18;;51947:60:0;18152:172:1;51947:60:0;52018:36;52057:14;:24;52072:8;52057:24;;;;;;;;;;;52018:63;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;52018:63:0;;;-1:-1:-1;;52018:63:0;;;;-1:-1:-1;;;;;52018:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52100:24;;;;52018:63;;-1:-1:-1;52100:42:0;;;;;;;52092:108;;;;-1:-1:-1;;;52092:108:0;;9733:2:1;52092:108:0;;;9715:21:1;9772:2;9752:18;;;9745:30;9811:34;9791:18;;;9784:62;-1:-1:-1;;;9862:18:1;;;9855:51;9923:19;;52092:108:0;9705:243:1;52092:108:0;52239:14;52211:12;:24;;:42;;;;;;;:::i;:::-;;;;;-1:-1:-1;52264:24:0;;;;:14;:24;;;;;;;;:39;;;;;;;;;;52291:12;;52264:39;;;;;;;;;;:::i;:::-;-1:-1:-1;52264:39:0;;;;;;;;;-1:-1:-1;;;;;52264:39:0;;;-1:-1:-1;;;;;;52264:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;52264:39:0;;;;;;-1:-1:-1;;52264:39:0;;;;;;;-1:-1:-1;;52264:39:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;51783:528:0:o;45993:960::-;46149:10;46141:63;;;;-1:-1:-1;;;46141:63:0;;;;;;;:::i;:::-;46267:17;46275:8;46267:7;:17::i;:::-;46259:45;;;;-1:-1:-1;;;46259:45:0;;;;;;;:::i;:::-;46378:24;;;;:14;:24;;;;;:35;;;;;;;;46377:36;46369:76;;;;-1:-1:-1;;;46369:76:0;;7788:2:1;46369:76:0;;;7770:21:1;7827:2;7807:18;;;7800:30;7866:29;7846:18;;;7839:57;7913:18;;46369:76:0;7760:177:1;46369:76:0;46490:18;46511:17;46519:8;46511:7;:17::i;:::-;46490:38;-1:-1:-1;;;;;;46630:24:0;;46644:10;46630:24;46622:50;;;;-1:-1:-1;;;46622:50:0;;7446:2:1;46622:50:0;;;7428:21:1;7485:2;7465:18;;;7458:30;-1:-1:-1;;;7504:18:1;;;7497:43;7557:18;;46622:50:0;7418:163:1;46622:50:0;46693:35;46731:14;:24;46746:8;46731:24;;;;;;;;;;;46693:62;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;46693:62:0;;;-1:-1:-1;;46693:62:0;;;;-1:-1:-1;;;;;46693:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46814:17;;;:29;;;-1:-1:-1;46907:24:0;;;:14;:24;;;:38;;;;;;;;;;46814:17;;-1:-1:-1;46814:17:0;;46907:24;;:38;;46693:62;46907:38;;;;;;;;:::i;:::-;-1:-1:-1;46907:38:0;;;;;;;;;-1:-1:-1;;;;;46907:38:0;;;-1:-1:-1;;;;;;46907:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;46907:38:0;;;;;;-1:-1:-1;;46907:38:0;;;;;;;-1:-1:-1;;46907:38:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;45993:960:0:o;27863:239::-;27935:7;27971:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27971:16:0;28006:19;27998:73;;;;-1:-1:-1;;;27998:73:0;;14279:2:1;27998:73:0;;;14261:21:1;14318:2;14298:18;;;14291:30;14357:34;14337:18;;;14330:62;-1:-1:-1;;;14408:18:1;;;14401:39;14457:19;;27998:73:0;14251:231:1;51557:118:0;7229:6;;-1:-1:-1;;;;;7229:6:0;5960:10;7376:23;7368:68;;;;-1:-1:-1;;;7368:68:0;;;;;;;:::i;:::-;51623:44:::1;::::0;-1:-1:-1;;;;;51623:21:0;::::1;::::0;51645::::1;51623:44:::0;::::1;;;::::0;::::1;::::0;;;51645:21;51623;:44;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;51557:118:::0;:::o;42512:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;27593:208::-;27665:7;-1:-1:-1;;;;;27693:19:0;;27685:74;;;;-1:-1:-1;;;27685:74:0;;13868:2:1;27685:74:0;;;13850:21:1;13907:2;13887:18;;;13880:30;13946:34;13926:18;;;13919:62;-1:-1:-1;;;13997:18:1;;;13990:40;14047:19;;27685:74:0;13840:232:1;27685:74:0;-1:-1:-1;;;;;;27777:16:0;;;;;:9;:16;;;;;;;27593:208::o;7807:103::-;7229:6;;-1:-1:-1;;;;;7229:6:0;5960:10;7376:23;7368:68;;;;-1:-1:-1;;;7368:68:0;;;;;;;:::i;:::-;7872:30:::1;7899:1;7872:18;:30::i;:::-;7807:103::o:0;51683:92::-;7229:6;;-1:-1:-1;;;;;7229:6:0;5960:10;7376:23;7368:68;;;;-1:-1:-1;;;7368:68:0;;;;;;;:::i;:::-;51749:11:::1;:18:::0;;-1:-1:-1;;;;;51749:18:0;;::::1;::::0;::::1;-1:-1:-1::0;;;;;;51749:18:0;;::::1;::::0;;;::::1;::::0;;51683:92::o;28338:104::-;28394:13;28427:7;28420:14;;;;;:::i;43973:92::-;7229:6;;-1:-1:-1;;;;;7229:6:0;5960:10;7376:23;7368:68;;;;-1:-1:-1;;;7368:68:0;;;;;;;:::i;:::-;44043:14;;::::1;::::0;:7:::1;::::0;:14:::1;::::0;::::1;::::0;::::1;:::i;30022:155::-:0;30117:52;5960:10;30150:8;30160;30117:18;:52::i;47018:1071::-;47152:10;47144:63;;;;-1:-1:-1;;;47144:63:0;;;;;;;:::i;:::-;47270:17;47278:8;47270:7;:17::i;:::-;47262:45;;;;-1:-1:-1;;;47262:45:0;;;;;;;:::i;:::-;47381:24;;;;:14;:24;;;;;:35;;;;;;;;47380:36;47372:76;;;;-1:-1:-1;;;47372:76:0;;7788:2:1;47372:76:0;;;7770:21:1;7827:2;7807:18;;;7800:30;7866:29;7846:18;;;7839:57;7913:18;;47372:76:0;7760:177:1;47372:76:0;47493:18;47514:17;47522:8;47514:7;:17::i;:::-;47493:38;-1:-1:-1;;;;;;47633:24:0;;47647:10;47633:24;47625:50;;;;-1:-1:-1;;;47625:50:0;;7446:2:1;47625:50:0;;;7428:21:1;7485:2;7465:18;;;7458:30;-1:-1:-1;;;7504:18:1;;;7497:43;7557:18;;47625:50:0;7418:163:1;47625:50:0;47696:35;47734:14;:24;47749:8;47734:24;;;;;;;;;;;47696:62;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;47696:62:0;;;-1:-1:-1;;47696:62:0;;;;-1:-1:-1;;;;;47696:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47840:21;;;;;-1:-1:-1;47837:143:0;;;47902:5;47878:21;;;:29;47837:143;;;47964:4;47940:21;;;:28;47837:143;48043:24;;;;:14;:24;;;;;;;;:38;;;;;;;;;;48070:11;;48043:38;;;;;;;;;;:::i;52319:138::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52425:14:0;:24;52440:8;52425:24;;;;;;;;;;;52418:31;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;52418:31:0;;;-1:-1:-1;;52418:31:0;;;;-1:-1:-1;;;;;52418:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;52319:138:0:o;50704:845::-;2130:1;2728:7;;:19;;2720:63;;;;-1:-1:-1;;;2720:63:0;;19650:2:1;2720:63:0;;;19632:21:1;19689:2;19669:18;;;19662:30;19728:33;19708:18;;;19701:61;19779:18;;2720:63:0;19622:181:1;2720:63:0;2130:1;2861:7;:18;50869:22:::1;::::0;-1:-1:-1;;;;;50869:22:0::1;50855:10;:36;50847:76;;;::::0;-1:-1:-1;;;50847:76:0;;10512:2:1;50847:76:0::1;::::0;::::1;10494:21:1::0;10551:2;10531:18;;;10524:30;10590:29;10570:18;;;10563:57;10637:18;;50847:76:0::1;10484:177:1::0;50847:76:0::1;50996:24;::::0;;;:14:::1;:24;::::0;;;;:35:::1;;::::0;::::1;::::0;::::1;;;50988:72;;;::::0;-1:-1:-1;;;50988:72:0;;12746:2:1;50988:72:0::1;::::0;::::1;12728:21:1::0;12785:2;12765:18;;;12758:30;12824:26;12804:18;;;12797:54;12868:18;;50988:72:0::1;12718:174:1::0;50988:72:0::1;-1:-1:-1::0;;;;;51135:17:0;::::1;51127:58;;;::::0;-1:-1:-1;;;51127:58:0;;18531:2:1;51127:58:0::1;::::0;::::1;18513:21:1::0;18570:2;18550:18;;;18543:30;18609;18589:18;;;18582:58;18657:18;;51127:58:0::1;18503:178:1::0;51127:58:0::1;51230:18;51251:17;51259:8;51251:7;:17::i;:::-;51230:38;;51279:36;51289:10;51301:3;51306:8;51279:9;:36::i;:::-;51326:35;51364:14;:24;51379:8;51364:24;;;;;;;;;;;51326:62;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;51326:62:0;;;-1:-1:-1;;51326:62:0::1;::::0;::::1;::::0;-1:-1:-1;;;;;51326:62:0;;::::1;;::::0;;::::1;::::0;;;;::::1;::::0;::::1;::::0;;::::1;::::0;;;;;;;;::::1;::::0;::::1;::::0;;::::1;::::0;;;;;;;;::::1;::::0;::::1;::::0;;;;;;;;;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;;;::::0;;;;::::1;::::0;::::1;;;;::::0;;;;;;::::1;;;::::0;;;;;;;;51427:24;;::::1;::::0;;51399:52;::::1;:25:::0;;::::1;:52:::0;;;;51462:30;;::::1;::::0;;;-1:-1:-1;51503:24:0;;;:14:::1;:24:::0;;;:38;;;;;;::::1;::::0;;;51427:24;;-1:-1:-1;51427:24:0;;51503;;:38:::1;::::0;51326:62;51503:38;::::1;::::0;;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;51503:38:0::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;51503:38:0;;::::1;-1:-1:-1::0;;;;;;51503:38:0;;::::1;;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;;::::0;::::1;-1:-1:-1::0;;51503:38:0;::::1;;::::0;;::::1;-1:-1:-1::0;;51503:38:0;::::1;;::::0;;;;-1:-1:-1;;51503:38:0;;;;;;;;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;51503:38:0;3040:7;:22;-1:-1:-1;;50704:845:0:o;31145:328::-;31320:41;5960:10;31353:7;31320:18;:41::i;:::-;31312:103;;;;-1:-1:-1;;;31312:103:0;;;;;;;:::i;:::-;31426:39;31440:4;31446:2;31450:7;31459:5;31426:13;:39::i;:::-;31145:328;;;;:::o;48766:1930::-;2130:1;2728:7;;:19;;2720:63;;;;-1:-1:-1;;;2720:63:0;;19650:2:1;2720:63:0;;;19632:21:1;19689:2;19669:18;;;19662:30;19728:33;19708:18;;;19701:61;19779:18;;2720:63:0;19622:181:1;2720:63:0;2130:1;2861:7;:18;48926:10:::1;48918:63;;;;-1:-1:-1::0;;;48918:63:0::1;;;;;;;:::i;:::-;49074:17;49082:8;49074:7;:17::i;:::-;49066:45;;;;-1:-1:-1::0;;;49066:45:0::1;;;;;;;:::i;:::-;49156:18;49177:17;49185:8;49177:7;:17::i;:::-;49156:38:::0;-1:-1:-1;;;;;;49277:24:0;::::1;49269:65;;;::::0;-1:-1:-1;;;49269:65:0;;18531:2:1;49269:65:0::1;::::0;::::1;18513:21:1::0;18570:2;18550:18;;;18543:30;18609;18589:18;;;18582:58;18657:18;;49269:65:0::1;18503:178:1::0;49269:65:0::1;49408:24;::::0;;;:14:::1;:24;::::0;;;;:35:::1;;::::0;::::1;::::0;::::1;;;49407:36;49399:77;;;::::0;-1:-1:-1;;;49399:77:0;;10155:2:1;49399:77:0::1;::::0;::::1;10137:21:1::0;10194:2;10174:18;;;10167:30;10233;10213:18;;;10206:58;10281:18;;49399:77:0::1;10127:178:1::0;49399:77:0::1;-1:-1:-1::0;;;;;49574:24:0;::::1;49588:10;49574:24;;49566:55;;;::::0;-1:-1:-1;;;49566:55:0;;10868:2:1;49566:55:0::1;::::0;::::1;10850:21:1::0;10907:2;10887:18;;;10880:30;-1:-1:-1;;;10926:18:1;;;10919:48;10984:18;;49566:55:0::1;10840:168:1::0;49566:55:0::1;49637:35;49675:14;:24;49690:8;49675:24;;;;;;;;;;;49637:62;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;49637:62:0;;;-1:-1:-1;;49637:62:0::1;::::0;::::1;::::0;-1:-1:-1;;;;;49637:62:0;;::::1;;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;;;;::::1;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;;;::::0;;;;;;;;::::1;::::0;::::1;::::0;;::::1;;;::::0;;;;;;;::::1;;;::::0;;;;;;;;49814:17;::::1;::::0;;;-1:-1:-1;49801:9:0::1;:30;49793:64;;;::::0;-1:-1:-1;;;49793:64:0;;20364:2:1;49793:64:0::1;::::0;::::1;20346:21:1::0;20403:2;20383:18;;;20376:30;-1:-1:-1;;;20422:18:1;;;20415:51;20483:18;;49793:64:0::1;20336:171:1::0;49793:64:0::1;49913:11;:21;;;49905:55;;;::::0;-1:-1:-1;;;49905:55:0;;16296:2:1;49905:55:0::1;::::0;::::1;16278:21:1::0;16335:2;16315:18;;;16308:30;-1:-1:-1;;;16354:18:1;;;16347:51;16415:18;;49905:55:0::1;16268:171:1::0;49905:55:0::1;50043:22;::::0;-1:-1:-1;;;;;50043:22:0::1;50029:10;:36;;50021:79;;;::::0;-1:-1:-1;;;50021:79:0;;11215:2:1;50021:79:0::1;::::0;::::1;11197:21:1::0;11254:2;11234:18;;;11227:30;11293:32;11273:18;;;11266:60;11343:18;;50021:79:0::1;11187:180:1::0;50021:79:0::1;50121:11;:24;;;-1:-1:-1::0;;;;;50113:42:0::1;:70;50180:2;50156:11;:17;;;50176:1;50156:21;;;;:::i;:::-;:26;;;;:::i;:::-;50113:70;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;50194:34;50225:2;50205:11;:17;;;:22;;;;:::i;:::-;50194:10;:34::i;:::-;50321:43;50331:10;50343;50355:8;50321:9;:43::i;:::-;50469:24;::::0;::::1;::::0;;-1:-1:-1;;;;;50441:52:0::1;:25;::::0;::::1;:52:::0;50576:10:::1;50549:37:::0;;-1:-1:-1;50650:24:0;;;:14:::1;-1:-1:-1::0;50650:24:0;;;;;;;:38;;;;;;::::1;::::0;;;50469:11;;50650:38:::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;50650:38:0::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;50650:38:0;;::::1;-1:-1:-1::0;;;;;;50650:38:0;;::::1;;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;;::::0;::::1;-1:-1:-1::0;;50650:38:0;::::1;;::::0;;::::1;-1:-1:-1::0;;50650:38:0;::::1;;::::0;;;;-1:-1:-1;;50650:38:0;;;;;;;;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;50650:38:0;3040:7;:22;-1:-1:-1;48766:1930:0:o;44073:213::-;44217:13;44255:23;44270:7;44255:14;:23::i;42775:58::-;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42775:58:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;42775:58:0;;;;;;;;-1:-1:-1;42775:58:0;;;-1:-1:-1;42775:58:0;;;;;;;;;;;;;;;;;;;:::o;44390:1595::-;44473:22;;-1:-1:-1;;;;;44473:22:0;44459:10;:36;44455:1513;;;44537:1;44520:14;;:18;44512:46;;;;-1:-1:-1;;;44512:46:0;;13099:2:1;44512:46:0;;;13081:21:1;13138:2;13118:18;;;13111:30;-1:-1:-1;;;13157:18:1;;;13150:45;13212:18;;44512:46:0;13071:165:1;44512:46:0;44573:32;44583:10;44595:9;;44573;:32::i;:::-;44620:34;44633:9;;44644;44620:12;:34::i;:::-;44687:1;44669:14;;:19;;;;;;;:::i;:::-;;;;-1:-1:-1;;44746:261:0;;;;;;;;44781:9;;44746:261;;;;;;;;;;44837:10;44746:261;;;;;;;;;;44705:38;44746:261;;;;;;;;;;;;;;;;;;;;;;;;;44991:1;44746:261;;;;45022:25;;;:14;:25;;;;;;:42;;;;;;;;44746:261;;;;45022:25;;:42;;;;;;;;;:::i;:::-;-1:-1:-1;45022:42:0;;;;;;;;;-1:-1:-1;;;;;45022:42:0;;;-1:-1:-1;;;;;;45022:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;45022:42:0;;;;;;-1:-1:-1;;45022:42:0;;;;;;;-1:-1:-1;;45022:42:0;;;;;;;;;;;;;;;;;;;;;45079:9;:14;;45022:42;;45079:9;45022:42;;45079:14;;45022:42;;45079:14;:::i;:::-;;;;-1:-1:-1;44455:1513:0;;-1:-1:-1;;44455:1513:0;;45148:1;45134:11;;:15;45126:43;;;;-1:-1:-1;;;45126:43:0;;13099:2:1;45126:43:0;;;13081:21:1;13138:2;13118:18;;;13111:30;-1:-1:-1;;;13157:18:1;;;13150:45;13212:18;;45126:43:0;13071:165:1;45126:43:0;45218:17;;45204:10;45192:23;;;;:11;:23;;;;;;:43;45184:81;;;;-1:-1:-1;;;45184:81:0;;20010:2:1;45184:81:0;;;19992:21:1;20049:2;20029:18;;;20022:30;20088:27;20068:18;;;20061:55;20133:18;;45184:81:0;19982:175:1;45184:81:0;45301:9;;45288;:22;45280:56;;;;-1:-1:-1;;;45280:56:0;;20364:2:1;45280:56:0;;;20346:21:1;20403:2;20383:18;;;20376:30;-1:-1:-1;;;20422:18:1;;;20415:51;20483:18;;45280:56:0;20336:171:1;45280:56:0;45351:32;45361:10;45373:9;;45351;:32::i;:::-;45398:34;45411:9;;45422;45398:12;:34::i;:::-;45459:10;45447:23;;;;:11;:23;;;;;:28;;45474:1;;45447:23;:28;;45474:1;;45447:28;:::i;:::-;;;;;;;;45505:1;45490:11;;:16;;;;;;;:::i;:::-;;;;-1:-1:-1;;45564:270:0;;;;;;;;45599:9;;45564:270;;;;;;;;;;45655:10;45564:270;;;;;;;;;;45523:38;45564:270;;;;;;45742:9;;45564:270;;;;;;;;;;;;;;;;45818:1;45564:270;;;;45849:25;;;:14;:25;;;;;;:42;;;;;;;;45564:270;;;;45849:25;;:42;;45564:270;45849:42;;;;;;;:::i;:::-;-1:-1:-1;45849:42:0;;;;;;;;;-1:-1:-1;;;;;45849:42:0;;;-1:-1:-1;;;;;;45849:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;45849:42:0;;;;;;-1:-1:-1;;45849:42:0;;;;;;;-1:-1:-1;;45849:42:0;;;;;;;;;;;;;;;;;;;;;45906:9;:14;;45849:42;;45906:9;45849:42;;45906:14;;45849:42;;45906:14;:::i;:::-;;;;-1:-1:-1;;45946:9:0;;45935:21;;:10;:21::i;44455:1513::-;44390:1595;:::o;8065:201::-;7229:6;;-1:-1:-1;;;;;7229:6:0;5960:10;7376:23;7368:68;;;;-1:-1:-1;;;7368:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;8154:22:0;::::1;8146:73;;;::::0;-1:-1:-1;;;8146:73:0;;8563:2:1;8146:73:0::1;::::0;::::1;8545:21:1::0;8602:2;8582:18;;;8575:30;8641:34;8621:18;;;8614:62;-1:-1:-1;;;8692:18:1;;;8685:36;8738:19;;8146:73:0::1;8535:228:1::0;8146:73:0::1;8230:28;8249:8;8230:18;:28::i;32983:127::-:0;33048:4;33072:16;;;:7;:16;;;;;;-1:-1:-1;;;;;33072:16:0;:30;;;32983:127::o;37129:174::-;37204:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;37204:29:0;-1:-1:-1;;;;;37204:29:0;;;;;;;;:24;;37258:23;37204:24;37258:14;:23::i;:::-;-1:-1:-1;;;;;37249:46:0;;;;;;;;;;;37129:174;;:::o;33277:348::-;33370:4;33395:16;33403:7;33395;:16::i;:::-;33387:73;;;;-1:-1:-1;;;33387:73:0;;12333:2:1;33387:73:0;;;12315:21:1;12372:2;12352:18;;;12345:30;12411:34;12391:18;;;12384:62;-1:-1:-1;;;12462:18:1;;;12455:42;12514:19;;33387:73:0;12305:234:1;33387:73:0;33471:13;33487:23;33502:7;33487:14;:23::i;:::-;33471:39;;33540:5;-1:-1:-1;;;;;33529:16:0;:7;-1:-1:-1;;;;;33529:16:0;;:52;;;-1:-1:-1;;;;;;30369:25:0;;;30345:4;30369:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;33549:32;33529:87;;;;33609:7;-1:-1:-1;;;;;33585:31:0;:20;33597:7;33585:11;:20::i;:::-;-1:-1:-1;;;;;33585:31:0;;33529:87;33521:96;33277:348;-1:-1:-1;;;;33277:348:0:o;36386:625::-;36545:4;-1:-1:-1;;;;;36518:31:0;:23;36533:7;36518:14;:23::i;:::-;-1:-1:-1;;;;;36518:31:0;;36510:81;;;;-1:-1:-1;;;36510:81:0;;8970:2:1;36510:81:0;;;8952:21:1;9009:2;8989:18;;;8982:30;9048:34;9028:18;;;9021:62;-1:-1:-1;;;9099:18:1;;;9092:35;9144:19;;36510:81:0;8942:227:1;36510:81:0;-1:-1:-1;;;;;36610:16:0;;36602:65;;;;-1:-1:-1;;;36602:65:0;;11574:2:1;36602:65:0;;;11556:21:1;11613:2;11593:18;;;11586:30;11652:34;11632:18;;;11625:62;-1:-1:-1;;;11703:18:1;;;11696:34;11747:19;;36602:65:0;11546:226:1;36602:65:0;36784:29;36801:1;36805:7;36784:8;:29::i;:::-;-1:-1:-1;;;;;36826:15:0;;;;;;:9;:15;;;;;:20;;36845:1;;36826:15;:20;;36845:1;;36826:20;:::i;:::-;;;;-1:-1:-1;;;;;;;36857:13:0;;;;;;:9;:13;;;;;:18;;36874:1;;36857:13;:18;;36874:1;;36857:18;:::i;:::-;;;;-1:-1:-1;;36886:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;36886:21:0;-1:-1:-1;;;;;36886:21:0;;;;;;;;;36925:27;;36886:16;;36925:27;;;;;;;29252:411;;;:::o;8426:191::-;8519:6;;;-1:-1:-1;;;;;8536:17:0;;;-1:-1:-1;;;;;;8536:17:0;;;;;;;8569:40;;8519:6;;;8536:17;8519:6;;8569:40;;8500:16;;8569:40;8426:191;;:::o;37445:315::-;37600:8;-1:-1:-1;;;;;37591:17:0;:5;-1:-1:-1;;;;;37591:17:0;;;37583:55;;;;-1:-1:-1;;;37583:55:0;;11979:2:1;37583:55:0;;;11961:21:1;12018:2;11998:18;;;11991:30;12057:27;12037:18;;;12030:55;12102:18;;37583:55:0;11951:175:1;37583:55:0;-1:-1:-1;;;;;37649:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;37649:46:0;;;;;;;;;;37711:41;;6968::1;;;37711::0;;6941:18:1;37711:41:0;;;;;;;37445:315;;;:::o;32355:::-;32512:28;32522:4;32528:2;32532:7;32512:9;:28::i;:::-;32559:48;32582:4;32588:2;32592:7;32601:5;32559:22;:48::i;:::-;32551:111;;;;-1:-1:-1;;;32551:111:0;;;;;;;:::i;48097:661::-;48161:22;;48210:11;;-1:-1:-1;;;;;48161:22:0;;;;48153:69;;48210:11;;48194:13;:7;48204:3;48194:13;:::i;:::-;:27;;;;:::i;:::-;48153:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48241:9:0;;48276:11;;-1:-1:-1;;;;;48241:9:0;;;;48233:55;;48276:11;;48261:12;:7;48271:2;48261:12;:::i;:::-;:26;;;;:::i;:::-;48233:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48307:16:0;;48349:11;;-1:-1:-1;;;;;48307:16:0;;;;48299:62;;48349:11;;48334:12;:7;48344:2;48334:12;:::i;:::-;:26;;;;:::i;:::-;48299:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48380:22:0;;48428:11;;-1:-1:-1;;;;;48380:22:0;;;;48372:68;;48428:11;;48413:12;:7;48423:2;48413:12;:::i;:::-;:26;;;;:::i;:::-;48372:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48459:15:0;;48501:11;;-1:-1:-1;;;;;48459:15:0;;;;48451:62;;48501:11;;48485:13;:7;48495:3;48485:13;:::i;:::-;:27;;;;:::i;:::-;48451:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48532:15:0;;48574:11;;-1:-1:-1;;;;;48532:15:0;;;;48524:62;;48574:11;;48558:13;:7;48568:3;48558:13;:::i;:::-;:27;;;;:::i;:::-;48524:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48605:27:0;;48659:11;;-1:-1:-1;;;;;48605:27:0;;;;48597:74;;48659:11;;48643:13;:7;48653:3;48643:13;:::i;:::-;:27;;;;:::i;:::-;48597:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48690:22:0;;48738:11;;-1:-1:-1;;;;;48690:22:0;;;;48682:68;;48738:11;;48723:12;:7;48733:2;48723:12;:::i;:::-;:26;;;;:::i;:::-;48682:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40850:679;40923:13;40957:16;40965:7;40957;:16::i;:::-;40949:78;;;;-1:-1:-1;;;40949:78:0;;15465:2:1;40949:78:0;;;15447:21:1;15504:2;15484:18;;;15477:30;15543:34;15523:18;;;15516:62;-1:-1:-1;;;15594:18:1;;;15587:47;15651:19;;40949:78:0;15437:239:1;40949:78:0;41040:23;41066:19;;;:10;:19;;;;;41040:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41096:18;41117:10;:8;:10::i;:::-;41096:31;;41209:4;41203:18;41225:1;41203:23;41199:72;;;-1:-1:-1;41250:9:0;40850:679;-1:-1:-1;;40850:679:0:o;41199:72::-;41375:23;;:27;41371:108;;41450:4;41456:9;41433:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;41419:48;;;;40850:679;;;:::o;41371:108::-;41498:23;41513:7;41498:14;:23::i;33967:110::-;34043:26;34053:2;34057:7;34043:26;;;;;;;;;;;;:9;:26::i;41685:217::-;41785:16;41793:7;41785;:16::i;:::-;41777:75;;;;-1:-1:-1;;;41777:75:0;;14689:2:1;41777:75:0;;;14671:21:1;14728:2;14708:18;;;14701:30;14767:34;14747:18;;;14740:62;-1:-1:-1;;;14818:18:1;;;14811:44;14872:19;;41777:75:0;14661:236:1;41777:75:0;41863:19;;;;:10;:19;;;;;;;;:31;;;;;;;;:::i;38325:799::-;38480:4;-1:-1:-1;;;;;38501:13:0;;10152:19;:23;38497:620;;38537:72;;-1:-1:-1;;;38537:72:0;;-1:-1:-1;;;;;38537:36:0;;;;;:72;;5960:10;;38588:4;;38594:7;;38603:5;;38537:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38537:72:0;;;;;;;;-1:-1:-1;;38537:72:0;;;;;;;;;;;;:::i;:::-;;;38533:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38779:13:0;;38775:272;;38822:60;;-1:-1:-1;;;38822:60:0;;;;;;;:::i;38775:272::-;38997:6;38991:13;38982:6;38978:2;38974:15;38967:38;38533:529;-1:-1:-1;;;;;;38660:51:0;-1:-1:-1;;;38660:51:0;;-1:-1:-1;38653:58:0;;38497:620;-1:-1:-1;39101:4:0;38325:799;;;;;;:::o;43742:100::-;43794:13;43827:7;43820:14;;;;;:::i;28513:334::-;28586:13;28620:16;28628:7;28620;:16::i;:::-;28612:76;;;;-1:-1:-1;;;28612:76:0;;17362:2:1;28612:76:0;;;17344:21:1;17401:2;17381:18;;;17374:30;17440:34;17420:18;;;17413:62;-1:-1:-1;;;17491:18:1;;;17484:45;17546:19;;28612:76:0;17334:237:1;28612:76:0;28701:21;28725:10;:8;:10::i;:::-;28701:34;;28777:1;28759:7;28753:21;:25;:86;;;;;;;;;;;;;;;;;28805:7;28814:18;:7;:16;:18::i;:::-;28788:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;28753:86;28746:93;28513:334;-1:-1:-1;;;28513:334:0:o;34304:321::-;34434:18;34440:2;34444:7;34434:5;:18::i;:::-;34485:54;34516:1;34520:2;34524:7;34533:5;34485:22;:54::i;:::-;34463:154;;;;-1:-1:-1;;;34463:154:0;;;;;;;:::i;3442:723::-;3498:13;3719:10;3715:53;;-1:-1:-1;;3746:10:0;;;;;;;;;;;;-1:-1:-1;;;3746:10:0;;;;;3442:723::o;3715:53::-;3793:5;3778:12;3834:78;3841:9;;3834:78;;3867:8;;;;:::i;:::-;;-1:-1:-1;3890:10:0;;-1:-1:-1;3898:2:0;3890:10;;:::i;:::-;;;3834:78;;;3922:19;3954:6;3944:17;;;;;;-1:-1:-1;;;3944:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3944:17:0;;3922:39;;3972:154;3979:10;;3972:154;;4006:11;4016:1;4006:11;;:::i;:::-;;-1:-1:-1;4075:10:0;4083:2;4075:5;:10;:::i;:::-;4062:24;;:2;:24;:::i;:::-;4049:39;;4032:6;4039;4032:14;;;;;;-1:-1:-1;;;4032:14:0;;;;;;;;;;;;:56;-1:-1:-1;;;;;4032:56:0;;;;;;;;-1:-1:-1;4103:11:0;4112:2;4103:11;;:::i;:::-;;;3972:154;;34961:439;-1:-1:-1;;;;;35041:16:0;;35033:61;;;;-1:-1:-1;;;35033:61:0;;15104:2:1;35033:61:0;;;15086:21:1;;;15123:18;;;15116:30;15182:34;15162:18;;;15155:62;15234:18;;35033:61:0;15076:182:1;35033:61:0;35114:16;35122:7;35114;:16::i;:::-;35113:17;35105:58;;;;-1:-1:-1;;;35105:58:0;;9376:2:1;35105:58:0;;;9358:21:1;9415:2;9395:18;;;9388:30;9454;9434:18;;;9427:58;9502:18;;35105:58:0;9348:178:1;35105:58:0;-1:-1:-1;;;;;35234:13:0;;;;;;:9;:13;;;;;:18;;35251:1;;35234:13;:18;;35251:1;;35234:18;:::i;:::-;;;;-1:-1:-1;;35263:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;35263:21:0;-1:-1:-1;;;;;35263:21:0;;;;;;;;35302:33;;35263:16;;;35302:33;;35263:16;;35302:33;51623:44:::1;51557:118:::0;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:631:1;78:5;108:18;149:2;141:6;138:14;135:2;;;155:18;;:::i;:::-;230:2;224:9;198:2;284:15;;-1:-1:-1;;280:24:1;;;306:2;276:33;272:42;260:55;;;330:18;;;350:22;;;327:46;324:2;;;376:18;;:::i;:::-;416:10;412:2;405:22;445:6;436:15;;475:6;467;460:22;515:3;506:6;501:3;497:16;494:25;491:2;;;532:1;529;522:12;491:2;582:6;577:3;570:4;562:6;558:17;545:44;637:1;630:4;621:6;613;609:19;605:30;598:41;;;;88:557;;;;;:::o;650:173::-;718:20;;-1:-1:-1;;;;;767:31:1;;757:42;;747:2;;813:1;810;803:12;747:2;699:124;;;:::o;828:196::-;887:6;940:2;928:9;919:7;915:23;911:32;908:2;;;961:6;953;946:22;908:2;989:29;1008:9;989:29;:::i;1029:270::-;1097:6;1105;1158:2;1146:9;1137:7;1133:23;1129:32;1126:2;;;1179:6;1171;1164:22;1126:2;1207:29;1226:9;1207:29;:::i;:::-;1197:39;;1255:38;1289:2;1278:9;1274:18;1255:38;:::i;:::-;1245:48;;1116:183;;;;;:::o;1304:338::-;1381:6;1389;1397;1450:2;1438:9;1429:7;1425:23;1421:32;1418:2;;;1471:6;1463;1456:22;1418:2;1499:29;1518:9;1499:29;:::i;:::-;1489:39;;1547:38;1581:2;1570:9;1566:18;1547:38;:::i;:::-;1537:48;;1632:2;1621:9;1617:18;1604:32;1594:42;;1408:234;;;;;:::o;1647:696::-;1742:6;1750;1758;1766;1819:3;1807:9;1798:7;1794:23;1790:33;1787:2;;;1841:6;1833;1826:22;1787:2;1869:29;1888:9;1869:29;:::i;:::-;1859:39;;1917:38;1951:2;1940:9;1936:18;1917:38;:::i;:::-;1907:48;;2002:2;1991:9;1987:18;1974:32;1964:42;;2057:2;2046:9;2042:18;2029:32;2084:18;2076:6;2073:30;2070:2;;;2121:6;2113;2106:22;2070:2;2149:22;;2202:4;2194:13;;2190:27;-1:-1:-1;2180:2:1;;2236:6;2228;2221:22;2180:2;2264:73;2329:7;2324:2;2311:16;2306:2;2302;2298:11;2264:73;:::i;:::-;2254:83;;;1777:566;;;;;;;:::o;2348:367::-;2413:6;2421;2474:2;2462:9;2453:7;2449:23;2445:32;2442:2;;;2495:6;2487;2480:22;2442:2;2523:29;2542:9;2523:29;:::i;:::-;2513:39;;2602:2;2591:9;2587:18;2574:32;2649:5;2642:13;2635:21;2628:5;2625:32;2615:2;;2676:6;2668;2661:22;2615:2;2704:5;2694:15;;;2432:283;;;;;:::o;2720:264::-;2788:6;2796;2849:2;2837:9;2828:7;2824:23;2820:32;2817:2;;;2870:6;2862;2855:22;2817:2;2898:29;2917:9;2898:29;:::i;:::-;2888:39;2974:2;2959:18;;;;2946:32;;-1:-1:-1;;;2807:177:1:o;2989:255::-;3047:6;3100:2;3088:9;3079:7;3075:23;3071:32;3068:2;;;3121:6;3113;3106:22;3068:2;3165:9;3152:23;3184:30;3208:5;3184:30;:::i;3249:259::-;3318:6;3371:2;3359:9;3350:7;3346:23;3342:32;3339:2;;;3392:6;3384;3377:22;3339:2;3429:9;3423:16;3448:30;3472:5;3448:30;:::i;3513:480::-;3582:6;3635:2;3623:9;3614:7;3610:23;3606:32;3603:2;;;3656:6;3648;3641:22;3603:2;3701:9;3688:23;3734:18;3726:6;3723:30;3720:2;;;3771:6;3763;3756:22;3720:2;3799:22;;3852:4;3844:13;;3840:27;-1:-1:-1;3830:2:1;;3886:6;3878;3871:22;3830:2;3914:73;3979:7;3974:2;3961:16;3956:2;3952;3948:11;3914:73;:::i;3998:190::-;4057:6;4110:2;4098:9;4089:7;4085:23;4081:32;4078:2;;;4131:6;4123;4116:22;4078:2;-1:-1:-1;4159:23:1;;4068:120;-1:-1:-1;4068:120:1:o;4193:264::-;4261:6;4269;4322:2;4310:9;4301:7;4297:23;4293:32;4290:2;;;4343:6;4335;4328:22;4290:2;4384:9;4371:23;4361:33;;4413:38;4447:2;4436:9;4432:18;4413:38;:::i;4462:360::-;4529:6;4537;4590:2;4578:9;4569:7;4565:23;4561:32;4558:2;;;4611:6;4603;4596:22;4558:2;4652:9;4639:23;4629:33;;4712:2;4701:9;4697:18;4684:32;4756:6;4749:5;4745:18;4738:5;4735:29;4725:2;;4783:6;4775;4768:22;4827:258;4895:6;4903;4956:2;4944:9;4935:7;4931:23;4927:32;4924:2;;;4977:6;4969;4962:22;4924:2;-1:-1:-1;;5005:23:1;;;5075:2;5060:18;;;5047:32;;-1:-1:-1;4914:171:1:o;5295:257::-;5336:3;5374:5;5368:12;5401:6;5396:3;5389:19;5417:63;5473:6;5466:4;5461:3;5457:14;5450:4;5443:5;5439:16;5417:63;:::i;:::-;5534:2;5513:15;-1:-1:-1;;5509:29:1;5500:39;;;;5541:4;5496:50;;5344:208;-1:-1:-1;;5344:208:1:o;5652:470::-;5831:3;5869:6;5863:13;5885:53;5931:6;5926:3;5919:4;5911:6;5907:17;5885:53;:::i;:::-;6001:13;;5960:16;;;;6023:57;6001:13;5960:16;6057:4;6045:17;;6023:57;:::i;:::-;6096:20;;5839:283;-1:-1:-1;;;;5839:283:1:o;6335:488::-;-1:-1:-1;;;;;6604:15:1;;;6586:34;;6656:15;;6651:2;6636:18;;6629:43;6703:2;6688:18;;6681:34;;;6751:3;6746:2;6731:18;;6724:31;;;6529:4;;6772:45;;6797:19;;6789:6;6772:45;:::i;:::-;6764:53;6538:285;-1:-1:-1;;;;;;6538:285:1:o;7020:219::-;7169:2;7158:9;7151:21;7132:4;7189:44;7229:2;7218:9;7214:18;7206:6;7189:44;:::i;7942:414::-;8144:2;8126:21;;;8183:2;8163:18;;;8156:30;8222:34;8217:2;8202:18;;8195:62;-1:-1:-1;;;8288:2:1;8273:18;;8266:48;8346:3;8331:19;;8116:240::o;16444:356::-;16646:2;16628:21;;;16665:18;;;16658:30;16724:34;16719:2;16704:18;;16697:62;16791:2;16776:18;;16618:182::o;16805:350::-;17007:2;16989:21;;;17046:2;17026:18;;;17019:30;17085:28;17080:2;17065:18;;17058:56;17146:2;17131:18;;16979:176::o;18686:413::-;18888:2;18870:21;;;18927:2;18907:18;;;18900:30;18966:34;18961:2;18946:18;;18939:62;-1:-1:-1;;;19032:2:1;19017:18;;19010:47;19089:3;19074:19;;18860:239::o;19104:339::-;19306:2;19288:21;;;19345:2;19325:18;;;19318:30;-1:-1:-1;;;19379:2:1;19364:18;;19357:45;19434:2;19419:18;;19278:165::o;20512:1242::-;20705:2;20694:9;20687:21;20750:6;20744:13;20739:2;20728:9;20724:18;20717:41;20668:4;20805:2;20797:6;20793:15;20787:22;20828:6;20870:2;20865;20854:9;20850:18;20843:30;20896:51;20942:3;20931:9;20927:19;20913:12;20896:51;:::i;:::-;20882:65;;20996:2;20988:6;20984:15;20978:22;21009:54;21059:2;21048:9;21044:18;21028:14;-1:-1:-1;;;;;5156:31:1;5144:44;;5134:60;21009:54;-1:-1:-1;21112:2:1;21100:15;;21094:22;-1:-1:-1;;;;;5156:31:1;;21175:3;21160:19;;5144:44;-1:-1:-1;21229:3:1;21217:16;;21211:23;-1:-1:-1;;;;;5156:31:1;;21293:3;21278:19;;5144:44;21243:55;21353:3;21345:6;21341:16;21335:23;21329:3;21318:9;21314:19;21307:52;21408:3;21400:6;21396:16;21390:23;21422:52;21469:3;21458:9;21454:19;21438:14;5269:13;5262:21;5250:34;;5240:50;21422:52;;21523:3;21515:6;21511:16;21505:23;21547:3;21559:51;21606:2;21595:9;21591:18;21575:14;5269:13;5262:21;5250:34;;5240:50;21559:51;21647:15;;;21641:22;5633:6;5622:18;21706;;5610:31;;;;-1:-1:-1;21742:6:1;;-1:-1:-1;20677:1077:1:o;21941:910::-;22263:4;22292:3;22322:6;22311:9;22304:25;22365:2;22360;22349:9;22345:18;22338:30;22385:44;22425:2;22414:9;22410:18;22402:6;22385:44;:::i;:::-;-1:-1:-1;;;;;22503:15:1;;;22498:2;22483:18;;22476:43;22555:15;;;22550:2;22535:18;;22528:43;-1:-1:-1;;22608:15:1;;;;22602:3;22587:19;;22580:44;22456:3;22640:19;;22633:35;;;;22712:14;22705:22;22699:3;22684:19;;22677:51;22772:14;22765:22;22759:3;22744:19;;22737:51;22837:6;22825:19;;;22819:3;22804:19;;;22797:48;;;;22555:15;22377:52;-1:-1:-1;;22272:579:1:o;23053:128::-;23093:3;23124:1;23120:6;23117:1;23114:13;23111:2;;;23130:18;;:::i;:::-;-1:-1:-1;23166:9:1;;23101:80::o;23186:120::-;23226:1;23252;23242:2;;23257:18;;:::i;:::-;-1:-1:-1;23291:9:1;;23232:74::o;23311:168::-;23351:7;23417:1;23413;23409:6;23405:14;23402:1;23399:21;23394:1;23387:9;23380:17;23376:45;23373:2;;;23424:18;;:::i;:::-;-1:-1:-1;23464:9:1;;23363:116::o;23484:217::-;23523:4;23552:6;23608:10;;;;23578;;23630:12;;;23627:2;;;23645:18;;:::i;:::-;23682:13;;23532:169;-1:-1:-1;;;23532:169:1:o;23706:125::-;23746:4;23774:1;23771;23768:8;23765:2;;;23779:18;;:::i;:::-;-1:-1:-1;23816:9:1;;23755:76::o;23836:258::-;23908:1;23918:113;23932:6;23929:1;23926:13;23918:113;;;24008:11;;;24002:18;23989:11;;;23982:39;23954:2;23947:10;23918:113;;;24049:6;24046:1;24043:13;24040:2;;;-1:-1:-1;;24084:1:1;24066:16;;24059:27;23889:205::o;24099:380::-;24178:1;24174:12;;;;24221;;;24242:2;;24296:4;24288:6;24284:17;24274:27;;24242:2;24349;24341:6;24338:14;24318:18;24315:38;24312:2;;;24395:10;24390:3;24386:20;24383:1;24376:31;24430:4;24427:1;24420:15;24458:4;24455:1;24448:15;24312:2;;24154:325;;;:::o;24484:135::-;24523:3;-1:-1:-1;;24544:17:1;;24541:2;;;24564:18;;:::i;:::-;-1:-1:-1;24611:1:1;24600:13;;24531:88::o;24624:112::-;24656:1;24682;24672:2;;24687:18;;:::i;:::-;-1:-1:-1;24721:9:1;;24662:74::o;24741:127::-;24802:10;24797:3;24793:20;24790:1;24783:31;24833:4;24830:1;24823:15;24857:4;24854:1;24847:15;24873:127;24934:10;24929:3;24925:20;24922:1;24915:31;24965:4;24962:1;24955:15;24989:4;24986:1;24979:15;25005:127;25066:10;25061:3;25057:20;25054:1;25047:31;25097:4;25094:1;25087:15;25121:4;25118:1;25111:15;25137:131;-1:-1:-1;;;;;;25211:32:1;;25201:43;;25191:2;;25258:1;25255;25248:12

Swarm Source

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