ETH Price: $2,939.16 (-4.19%)
Gas: 2 Gwei

Token

Stoned Duck Lifestyle Club (SDLC)
 

Overview

Max Total Supply

4,042 SDLC

Holders

443

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
superluckyboy.eth
Balance
4 SDLC
0xcf9513d3a121beda3500d66cd061c53cacae6832
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:
SDLC_NFT

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-06-01
*/

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol


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

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);

    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `from` to `to` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external returns (bool);
}

// 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/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/extensions/IERC721Enumerable.sol


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;


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

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

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

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


// 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/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/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/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/cryptography/MerkleProof.sol


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

pragma solidity ^0.8.0;

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

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

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

// File: contracts/SDLC_NFT.sol












// File: https://github.com/chiru-labs/ERC721A/blob/main/contracts/ERC721A.sol


// Creator: Chiru Labs

pragma solidity ^0.8.4;









error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error MintedQueryForZeroAddress();
error BurnedQueryForZeroAddress();
error AuxQueryForZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error OwnerIndexOutOfBounds();
error OwnerQueryForNonexistentToken();
error TokenIndexOutOfBounds();
error TransferCallerNotOwnerNorApproved();
error TransferFromIncorrectOwner();
error TransferToNonERC721ReceiverImplementer();
error TransferToZeroAddress();
error URIQueryForNonexistentToken();

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..).
 *
 * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 *
 * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Compiler will pack this into a single 256bit word.
    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
    }

    // Compiler will pack this into a single 256bit word.
    struct AddressData {
        // Realistically, 2**64-1 is more than enough.
        uint64 balance;
        // Keeps track of mint count with minimal overhead for tokenomics.
        uint64 numberMinted;
        // Keeps track of burn count with minimal overhead for tokenomics.
        uint64 numberBurned;
        // For miscellaneous variable(s) pertaining to the address
        // (e.g. number of whitelist mint slots used). 
        // If there are multiple variables, please pack them into a uint64.
        uint64 aux;
    }

    // The tokenId of the next token to be minted.
    uint256 internal _currentIndex;

    // The number of tokens burned.
    uint256 internal _burnCounter;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than _currentIndex times
        unchecked {
            return _currentIndex - _burnCounter;    
        }
    }

    /**
     * @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 override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return uint256(_addressData[owner].balance);
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        if (owner == address(0)) revert MintedQueryForZeroAddress();
        return uint256(_addressData[owner].numberMinted);
    }

    /**
     * Returns the number of tokens burned by or on behalf of `owner`.
     */
    function _numberBurned(address owner) internal view returns (uint256) {
        if (owner == address(0)) revert BurnedQueryForZeroAddress();
        return uint256(_addressData[owner].numberBurned);
    }

    /**
     * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        if (owner == address(0)) revert AuxQueryForZeroAddress();
        return _addressData[owner].aux;
    }

    /**
     * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal {
        if (owner == address(0)) revert AuxQueryForZeroAddress();
        _addressData[owner].aux = aux;
    }

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        uint256 curr = tokenId;

        unchecked {
            if (curr < _currentIndex) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (!ownership.burned) {
                    if (ownership.addr != address(0)) {
                        return ownership;
                    }
                    // Invariant: 
                    // There will always be an ownership that has an address and is not burned 
                    // before an ownership that does not have an address and is not burned.
                    // Hence, curr will not underflow.
                    while (true) {
                        curr--;
                        ownership = _ownerships[curr];
                        if (ownership.addr != address(0)) {
                            return ownership;
                        }
                    }
                }
            }
        }
        revert OwnerQueryForNonexistentToken();
    }

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

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

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

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

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public override {
        address owner = ERC721A.ownerOf(tokenId);
        if (to == owner) revert ApprovalToCurrentOwner();

        if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) {
            revert ApprovalCallerNotOwnerNorApproved();
        }

        _approve(to, tokenId, owner);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public override {
        if (operator == _msgSender()) revert ApproveToCaller();

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

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        _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 {
        _transfer(from, to, tokenId);
        if (!_checkOnERC721Received(from, to, tokenId, _data)) {
            revert TransferToNonERC721ReceiverImplementer();
        }
    }

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

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

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        _mint(to, quantity, _data, true);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _mint(
        address to,
        uint256 quantity,
        bytes memory _data,
        bool safe
    ) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

            uint256 updatedIndex = startTokenId;

            for (uint256 i; i < quantity; i++) {
                emit Transfer(address(0), to, updatedIndex);
                if (safe && !_checkOnERC721Received(address(0), to, updatedIndex, _data)) {
                    revert TransferToNonERC721ReceiverImplementer();
                }
                updatedIndex++;
            }

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

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) private {
        TokenOwnership memory prevOwnership = ownershipOf(tokenId);

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

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            _addressData[from].balance -= 1;
            _addressData[to].balance += 1;

            _ownerships[tokenId].addr = to;
            _ownerships[tokenId].startTimestamp = uint64(block.timestamp);

            // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            if (_ownerships[nextTokenId].addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId < _currentIndex) {
                    _ownerships[nextTokenId].addr = prevOwnership.addr;
                    _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

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

    /**
     * @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 {
        TokenOwnership memory prevOwnership = ownershipOf(tokenId);

        _beforeTokenTransfers(prevOwnership.addr, address(0), tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            _addressData[prevOwnership.addr].balance -= 1;
            _addressData[prevOwnership.addr].numberBurned += 1;

            // Keep track of who burned the token, and the timestamp of burning.
            _ownerships[tokenId].addr = prevOwnership.addr;
            _ownerships[tokenId].startTimestamp = uint64(block.timestamp);
            _ownerships[tokenId].burned = true;

            // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            if (_ownerships[nextTokenId].addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId < _currentIndex) {
                    _ownerships[nextTokenId].addr = prevOwnership.addr;
                    _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(prevOwnership.addr, address(0), tokenId);
        _afterTokenTransfers(prevOwnership.addr, address(0), tokenId, 1);

        // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
        unchecked { 
            _burnCounter++;
        }
    }

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

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

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     * And also called before burning one token.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

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


pragma solidity ^0.8.7;

contract SDLC_NFT is ERC721A, Ownable {
    using Strings for uint256;
    
    uint256 public MAX_SUPPLY = 5500;

    string private BASE_URI;
    string private UNREVEAL_URI;
    bytes32 private FREELIST_ROOT;
    bytes32 private WHITELIST_ROOT;

    uint256 public COST = 0.04 ether;
    uint256 public WHITELIST_COST = 0.03 ether;
    
    mapping(address => uint256) public MAP_FREE_MINTED;
    mapping(address => uint256) public MAP_WHITELIST_MINTED;

    uint256 public SALE_STATUS = 0; // 1 : Free 2: Whitelist 3: Public 0: None


    struct UserRewardInfo {
        uint256 rewards;
        uint256 lastUpdated;
        uint256 stakedBalance;
    }
    mapping(address => UserRewardInfo) public MAP_USER_REWARD_INFO;
    mapping(uint256 => bool) public MAP_STAKED_TOKEN;
    
    IERC20 public REWARD_TOKEN;
    uint256 public DAILY_REWARD_AMOUNT = 0.42 ether;
    uint256 public BONUS_STAKE_LIMIT = 10;
    uint256 public BONUS_PERCENT = 42;


    constructor() ERC721A("Stoned Duck Lifestyle Club", "SDLC") {}

    function setRewardToken(address _tokenAddress) public onlyOwner {
        REWARD_TOKEN = IERC20(_tokenAddress);
    }

    function setDailyRewardAmount(uint256 _dailyReward) public onlyOwner {
        DAILY_REWARD_AMOUNT = _dailyReward;
    }

    function setBonusReward(uint256 _stakeLimit, uint256 _bonusPercent) public onlyOwner {
        BONUS_STAKE_LIMIT = _stakeLimit;
        BONUS_PERCENT = _bonusPercent;
    }

    function setWhitelistRoot(bytes32 _root) public onlyOwner {
        WHITELIST_ROOT = _root;
    }

    function setFreelistRoot(bytes32 _root) public onlyOwner {
        FREELIST_ROOT = _root;
    }

    // Verify that a given leaf is in the tree.
    function isFreeListed(bytes32 _leafNode, bytes32[] memory _proof) public view returns (bool) {
        return MerkleProof.verify(_proof, FREELIST_ROOT, _leafNode);
    }

    function isWhiteListed(bytes32 _leafNode, bytes32[] memory _proof) public view returns (bool) {
        return MerkleProof.verify(_proof, WHITELIST_ROOT, _leafNode);
    }

    // Generate the leaf node (just the hash of tokenID concatenated with the account address)
    function toLeaf(address account, uint256 index, uint256 amount) public pure returns (bytes32) {
        return keccak256(abi.encodePacked(index, account, amount));
    }

    function numberMinted(address _owner) public view returns (uint256) {
        return _numberMinted(_owner);
    }

    function mintFreelist(uint256 _mintAmount, uint256 _index, uint256 _amount, bytes32[] calldata _proof) external {
        require(SALE_STATUS == 1, "Free mint is not opened");

        require(isFreeListed(toLeaf(msg.sender, _index, _amount), _proof), "Invalid proof");
        
        require(totalSupply() + _mintAmount <= MAX_SUPPLY, "Exceeds Max Supply");
        
        require((MAP_FREE_MINTED[msg.sender] + _mintAmount) <= _amount, "Exceeds Max Mint Amount");

        //Mint
        _mintLoop(msg.sender, _mintAmount);

        MAP_FREE_MINTED[msg.sender] = MAP_FREE_MINTED[msg.sender] + _mintAmount;
    }

    function mintWhitelist(uint256 _mintAmount, uint256 _index, uint256 _amount, bytes32[] calldata _proof) external payable {
        require(SALE_STATUS == 2, "Whitelist sale is not opened");

        require(isWhiteListed(toLeaf(msg.sender, _index, _amount), _proof), "Invalid proof");
        
        require(totalSupply() + _mintAmount <= MAX_SUPPLY, "Exceeds Max Supply");
        
        require((MAP_WHITELIST_MINTED[msg.sender] + _mintAmount) <= _amount, "Exceeds Max Mint Amount");

        require(msg.value >= WHITELIST_COST * _mintAmount, "Insuffient funds");

        //Mint
        _mintLoop(msg.sender, _mintAmount);

        MAP_WHITELIST_MINTED[msg.sender] = MAP_WHITELIST_MINTED[msg.sender] + _mintAmount;
    }

    // public
    function mint(uint256 _mintAmount) external payable {
        require(SALE_STATUS == 3, "Public sale is not opened");

        require(totalSupply() + _mintAmount <= MAX_SUPPLY, "Exceeds Max Supply");
        
        require(msg.value >= COST * _mintAmount, "Insuffient funds");

        _mintLoop(msg.sender, _mintAmount);
    }

    function airdrop(address[] memory _airdropAddresses, uint256 _mintAmount) public onlyOwner {
        for (uint256 i = 0; i < _airdropAddresses.length; i++) {
            address to = _airdropAddresses[i];
            _mintLoop(to, _mintAmount);
        }
    }

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

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

    function setCost(uint256 _newCost) public onlyOwner {
        COST = _newCost;
    }

    function setWhitelistCost(uint256 _newCost) public onlyOwner {
        WHITELIST_COST = _newCost;
    }

    function setMaxSupply(uint256 _supply) public onlyOwner {
        MAX_SUPPLY = _supply;
    }

    function setBaseURI(string memory _newBaseURI) public onlyOwner {
        BASE_URI = _newBaseURI;
    }

    function setUnrevealURI(string memory _newUnrevealURI) public onlyOwner {
        UNREVEAL_URI = _newUnrevealURI;
    }

    function setSaleStatus(uint256 _status) public onlyOwner {
        SALE_STATUS = _status;
    }

    function _mintLoop(address _receiver, uint256 _mintAmount) internal {
        _safeMint(_receiver, _mintAmount);
    }

    function getOwnershipData(uint256 tokenId) external view returns (TokenOwnership memory) {
        return ownershipOf(tokenId);
    }

    function tokensOfOwnerByIndex(address _owner, uint256 _index) public view returns (uint256) {
        return tokensOfOwner(_owner)[_index];
    }

    function tokensOfOwner(address _owner) public view returns (uint256[] memory) {
        uint256 _tokenCount = balanceOf(_owner);
        uint256[] memory _tokenIds = new uint256[](_tokenCount);
        uint256 _tokenIndex = 0;
        for (uint256 i = 0; i < totalSupply(); i++) {
            if (ownerOf(i) == _owner) {
                _tokenIds[_tokenIndex] = i;
                _tokenIndex++;
            }
        }
        return _tokenIds;
    }

    function stakedTokensOfOwner(address _owner) public view returns (uint256[] memory) {
        uint256 _tokenCount = MAP_USER_REWARD_INFO[_owner].stakedBalance;
        uint256[] memory _tokenIds = new uint256[](_tokenCount);
        uint256 _tokenIndex = 0;
        for (uint256 i = 0; i < totalSupply(); i++) {
            if (ownerOf(i) == _owner && MAP_STAKED_TOKEN[i] == true) {
                _tokenIds[_tokenIndex] = i;
                _tokenIndex++;
            }
        }
        return _tokenIds;
    }

    function totalStakedCount() public view returns (uint256) {
        uint256 _totalCount = 0;
        for (uint256 i = 0; i < totalSupply(); i++) {
            if (MAP_STAKED_TOKEN[i] == true) {
                _totalCount++;
            }
        }
        return _totalCount;
    }

    function earned(address account) public view returns (uint256) {
        uint256 blockTime = block.timestamp;

        UserRewardInfo memory user = MAP_USER_REWARD_INFO[account];

        uint256 amount = (blockTime - user.lastUpdated) * user.stakedBalance * DAILY_REWARD_AMOUNT / (1 days);

        if (user.stakedBalance >= BONUS_STAKE_LIMIT)  amount = amount * (100 + BONUS_PERCENT) / 100;
        
        return user.rewards + amount;
    }


    function stake( uint256[] calldata _tokenIDList) external {
        UserRewardInfo storage user = MAP_USER_REWARD_INFO[_msgSender()];
        user.rewards = earned(_msgSender());
        user.lastUpdated = block.timestamp;

        uint256 newStakedCount = 0;
        for (uint256 i = 0; i < _tokenIDList.length; i++) {
            if (ownerOf(_tokenIDList[i]) == _msgSender() && MAP_STAKED_TOKEN[_tokenIDList[i]] == false) {
                newStakedCount++;
                MAP_STAKED_TOKEN[_tokenIDList[i]] = true;
            }
        }

        user.stakedBalance = user.stakedBalance + newStakedCount;
    }

    function harvest() external {
        UserRewardInfo storage user = MAP_USER_REWARD_INFO[_msgSender()];
        user.rewards = earned(_msgSender());
        user.lastUpdated = block.timestamp;

        require(REWARD_TOKEN.balanceOf(address(this)) >= user.rewards,"Reward token amount is small");

        if (user.rewards > 0) {
            REWARD_TOKEN.transfer(_msgSender(), user.rewards);
        }

        user.rewards = 0;
    }

    function _beforeTokenTransfers(address from,address to,uint256 startTokenId,uint256 quantity) internal virtual override {
        super._beforeTokenTransfers(from, to, startTokenId, quantity);
        if (from != address(0) && MAP_STAKED_TOKEN[startTokenId] == true) {
            UserRewardInfo storage fromUser = MAP_USER_REWARD_INFO[from];
            UserRewardInfo storage toUser = MAP_USER_REWARD_INFO[to];

            fromUser.rewards = earned(from);
            fromUser.lastUpdated = block.timestamp;
            fromUser.stakedBalance = fromUser.stakedBalance - 1;

            toUser.rewards = earned(to);
            toUser.lastUpdated = block.timestamp;
            toUser.stakedBalance = toUser.stakedBalance + 1;
        }
    }

    function withdraw() public onlyOwner {
        uint256 balance = address(this).balance;
        payable(msg.sender).transfer(balance);
    }

    function withdrawToken() public onlyOwner {
        REWARD_TOKEN.transfer(msg.sender, REWARD_TOKEN.balanceOf(address(this)));
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"MintedQueryForZeroAddress","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"BONUS_PERCENT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BONUS_STAKE_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"COST","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DAILY_REWARD_AMOUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"MAP_FREE_MINTED","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"MAP_STAKED_TOKEN","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"MAP_USER_REWARD_INFO","outputs":[{"internalType":"uint256","name":"rewards","type":"uint256"},{"internalType":"uint256","name":"lastUpdated","type":"uint256"},{"internalType":"uint256","name":"stakedBalance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"MAP_WHITELIST_MINTED","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REWARD_TOKEN","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SALE_STATUS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WHITELIST_COST","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_airdropAddresses","type":"address[]"},{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"earned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getOwnershipData","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"}],"internalType":"struct ERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"harvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_leafNode","type":"bytes32"},{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"}],"name":"isFreeListed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_leafNode","type":"bytes32"},{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"}],"name":"isWhiteListed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"uint256","name":"_index","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"}],"name":"mintFreelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"uint256","name":"_index","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"}],"name":"mintWhitelist","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakeLimit","type":"uint256"},{"internalType":"uint256","name":"_bonusPercent","type":"uint256"}],"name":"setBonusReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_dailyReward","type":"uint256"}],"name":"setDailyRewardAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_root","type":"bytes32"}],"name":"setFreelistRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_supply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"}],"name":"setRewardToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_status","type":"uint256"}],"name":"setSaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newUnrevealURI","type":"string"}],"name":"setUnrevealURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setWhitelistCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_root","type":"bytes32"}],"name":"setWhitelistRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_tokenIDList","type":"uint256[]"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"stakedTokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"toLeaf","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","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":"_owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"tokensOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalStakedCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawToken","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405261157c600955668e1bc9bf040000600e55666a94d74f430000600f5560006012556705d423c655aa0000601655600a601755602a6018553480156200004857600080fd5b50604080518082018252601a81527f53746f6e6564204475636b204c6966657374796c6520436c756200000000000060208083019182528351808501909452600484526353444c4360e01b908401528151919291620000aa9160029162000139565b508051620000c090600390602084019062000139565b505050620000dd620000d7620000e360201b60201c565b620000e7565b6200021b565b3390565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200014790620001df565b90600052602060002090601f0160209004810192826200016b5760008555620001b6565b82601f106200018657805160ff1916838001178555620001b6565b82800160010185558215620001b6579182015b82811115620001b657825182559160200191906001019062000199565b50620001c4929150620001c8565b5090565b5b80821115620001c45760008155600101620001c9565b600181811c90821680620001f457607f821691505b6020821081036200021557634e487b7160e01b600052602260045260246000fd5b50919050565b613195806200022b6000396000f3fe6080604052600436106103805760003560e01c806389aadd49116101d1578063c204642c11610102578063e985e9c5116100a0578063f44cc2801161006f578063f44cc28014610ab3578063f5aa406d14610ad3578063fdaf012514610af3578063ff63cf0114610b1357600080fd5b8063e985e9c514610a0a578063f14560a114610a53578063f29f15af14610a73578063f2fde38b14610a9357600080fd5b8063ca628c78116100dc578063ca628c781461099f578063d49479eb146109b4578063da267bc8146109d4578063dc33e681146109ea57600080fd5b8063c204642c14610908578063c4dd3a9c14610928578063c87b56dd1461097f57600080fd5b806399248ea71161016f578063b5fa408d11610149578063b5fa408d14610882578063b88d4fde146108b2578063bd645454146108d2578063bf8fbbd2146108f257600080fd5b806399248ea71461082f578063a0712d681461084f578063a22cb4651461086257600080fd5b8063920387b4116101ab578063920387b41461078f5780639231ab2a146107a457806395d89b41146107fa57806397bc411c1461080f57600080fd5b806389aadd49146107315780638aee8127146107515780638da5cb5b1461077157600080fd5b806344a0d68a116102b65780636352211e1161025457806370a082311161022357806370a08231146106c6578063715018a6146106e65780638462151c146106fb578063846342ee1461071b57600080fd5b80636352211e14610650578063698e5c44146106705780636ad5f9cc146106865780636f8b44b0146106a657600080fd5b806355f804b31161029057806355f804b3146105c05780635887e325146105e05780635f54db151461060d5780635fbfed3e1461063a57600080fd5b806344a0d68a1461056b5780634641257d1461058b5780634707f44f146105a057600080fd5b80630fbf0a931161032357806326217e20116102fd57806326217e201461050057806332cb6b0c146105205780633ccfd60b1461053657806342842e0e1461054b57600080fd5b80630fbf0a93146104a757806318160ddd146104c757806323b872dd146104e057600080fd5b806306fdde031161035f57806306fdde0314610415578063081812fc14610437578063095ea7b31461046f5780630a82f53b1461049157600080fd5b80628cc2621461038557806301ffc9a7146103b85780630500b0ad146103e8575b600080fd5b34801561039157600080fd5b506103a56103a0366004612944565b610b26565b6040519081526020015b60405180910390f35b3480156103c457600080fd5b506103d86103d3366004612975565b610be9565b60405190151581526020016103af565b3480156103f457600080fd5b506103a5610403366004612944565b60116020526000908152604090205481565b34801561042157600080fd5b5061042a610c3b565b6040516103af91906129ea565b34801561044357600080fd5b506104576104523660046129fd565b610ccd565b6040516001600160a01b0390911681526020016103af565b34801561047b57600080fd5b5061048f61048a366004612a16565b610d11565b005b34801561049d57600080fd5b506103a560125481565b3480156104b357600080fd5b5061048f6104c2366004612a8b565b610d9e565b3480156104d357600080fd5b50600154600054036103a5565b3480156104ec57600080fd5b5061048f6104fb366004612acc565b610ebb565b34801561050c57600080fd5b5061048f61051b366004612b08565b610ec6565b34801561052c57600080fd5b506103a560095481565b34801561054257600080fd5b5061048f61107a565b34801561055757600080fd5b5061048f610566366004612acc565b6110d7565b34801561057757600080fd5b5061048f6105863660046129fd565b6110f2565b34801561059757600080fd5b5061048f611121565b3480156105ac57600080fd5b506103a56105bb366004612a16565b61128f565b3480156105cc57600080fd5b5061048f6105db366004612c05565b6112bb565b3480156105ec57600080fd5b506106006105fb366004612944565b6112f8565b6040516103af9190612c4d565b34801561061957600080fd5b506103a5610628366004612944565b60106020526000908152604090205481565b34801561064657600080fd5b506103a560165481565b34801561065c57600080fd5b5061045761066b3660046129fd565b6113f6565b34801561067c57600080fd5b506103a560175481565b34801561069257600080fd5b5061048f6106a1366004612c91565b611408565b3480156106b257600080fd5b5061048f6106c13660046129fd565b61143d565b3480156106d257600080fd5b506103a56106e1366004612944565b61146c565b3480156106f257600080fd5b5061048f6114ba565b34801561070757600080fd5b50610600610716366004612944565b6114f0565b34801561072757600080fd5b506103a5600f5481565b34801561073d57600080fd5b506103d861074c366004612cd6565b6115b6565b34801561075d57600080fd5b5061048f61076c366004612944565b6115cc565b34801561077d57600080fd5b506008546001600160a01b0316610457565b34801561079b57600080fd5b506103a5611618565b3480156107b057600080fd5b506107c46107bf3660046129fd565b61166c565b6040805182516001600160a01b031681526020808401516001600160401b031690820152918101511515908201526060016103af565b34801561080657600080fd5b5061042a611692565b34801561081b57600080fd5b5061048f61082a366004612c05565b6116a1565b34801561083b57600080fd5b50601554610457906001600160a01b031681565b61048f61085d3660046129fd565b6116de565b34801561086e57600080fd5b5061048f61087d366004612d85565b6117c6565b34801561088e57600080fd5b506103d861089d3660046129fd565b60146020526000908152604090205460ff1681565b3480156108be57600080fd5b5061048f6108cd366004612dbc565b61185b565b3480156108de57600080fd5b506103d86108ed366004612cd6565b611895565b3480156108fe57600080fd5b506103a5600e5481565b34801561091457600080fd5b5061048f610923366004612e37565b6118a4565b34801561093457600080fd5b50610964610943366004612944565b60136020526000908152604090208054600182015460029092015490919083565b604080519384526020840192909252908201526060016103af565b34801561098b57600080fd5b5061042a61099a3660046129fd565b611915565b3480156109ab57600080fd5b5061048f611a5a565b3480156109c057600080fd5b5061048f6109cf3660046129fd565b611b69565b3480156109e057600080fd5b506103a560185481565b3480156109f657600080fd5b506103a5610a05366004612944565b611b98565b348015610a1657600080fd5b506103d8610a25366004612ed4565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b348015610a5f57600080fd5b5061048f610a6e3660046129fd565b611ba3565b348015610a7f57600080fd5b5061048f610a8e3660046129fd565b611bd2565b348015610a9f57600080fd5b5061048f610aae366004612944565b611c01565b348015610abf57600080fd5b5061048f610ace3660046129fd565b611c99565b348015610adf57600080fd5b5061048f610aee3660046129fd565b611cc8565b348015610aff57600080fd5b506103a5610b0e366004612f07565b611cf7565b61048f610b21366004612b08565b611d40565b6001600160a01b0381166000908152601360209081526040808320815160608101835281548152600182015493810184905260029091015491810182905260165442939192859262015180929190610b7e9087612f50565b610b889190612f67565b610b929190612f67565b610b9c9190612f9c565b9050601754826040015110610bd35760646018546064610bbc9190612fb0565b610bc69083612f67565b610bd09190612f9c565b90505b8151610be0908290612fb0565b95945050505050565b60006001600160e01b031982166380ac58cd60e01b1480610c1a57506001600160e01b03198216635b5e139f60e01b145b80610c3557506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060028054610c4a90612fc8565b80601f0160208091040260200160405190810160405280929190818152602001828054610c7690612fc8565b8015610cc35780601f10610c9857610100808354040283529160200191610cc3565b820191906000526020600020905b815481529060010190602001808311610ca657829003601f168201915b5050505050905090565b6000610cd882611f3f565b610cf5576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610d1c826113f6565b9050806001600160a01b0316836001600160a01b031603610d505760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614801590610d705750610d6e8133610a25565b155b15610d8e576040516367d9dca160e11b815260040160405180910390fd5b610d99838383611f6a565b505050565b33600081815260136020526040902090610db790610b26565b81554260018201556000805b83811015610e9c5733610ded868684818110610de157610de1612ffc565b905060200201356113f6565b6001600160a01b0316148015610e33575060146000868684818110610e1457610e14612ffc565b602090810292909201358352508101919091526040016000205460ff16155b15610e8a5781610e4281613012565b925050600160146000878785818110610e5d57610e5d612ffc565b90506020020135815260200190815260200160002060006101000a81548160ff0219169083151502179055505b80610e9481613012565b915050610dc3565b50808260020154610ead9190612fb0565b826002018190555050505050565b610d99838383611fc6565b601254600114610f1d5760405162461bcd60e51b815260206004820152601760248201527f46726565206d696e74206973206e6f74206f70656e656400000000000000000060448201526064015b60405180910390fd5b610f64610f2b338686611cf7565b8383808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506115b692505050565b610fa05760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b210383937b7b360991b6044820152606401610f14565b60095485610fb16001546000540390565b610fbb9190612fb0565b1115610fd95760405162461bcd60e51b8152600401610f149061302b565b336000908152601060205260409020548390610ff6908790612fb0565b111561103e5760405162461bcd60e51b8152602060048201526017602482015276115e18d959591cc813585e08135a5b9d08105b5bdd5b9d604a1b6044820152606401610f14565b61104833866121e7565b33600090815260106020526040902054611063908690612fb0565b336000908152601060205260409020555050505050565b6008546001600160a01b031633146110a45760405162461bcd60e51b8152600401610f1490613057565b6040514790339082156108fc029083906000818181858888f193505050501580156110d3573d6000803e3d6000fd5b5050565b610d998383836040518060200160405280600081525061185b565b6008546001600160a01b0316331461111c5760405162461bcd60e51b8152600401610f1490613057565b600e55565b3360008181526013602052604090209061113a90610b26565b8082554260018301556015546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa15801561118b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111af919061308c565b10156111fd5760405162461bcd60e51b815260206004820152601c60248201527f52657761726420746f6b656e20616d6f756e7420697320736d616c6c000000006044820152606401610f14565b805415611289576015546001600160a01b031663a9059cbb33835460405160e084901b6001600160e01b03191681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015611263573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061128791906130a5565b505b60009055565b600061129a836114f0565b82815181106112ab576112ab612ffc565b6020026020010151905092915050565b6008546001600160a01b031633146112e55760405162461bcd60e51b8152600401610f1490613057565b80516110d390600a90602084019061288f565b6001600160a01b038116600090815260136020526040812060020154606091816001600160401b0381111561132f5761132f612b68565b604051908082528060200260200182016040528015611358578160200160208202803683370190505b5090506000805b600154600054038110156113ec57856001600160a01b0316611380826113f6565b6001600160a01b03161480156113a9575060008181526014602052604090205460ff1615156001145b156113da57808383815181106113c1576113c1612ffc565b6020908102919091010152816113d681613012565b9250505b806113e481613012565b91505061135f565b5090949350505050565b6000611401826121f1565b5192915050565b6008546001600160a01b031633146114325760405162461bcd60e51b8152600401610f1490613057565b601791909155601855565b6008546001600160a01b031633146114675760405162461bcd60e51b8152600401610f1490613057565b600955565b60006001600160a01b038216611495576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600560205260409020546001600160401b031690565b6008546001600160a01b031633146114e45760405162461bcd60e51b8152600401610f1490613057565b6114ee600061230a565b565b606060006114fd8361146c565b90506000816001600160401b0381111561151957611519612b68565b604051908082528060200260200182016040528015611542578160200160208202803683370190505b5090506000805b600154600054038110156113ec57856001600160a01b031661156a826113f6565b6001600160a01b0316036115a4578083838151811061158b5761158b612ffc565b6020908102919091010152816115a081613012565b9250505b806115ae81613012565b915050611549565b60006115c582600c548561235c565b9392505050565b6008546001600160a01b031633146115f65760405162461bcd60e51b8152600401610f1490613057565b601580546001600160a01b0319166001600160a01b0392909216919091179055565b600080805b600154600054038110156116665760008181526014602052604090205460ff161515600103611654578161165081613012565b9250505b8061165e81613012565b91505061161d565b50919050565b6040805160608101825260008082526020820181905291810191909152610c35826121f1565b606060038054610c4a90612fc8565b6008546001600160a01b031633146116cb5760405162461bcd60e51b8152600401610f1490613057565b80516110d390600b90602084019061288f565b6012546003146117305760405162461bcd60e51b815260206004820152601960248201527f5075626c69632073616c65206973206e6f74206f70656e6564000000000000006044820152606401610f14565b600954816117416001546000540390565b61174b9190612fb0565b11156117695760405162461bcd60e51b8152600401610f149061302b565b80600e546117779190612f67565b3410156117b95760405162461bcd60e51b815260206004820152601060248201526f496e7375666669656e742066756e647360801b6044820152606401610f14565b6117c333826121e7565b50565b336001600160a01b038316036117ef5760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b611866848484611fc6565b61187284848484612372565b61188f576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b60006115c582600d548561235c565b6008546001600160a01b031633146118ce5760405162461bcd60e51b8152600401610f1490613057565b60005b8251811015610d995760008382815181106118ee576118ee612ffc565b6020026020010151905061190281846121e7565b508061190d81613012565b9150506118d1565b606061192082611f3f565b6119845760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610f14565b600061198e612475565b90506000815111611a2957600b80546119a690612fc8565b80601f01602080910402602001604051908101604052809291908181526020018280546119d290612fc8565b8015611a1f5780601f106119f457610100808354040283529160200191611a1f565b820191906000526020600020905b815481529060010190602001808311611a0257829003601f168201915b50505050506115c5565b80611a3384612484565b604051602001611a449291906130c2565b6040516020818303038152906040529392505050565b6008546001600160a01b03163314611a845760405162461bcd60e51b8152600401610f1490613057565b6015546040516370a0823160e01b81523060048201526001600160a01b039091169063a9059cbb90339083906370a0823190602401602060405180830381865afa158015611ad6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611afa919061308c565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015611b45573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117c391906130a5565b6008546001600160a01b03163314611b935760405162461bcd60e51b8152600401610f1490613057565b600f55565b6000610c3582612584565b6008546001600160a01b03163314611bcd5760405162461bcd60e51b8152600401610f1490613057565b601655565b6008546001600160a01b03163314611bfc5760405162461bcd60e51b8152600401610f1490613057565b601255565b6008546001600160a01b03163314611c2b5760405162461bcd60e51b8152600401610f1490613057565b6001600160a01b038116611c905760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610f14565b6117c38161230a565b6008546001600160a01b03163314611cc35760405162461bcd60e51b8152600401610f1490613057565b600c55565b6008546001600160a01b03163314611cf25760405162461bcd60e51b8152600401610f1490613057565b600d55565b6040805160208082019490945260609490941b6bffffffffffffffffffffffff191684820152605480850192909252805180850390920182526074909301909252815191012090565b601254600214611d925760405162461bcd60e51b815260206004820152601c60248201527f57686974656c6973742073616c65206973206e6f74206f70656e6564000000006044820152606401610f14565b611dd9611da0338686611cf7565b83838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061189592505050565b611e155760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b210383937b7b360991b6044820152606401610f14565b60095485611e266001546000540390565b611e309190612fb0565b1115611e4e5760405162461bcd60e51b8152600401610f149061302b565b336000908152601160205260409020548390611e6b908790612fb0565b1115611eb35760405162461bcd60e51b8152602060048201526017602482015276115e18d959591cc813585e08135a5b9d08105b5bdd5b9d604a1b6044820152606401610f14565b84600f54611ec19190612f67565b341015611f035760405162461bcd60e51b815260206004820152601060248201526f496e7375666669656e742066756e647360801b6044820152606401610f14565b611f0d33866121e7565b33600090815260116020526040902054611f28908690612fb0565b336000908152601160205260409020555050505050565b6000805482108015610c35575050600090815260046020526040902054600160e01b900460ff161590565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000611fd1826121f1565b80519091506000906001600160a01b0316336001600160a01b03161480611fff57508151611fff9033610a25565b8061201a57503361200f84610ccd565b6001600160a01b0316145b90508061203a57604051632ce44b5f60e11b815260040160405180910390fd5b846001600160a01b031682600001516001600160a01b03161461206f5760405162a1148160e81b815260040160405180910390fd5b6001600160a01b03841661209657604051633a954ecd60e21b815260040160405180910390fd5b6120a385858560016125d9565b6120b36000848460000151611f6a565b6001600160a01b038581166000908152600560209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600490945282852080546001600160e01b031916909417600160a01b42909216919091021790925590860180835291205490911661219d5760005481101561219d57825160008281526004602090815260409091208054918601516001600160401b0316600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b5082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5050505050565b6110d38282612683565b60408051606081018252600080825260208201819052918101829052905482908110156122f157600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff161515918101829052906122ef5780516001600160a01b031615612286579392505050565b5060001901600081815260046020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff16151592810192909252156122ea579392505050565b612286565b505b604051636f96cda160e11b815260040160405180910390fd5b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600082612369858461269d565b14949350505050565b60006001600160a01b0384163b1561246957604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906123b69033908990889088906004016130f1565b6020604051808303816000875af19250505080156123f1575060408051601f3d908101601f191682019092526123ee9181019061312e565b60015b61244f573d80801561241f576040519150601f19603f3d011682016040523d82523d6000602084013e612424565b606091505b508051600003612447576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061246d565b5060015b949350505050565b6060600a8054610c4a90612fc8565b6060816000036124ab5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156124d557806124bf81613012565b91506124ce9050600a83612f9c565b91506124af565b6000816001600160401b038111156124ef576124ef612b68565b6040519080825280601f01601f191660200182016040528015612519576020820181803683370190505b5090505b841561246d5761252e600183612f50565b915061253b600a8661314b565b612546906030612fb0565b60f81b81838151811061255b5761255b612ffc565b60200101906001600160f81b031916908160001a90535061257d600a86612f9c565b945061251d565b60006001600160a01b0382166125ad576040516335ebb31960e01b815260040160405180910390fd5b506001600160a01b0316600090815260056020526040902054600160401b90046001600160401b031690565b6001600160a01b03841615801590612604575060008281526014602052604090205460ff1615156001145b1561188f576001600160a01b038085166000908152601360205260408082209286168252902061263386610b26565b825542600180840191909155600283015461264e9190612f50565b600283015561265c85610b26565b815542600180830191909155600282015461267691612fb0565b6002909101555050505050565b6110d3828260405180602001604052806000815250612711565b600081815b84518110156127095760008582815181106126bf576126bf612ffc565b602002602001015190508083116126e557600083815260208290526040902092506126f6565b600081815260208490526040902092505b508061270181613012565b9150506126a2565b509392505050565b610d9983838360016000546001600160a01b03851661274257604051622e076360e81b815260040160405180910390fd5b836000036127635760405163b562e8dd60e01b815260040160405180910390fd5b61277060008683876125d9565b6001600160a01b038516600081815260056020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168c018116918217600160401b67ffffffffffffffff1990941690921783900481168c018116909202179091558584526004909252822080546001600160e01b031916909317600160a01b42909216919091021790915581905b858110156128865760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a483801561285c575061285a6000888488612372565b155b1561287a576040516368d2bf6b60e11b815260040160405180910390fd5b60019182019101612805565b506000556121e0565b82805461289b90612fc8565b90600052602060002090601f0160209004810192826128bd5760008555612903565b82601f106128d657805160ff1916838001178555612903565b82800160010185558215612903579182015b828111156129035782518255916020019190600101906128e8565b5061290f929150612913565b5090565b5b8082111561290f5760008155600101612914565b80356001600160a01b038116811461293f57600080fd5b919050565b60006020828403121561295657600080fd5b6115c582612928565b6001600160e01b0319811681146117c357600080fd5b60006020828403121561298757600080fd5b81356115c58161295f565b60005b838110156129ad578181015183820152602001612995565b8381111561188f5750506000910152565b600081518084526129d6816020860160208601612992565b601f01601f19169290920160200192915050565b6020815260006115c560208301846129be565b600060208284031215612a0f57600080fd5b5035919050565b60008060408385031215612a2957600080fd5b612a3283612928565b946020939093013593505050565b60008083601f840112612a5257600080fd5b5081356001600160401b03811115612a6957600080fd5b6020830191508360208260051b8501011115612a8457600080fd5b9250929050565b60008060208385031215612a9e57600080fd5b82356001600160401b03811115612ab457600080fd5b612ac085828601612a40565b90969095509350505050565b600080600060608486031215612ae157600080fd5b612aea84612928565b9250612af860208501612928565b9150604084013590509250925092565b600080600080600060808688031215612b2057600080fd5b85359450602086013593506040860135925060608601356001600160401b03811115612b4b57600080fd5b612b5788828901612a40565b969995985093965092949392505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715612ba657612ba6612b68565b604052919050565b60006001600160401b03831115612bc757612bc7612b68565b612bda601f8401601f1916602001612b7e565b9050828152838383011115612bee57600080fd5b828260208301376000602084830101529392505050565b600060208284031215612c1757600080fd5b81356001600160401b03811115612c2d57600080fd5b8201601f81018413612c3e57600080fd5b61246d84823560208401612bae565b6020808252825182820181905260009190848201906040850190845b81811015612c8557835183529284019291840191600101612c69565b50909695505050505050565b60008060408385031215612ca457600080fd5b50508035926020909101359150565b60006001600160401b03821115612ccc57612ccc612b68565b5060051b60200190565b60008060408385031215612ce957600080fd5b823591506020808401356001600160401b03811115612d0757600080fd5b8401601f81018613612d1857600080fd5b8035612d2b612d2682612cb3565b612b7e565b81815260059190911b82018301908381019088831115612d4a57600080fd5b928401925b82841015612d6857833582529284019290840190612d4f565b80955050505050509250929050565b80151581146117c357600080fd5b60008060408385031215612d9857600080fd5b612da183612928565b91506020830135612db181612d77565b809150509250929050565b60008060008060808587031215612dd257600080fd5b612ddb85612928565b9350612de960208601612928565b92506040850135915060608501356001600160401b03811115612e0b57600080fd5b8501601f81018713612e1c57600080fd5b612e2b87823560208401612bae565b91505092959194509250565b60008060408385031215612e4a57600080fd5b82356001600160401b03811115612e6057600080fd5b8301601f81018513612e7157600080fd5b80356020612e81612d2683612cb3565b82815260059290921b83018101918181019088841115612ea057600080fd5b938201935b83851015612ec557612eb685612928565b82529382019390820190612ea5565b98969091013596505050505050565b60008060408385031215612ee757600080fd5b612ef083612928565b9150612efe60208401612928565b90509250929050565b600080600060608486031215612f1c57600080fd5b612f2584612928565b95602085013595506040909401359392505050565b634e487b7160e01b600052601160045260246000fd5b600082821015612f6257612f62612f3a565b500390565b6000816000190483118215151615612f8157612f81612f3a565b500290565b634e487b7160e01b600052601260045260246000fd5b600082612fab57612fab612f86565b500490565b60008219821115612fc357612fc3612f3a565b500190565b600181811c90821680612fdc57607f821691505b60208210810361166657634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b60006001820161302457613024612f3a565b5060010190565b60208082526012908201527145786365656473204d617820537570706c7960701b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60006020828403121561309e57600080fd5b5051919050565b6000602082840312156130b757600080fd5b81516115c581612d77565b600083516130d4818460208801612992565b8351908301906130e8818360208801612992565b01949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613124908301846129be565b9695505050505050565b60006020828403121561314057600080fd5b81516115c58161295f565b60008261315a5761315a612f86565b50069056fea26469706673582212202378591424346896d46a5926cfae2c80ede23085c89bc1eddebe27c9b47eb15b64736f6c634300080d0033

Deployed Bytecode

0x6080604052600436106103805760003560e01c806389aadd49116101d1578063c204642c11610102578063e985e9c5116100a0578063f44cc2801161006f578063f44cc28014610ab3578063f5aa406d14610ad3578063fdaf012514610af3578063ff63cf0114610b1357600080fd5b8063e985e9c514610a0a578063f14560a114610a53578063f29f15af14610a73578063f2fde38b14610a9357600080fd5b8063ca628c78116100dc578063ca628c781461099f578063d49479eb146109b4578063da267bc8146109d4578063dc33e681146109ea57600080fd5b8063c204642c14610908578063c4dd3a9c14610928578063c87b56dd1461097f57600080fd5b806399248ea71161016f578063b5fa408d11610149578063b5fa408d14610882578063b88d4fde146108b2578063bd645454146108d2578063bf8fbbd2146108f257600080fd5b806399248ea71461082f578063a0712d681461084f578063a22cb4651461086257600080fd5b8063920387b4116101ab578063920387b41461078f5780639231ab2a146107a457806395d89b41146107fa57806397bc411c1461080f57600080fd5b806389aadd49146107315780638aee8127146107515780638da5cb5b1461077157600080fd5b806344a0d68a116102b65780636352211e1161025457806370a082311161022357806370a08231146106c6578063715018a6146106e65780638462151c146106fb578063846342ee1461071b57600080fd5b80636352211e14610650578063698e5c44146106705780636ad5f9cc146106865780636f8b44b0146106a657600080fd5b806355f804b31161029057806355f804b3146105c05780635887e325146105e05780635f54db151461060d5780635fbfed3e1461063a57600080fd5b806344a0d68a1461056b5780634641257d1461058b5780634707f44f146105a057600080fd5b80630fbf0a931161032357806326217e20116102fd57806326217e201461050057806332cb6b0c146105205780633ccfd60b1461053657806342842e0e1461054b57600080fd5b80630fbf0a93146104a757806318160ddd146104c757806323b872dd146104e057600080fd5b806306fdde031161035f57806306fdde0314610415578063081812fc14610437578063095ea7b31461046f5780630a82f53b1461049157600080fd5b80628cc2621461038557806301ffc9a7146103b85780630500b0ad146103e8575b600080fd5b34801561039157600080fd5b506103a56103a0366004612944565b610b26565b6040519081526020015b60405180910390f35b3480156103c457600080fd5b506103d86103d3366004612975565b610be9565b60405190151581526020016103af565b3480156103f457600080fd5b506103a5610403366004612944565b60116020526000908152604090205481565b34801561042157600080fd5b5061042a610c3b565b6040516103af91906129ea565b34801561044357600080fd5b506104576104523660046129fd565b610ccd565b6040516001600160a01b0390911681526020016103af565b34801561047b57600080fd5b5061048f61048a366004612a16565b610d11565b005b34801561049d57600080fd5b506103a560125481565b3480156104b357600080fd5b5061048f6104c2366004612a8b565b610d9e565b3480156104d357600080fd5b50600154600054036103a5565b3480156104ec57600080fd5b5061048f6104fb366004612acc565b610ebb565b34801561050c57600080fd5b5061048f61051b366004612b08565b610ec6565b34801561052c57600080fd5b506103a560095481565b34801561054257600080fd5b5061048f61107a565b34801561055757600080fd5b5061048f610566366004612acc565b6110d7565b34801561057757600080fd5b5061048f6105863660046129fd565b6110f2565b34801561059757600080fd5b5061048f611121565b3480156105ac57600080fd5b506103a56105bb366004612a16565b61128f565b3480156105cc57600080fd5b5061048f6105db366004612c05565b6112bb565b3480156105ec57600080fd5b506106006105fb366004612944565b6112f8565b6040516103af9190612c4d565b34801561061957600080fd5b506103a5610628366004612944565b60106020526000908152604090205481565b34801561064657600080fd5b506103a560165481565b34801561065c57600080fd5b5061045761066b3660046129fd565b6113f6565b34801561067c57600080fd5b506103a560175481565b34801561069257600080fd5b5061048f6106a1366004612c91565b611408565b3480156106b257600080fd5b5061048f6106c13660046129fd565b61143d565b3480156106d257600080fd5b506103a56106e1366004612944565b61146c565b3480156106f257600080fd5b5061048f6114ba565b34801561070757600080fd5b50610600610716366004612944565b6114f0565b34801561072757600080fd5b506103a5600f5481565b34801561073d57600080fd5b506103d861074c366004612cd6565b6115b6565b34801561075d57600080fd5b5061048f61076c366004612944565b6115cc565b34801561077d57600080fd5b506008546001600160a01b0316610457565b34801561079b57600080fd5b506103a5611618565b3480156107b057600080fd5b506107c46107bf3660046129fd565b61166c565b6040805182516001600160a01b031681526020808401516001600160401b031690820152918101511515908201526060016103af565b34801561080657600080fd5b5061042a611692565b34801561081b57600080fd5b5061048f61082a366004612c05565b6116a1565b34801561083b57600080fd5b50601554610457906001600160a01b031681565b61048f61085d3660046129fd565b6116de565b34801561086e57600080fd5b5061048f61087d366004612d85565b6117c6565b34801561088e57600080fd5b506103d861089d3660046129fd565b60146020526000908152604090205460ff1681565b3480156108be57600080fd5b5061048f6108cd366004612dbc565b61185b565b3480156108de57600080fd5b506103d86108ed366004612cd6565b611895565b3480156108fe57600080fd5b506103a5600e5481565b34801561091457600080fd5b5061048f610923366004612e37565b6118a4565b34801561093457600080fd5b50610964610943366004612944565b60136020526000908152604090208054600182015460029092015490919083565b604080519384526020840192909252908201526060016103af565b34801561098b57600080fd5b5061042a61099a3660046129fd565b611915565b3480156109ab57600080fd5b5061048f611a5a565b3480156109c057600080fd5b5061048f6109cf3660046129fd565b611b69565b3480156109e057600080fd5b506103a560185481565b3480156109f657600080fd5b506103a5610a05366004612944565b611b98565b348015610a1657600080fd5b506103d8610a25366004612ed4565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b348015610a5f57600080fd5b5061048f610a6e3660046129fd565b611ba3565b348015610a7f57600080fd5b5061048f610a8e3660046129fd565b611bd2565b348015610a9f57600080fd5b5061048f610aae366004612944565b611c01565b348015610abf57600080fd5b5061048f610ace3660046129fd565b611c99565b348015610adf57600080fd5b5061048f610aee3660046129fd565b611cc8565b348015610aff57600080fd5b506103a5610b0e366004612f07565b611cf7565b61048f610b21366004612b08565b611d40565b6001600160a01b0381166000908152601360209081526040808320815160608101835281548152600182015493810184905260029091015491810182905260165442939192859262015180929190610b7e9087612f50565b610b889190612f67565b610b929190612f67565b610b9c9190612f9c565b9050601754826040015110610bd35760646018546064610bbc9190612fb0565b610bc69083612f67565b610bd09190612f9c565b90505b8151610be0908290612fb0565b95945050505050565b60006001600160e01b031982166380ac58cd60e01b1480610c1a57506001600160e01b03198216635b5e139f60e01b145b80610c3557506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060028054610c4a90612fc8565b80601f0160208091040260200160405190810160405280929190818152602001828054610c7690612fc8565b8015610cc35780601f10610c9857610100808354040283529160200191610cc3565b820191906000526020600020905b815481529060010190602001808311610ca657829003601f168201915b5050505050905090565b6000610cd882611f3f565b610cf5576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610d1c826113f6565b9050806001600160a01b0316836001600160a01b031603610d505760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614801590610d705750610d6e8133610a25565b155b15610d8e576040516367d9dca160e11b815260040160405180910390fd5b610d99838383611f6a565b505050565b33600081815260136020526040902090610db790610b26565b81554260018201556000805b83811015610e9c5733610ded868684818110610de157610de1612ffc565b905060200201356113f6565b6001600160a01b0316148015610e33575060146000868684818110610e1457610e14612ffc565b602090810292909201358352508101919091526040016000205460ff16155b15610e8a5781610e4281613012565b925050600160146000878785818110610e5d57610e5d612ffc565b90506020020135815260200190815260200160002060006101000a81548160ff0219169083151502179055505b80610e9481613012565b915050610dc3565b50808260020154610ead9190612fb0565b826002018190555050505050565b610d99838383611fc6565b601254600114610f1d5760405162461bcd60e51b815260206004820152601760248201527f46726565206d696e74206973206e6f74206f70656e656400000000000000000060448201526064015b60405180910390fd5b610f64610f2b338686611cf7565b8383808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506115b692505050565b610fa05760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b210383937b7b360991b6044820152606401610f14565b60095485610fb16001546000540390565b610fbb9190612fb0565b1115610fd95760405162461bcd60e51b8152600401610f149061302b565b336000908152601060205260409020548390610ff6908790612fb0565b111561103e5760405162461bcd60e51b8152602060048201526017602482015276115e18d959591cc813585e08135a5b9d08105b5bdd5b9d604a1b6044820152606401610f14565b61104833866121e7565b33600090815260106020526040902054611063908690612fb0565b336000908152601060205260409020555050505050565b6008546001600160a01b031633146110a45760405162461bcd60e51b8152600401610f1490613057565b6040514790339082156108fc029083906000818181858888f193505050501580156110d3573d6000803e3d6000fd5b5050565b610d998383836040518060200160405280600081525061185b565b6008546001600160a01b0316331461111c5760405162461bcd60e51b8152600401610f1490613057565b600e55565b3360008181526013602052604090209061113a90610b26565b8082554260018301556015546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa15801561118b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111af919061308c565b10156111fd5760405162461bcd60e51b815260206004820152601c60248201527f52657761726420746f6b656e20616d6f756e7420697320736d616c6c000000006044820152606401610f14565b805415611289576015546001600160a01b031663a9059cbb33835460405160e084901b6001600160e01b03191681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015611263573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061128791906130a5565b505b60009055565b600061129a836114f0565b82815181106112ab576112ab612ffc565b6020026020010151905092915050565b6008546001600160a01b031633146112e55760405162461bcd60e51b8152600401610f1490613057565b80516110d390600a90602084019061288f565b6001600160a01b038116600090815260136020526040812060020154606091816001600160401b0381111561132f5761132f612b68565b604051908082528060200260200182016040528015611358578160200160208202803683370190505b5090506000805b600154600054038110156113ec57856001600160a01b0316611380826113f6565b6001600160a01b03161480156113a9575060008181526014602052604090205460ff1615156001145b156113da57808383815181106113c1576113c1612ffc565b6020908102919091010152816113d681613012565b9250505b806113e481613012565b91505061135f565b5090949350505050565b6000611401826121f1565b5192915050565b6008546001600160a01b031633146114325760405162461bcd60e51b8152600401610f1490613057565b601791909155601855565b6008546001600160a01b031633146114675760405162461bcd60e51b8152600401610f1490613057565b600955565b60006001600160a01b038216611495576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600560205260409020546001600160401b031690565b6008546001600160a01b031633146114e45760405162461bcd60e51b8152600401610f1490613057565b6114ee600061230a565b565b606060006114fd8361146c565b90506000816001600160401b0381111561151957611519612b68565b604051908082528060200260200182016040528015611542578160200160208202803683370190505b5090506000805b600154600054038110156113ec57856001600160a01b031661156a826113f6565b6001600160a01b0316036115a4578083838151811061158b5761158b612ffc565b6020908102919091010152816115a081613012565b9250505b806115ae81613012565b915050611549565b60006115c582600c548561235c565b9392505050565b6008546001600160a01b031633146115f65760405162461bcd60e51b8152600401610f1490613057565b601580546001600160a01b0319166001600160a01b0392909216919091179055565b600080805b600154600054038110156116665760008181526014602052604090205460ff161515600103611654578161165081613012565b9250505b8061165e81613012565b91505061161d565b50919050565b6040805160608101825260008082526020820181905291810191909152610c35826121f1565b606060038054610c4a90612fc8565b6008546001600160a01b031633146116cb5760405162461bcd60e51b8152600401610f1490613057565b80516110d390600b90602084019061288f565b6012546003146117305760405162461bcd60e51b815260206004820152601960248201527f5075626c69632073616c65206973206e6f74206f70656e6564000000000000006044820152606401610f14565b600954816117416001546000540390565b61174b9190612fb0565b11156117695760405162461bcd60e51b8152600401610f149061302b565b80600e546117779190612f67565b3410156117b95760405162461bcd60e51b815260206004820152601060248201526f496e7375666669656e742066756e647360801b6044820152606401610f14565b6117c333826121e7565b50565b336001600160a01b038316036117ef5760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b611866848484611fc6565b61187284848484612372565b61188f576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b60006115c582600d548561235c565b6008546001600160a01b031633146118ce5760405162461bcd60e51b8152600401610f1490613057565b60005b8251811015610d995760008382815181106118ee576118ee612ffc565b6020026020010151905061190281846121e7565b508061190d81613012565b9150506118d1565b606061192082611f3f565b6119845760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610f14565b600061198e612475565b90506000815111611a2957600b80546119a690612fc8565b80601f01602080910402602001604051908101604052809291908181526020018280546119d290612fc8565b8015611a1f5780601f106119f457610100808354040283529160200191611a1f565b820191906000526020600020905b815481529060010190602001808311611a0257829003601f168201915b50505050506115c5565b80611a3384612484565b604051602001611a449291906130c2565b6040516020818303038152906040529392505050565b6008546001600160a01b03163314611a845760405162461bcd60e51b8152600401610f1490613057565b6015546040516370a0823160e01b81523060048201526001600160a01b039091169063a9059cbb90339083906370a0823190602401602060405180830381865afa158015611ad6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611afa919061308c565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015611b45573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117c391906130a5565b6008546001600160a01b03163314611b935760405162461bcd60e51b8152600401610f1490613057565b600f55565b6000610c3582612584565b6008546001600160a01b03163314611bcd5760405162461bcd60e51b8152600401610f1490613057565b601655565b6008546001600160a01b03163314611bfc5760405162461bcd60e51b8152600401610f1490613057565b601255565b6008546001600160a01b03163314611c2b5760405162461bcd60e51b8152600401610f1490613057565b6001600160a01b038116611c905760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610f14565b6117c38161230a565b6008546001600160a01b03163314611cc35760405162461bcd60e51b8152600401610f1490613057565b600c55565b6008546001600160a01b03163314611cf25760405162461bcd60e51b8152600401610f1490613057565b600d55565b6040805160208082019490945260609490941b6bffffffffffffffffffffffff191684820152605480850192909252805180850390920182526074909301909252815191012090565b601254600214611d925760405162461bcd60e51b815260206004820152601c60248201527f57686974656c6973742073616c65206973206e6f74206f70656e6564000000006044820152606401610f14565b611dd9611da0338686611cf7565b83838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061189592505050565b611e155760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b210383937b7b360991b6044820152606401610f14565b60095485611e266001546000540390565b611e309190612fb0565b1115611e4e5760405162461bcd60e51b8152600401610f149061302b565b336000908152601160205260409020548390611e6b908790612fb0565b1115611eb35760405162461bcd60e51b8152602060048201526017602482015276115e18d959591cc813585e08135a5b9d08105b5bdd5b9d604a1b6044820152606401610f14565b84600f54611ec19190612f67565b341015611f035760405162461bcd60e51b815260206004820152601060248201526f496e7375666669656e742066756e647360801b6044820152606401610f14565b611f0d33866121e7565b33600090815260116020526040902054611f28908690612fb0565b336000908152601160205260409020555050505050565b6000805482108015610c35575050600090815260046020526040902054600160e01b900460ff161590565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000611fd1826121f1565b80519091506000906001600160a01b0316336001600160a01b03161480611fff57508151611fff9033610a25565b8061201a57503361200f84610ccd565b6001600160a01b0316145b90508061203a57604051632ce44b5f60e11b815260040160405180910390fd5b846001600160a01b031682600001516001600160a01b03161461206f5760405162a1148160e81b815260040160405180910390fd5b6001600160a01b03841661209657604051633a954ecd60e21b815260040160405180910390fd5b6120a385858560016125d9565b6120b36000848460000151611f6a565b6001600160a01b038581166000908152600560209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600490945282852080546001600160e01b031916909417600160a01b42909216919091021790925590860180835291205490911661219d5760005481101561219d57825160008281526004602090815260409091208054918601516001600160401b0316600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b5082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5050505050565b6110d38282612683565b60408051606081018252600080825260208201819052918101829052905482908110156122f157600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff161515918101829052906122ef5780516001600160a01b031615612286579392505050565b5060001901600081815260046020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff16151592810192909252156122ea579392505050565b612286565b505b604051636f96cda160e11b815260040160405180910390fd5b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600082612369858461269d565b14949350505050565b60006001600160a01b0384163b1561246957604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906123b69033908990889088906004016130f1565b6020604051808303816000875af19250505080156123f1575060408051601f3d908101601f191682019092526123ee9181019061312e565b60015b61244f573d80801561241f576040519150601f19603f3d011682016040523d82523d6000602084013e612424565b606091505b508051600003612447576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061246d565b5060015b949350505050565b6060600a8054610c4a90612fc8565b6060816000036124ab5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156124d557806124bf81613012565b91506124ce9050600a83612f9c565b91506124af565b6000816001600160401b038111156124ef576124ef612b68565b6040519080825280601f01601f191660200182016040528015612519576020820181803683370190505b5090505b841561246d5761252e600183612f50565b915061253b600a8661314b565b612546906030612fb0565b60f81b81838151811061255b5761255b612ffc565b60200101906001600160f81b031916908160001a90535061257d600a86612f9c565b945061251d565b60006001600160a01b0382166125ad576040516335ebb31960e01b815260040160405180910390fd5b506001600160a01b0316600090815260056020526040902054600160401b90046001600160401b031690565b6001600160a01b03841615801590612604575060008281526014602052604090205460ff1615156001145b1561188f576001600160a01b038085166000908152601360205260408082209286168252902061263386610b26565b825542600180840191909155600283015461264e9190612f50565b600283015561265c85610b26565b815542600180830191909155600282015461267691612fb0565b6002909101555050505050565b6110d3828260405180602001604052806000815250612711565b600081815b84518110156127095760008582815181106126bf576126bf612ffc565b602002602001015190508083116126e557600083815260208290526040902092506126f6565b600081815260208490526040902092505b508061270181613012565b9150506126a2565b509392505050565b610d9983838360016000546001600160a01b03851661274257604051622e076360e81b815260040160405180910390fd5b836000036127635760405163b562e8dd60e01b815260040160405180910390fd5b61277060008683876125d9565b6001600160a01b038516600081815260056020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168c018116918217600160401b67ffffffffffffffff1990941690921783900481168c018116909202179091558584526004909252822080546001600160e01b031916909317600160a01b42909216919091021790915581905b858110156128865760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a483801561285c575061285a6000888488612372565b155b1561287a576040516368d2bf6b60e11b815260040160405180910390fd5b60019182019101612805565b506000556121e0565b82805461289b90612fc8565b90600052602060002090601f0160209004810192826128bd5760008555612903565b82601f106128d657805160ff1916838001178555612903565b82800160010185558215612903579182015b828111156129035782518255916020019190600101906128e8565b5061290f929150612913565b5090565b5b8082111561290f5760008155600101612914565b80356001600160a01b038116811461293f57600080fd5b919050565b60006020828403121561295657600080fd5b6115c582612928565b6001600160e01b0319811681146117c357600080fd5b60006020828403121561298757600080fd5b81356115c58161295f565b60005b838110156129ad578181015183820152602001612995565b8381111561188f5750506000910152565b600081518084526129d6816020860160208601612992565b601f01601f19169290920160200192915050565b6020815260006115c560208301846129be565b600060208284031215612a0f57600080fd5b5035919050565b60008060408385031215612a2957600080fd5b612a3283612928565b946020939093013593505050565b60008083601f840112612a5257600080fd5b5081356001600160401b03811115612a6957600080fd5b6020830191508360208260051b8501011115612a8457600080fd5b9250929050565b60008060208385031215612a9e57600080fd5b82356001600160401b03811115612ab457600080fd5b612ac085828601612a40565b90969095509350505050565b600080600060608486031215612ae157600080fd5b612aea84612928565b9250612af860208501612928565b9150604084013590509250925092565b600080600080600060808688031215612b2057600080fd5b85359450602086013593506040860135925060608601356001600160401b03811115612b4b57600080fd5b612b5788828901612a40565b969995985093965092949392505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715612ba657612ba6612b68565b604052919050565b60006001600160401b03831115612bc757612bc7612b68565b612bda601f8401601f1916602001612b7e565b9050828152838383011115612bee57600080fd5b828260208301376000602084830101529392505050565b600060208284031215612c1757600080fd5b81356001600160401b03811115612c2d57600080fd5b8201601f81018413612c3e57600080fd5b61246d84823560208401612bae565b6020808252825182820181905260009190848201906040850190845b81811015612c8557835183529284019291840191600101612c69565b50909695505050505050565b60008060408385031215612ca457600080fd5b50508035926020909101359150565b60006001600160401b03821115612ccc57612ccc612b68565b5060051b60200190565b60008060408385031215612ce957600080fd5b823591506020808401356001600160401b03811115612d0757600080fd5b8401601f81018613612d1857600080fd5b8035612d2b612d2682612cb3565b612b7e565b81815260059190911b82018301908381019088831115612d4a57600080fd5b928401925b82841015612d6857833582529284019290840190612d4f565b80955050505050509250929050565b80151581146117c357600080fd5b60008060408385031215612d9857600080fd5b612da183612928565b91506020830135612db181612d77565b809150509250929050565b60008060008060808587031215612dd257600080fd5b612ddb85612928565b9350612de960208601612928565b92506040850135915060608501356001600160401b03811115612e0b57600080fd5b8501601f81018713612e1c57600080fd5b612e2b87823560208401612bae565b91505092959194509250565b60008060408385031215612e4a57600080fd5b82356001600160401b03811115612e6057600080fd5b8301601f81018513612e7157600080fd5b80356020612e81612d2683612cb3565b82815260059290921b83018101918181019088841115612ea057600080fd5b938201935b83851015612ec557612eb685612928565b82529382019390820190612ea5565b98969091013596505050505050565b60008060408385031215612ee757600080fd5b612ef083612928565b9150612efe60208401612928565b90509250929050565b600080600060608486031215612f1c57600080fd5b612f2584612928565b95602085013595506040909401359392505050565b634e487b7160e01b600052601160045260246000fd5b600082821015612f6257612f62612f3a565b500390565b6000816000190483118215151615612f8157612f81612f3a565b500290565b634e487b7160e01b600052601260045260246000fd5b600082612fab57612fab612f86565b500490565b60008219821115612fc357612fc3612f3a565b500190565b600181811c90821680612fdc57607f821691505b60208210810361166657634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b60006001820161302457613024612f3a565b5060010190565b60208082526012908201527145786365656473204d617820537570706c7960701b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60006020828403121561309e57600080fd5b5051919050565b6000602082840312156130b757600080fd5b81516115c581612d77565b600083516130d4818460208801612992565b8351908301906130e8818360208801612992565b01949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613124908301846129be565b9695505050505050565b60006020828403121561314057600080fd5b81516115c58161295f565b60008261315a5761315a612f86565b50069056fea26469706673582212202378591424346896d46a5926cfae2c80ede23085c89bc1eddebe27c9b47eb15b64736f6c634300080d0033

Deployed Bytecode Sourcemap

50427:10023:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57841:455;;;;;;;;;;-1:-1:-1;57841:455:0;;;;;:::i;:::-;;:::i;:::-;;;529:25:1;;;517:2;502:18;57841:455:0;;;;;;;;33196:305;;;;;;;;;;-1:-1:-1;33196:305:0;;;;;:::i;:::-;;:::i;:::-;;;1116:14:1;;1109:22;1091:41;;1079:2;1064:18;33196:305:0;951:187:1;50841:55:0;;;;;;;;;;-1:-1:-1;50841:55:0;;;;;:::i;:::-;;;;;;;;;;;;;;36556:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;38059:204::-;;;;;;;;;;-1:-1:-1;38059:204:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2243:32:1;;;2225:51;;2213:2;2198:18;38059:204:0;2079:203:1;37622:371:0;;;;;;;;;;-1:-1:-1;37622:371:0;;;;;:::i;:::-;;:::i;:::-;;50905:30;;;;;;;;;;;;;;;;58306:628;;;;;;;;;;-1:-1:-1;58306:628:0;;;;;:::i;:::-;;:::i;32853:271::-;;;;;;;;;;-1:-1:-1;33089:12:0;;32897:7;33073:13;:28;32853:271;;38916:170;;;;;;;;;;-1:-1:-1;38916:170:0;;;;;:::i;:::-;;:::i;52947:630::-;;;;;;;;;;-1:-1:-1;52947:630:0;;;;;:::i;:::-;;:::i;50510:32::-;;;;;;;;;;;;;;;;60163:143;;;;;;;;;;;;;:::i;39157:185::-;;;;;;;;;;-1:-1:-1;39157:185:0;;;;;:::i;:::-;;:::i;55458:86::-;;;;;;;;;;-1:-1:-1;55458:86:0;;;;;:::i;:::-;;:::i;58942:447::-;;;;;;;;;;;;;:::i;56386:147::-;;;;;;;;;;-1:-1:-1;56386:147:0;;;;;:::i;:::-;;:::i;55768:105::-;;;;;;;;;;-1:-1:-1;55768:105:0;;;;;:::i;:::-;;:::i;57011:524::-;;;;;;;;;;-1:-1:-1;57011:524:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;50784:50::-;;;;;;;;;;-1:-1:-1;50784:50:0;;;;;:::i;:::-;;;;;;;;;;;;;;51276:47;;;;;;;;;;;;;;;;36365:124;;;;;;;;;;-1:-1:-1;36365:124:0;;;;;:::i;:::-;;:::i;51330:37::-;;;;;;;;;;;;;;;;51745:175;;;;;;;;;;-1:-1:-1;51745:175:0;;;;;:::i;:::-;;:::i;55665:95::-;;;;;;;;;;-1:-1:-1;55665:95:0;;;;;:::i;:::-;;:::i;33565:206::-;;;;;;;;;;-1:-1:-1;33565:206:0;;;;;:::i;:::-;;:::i;15255:103::-;;;;;;;;;;;;;:::i;56541:462::-;;;;;;;;;;-1:-1:-1;56541:462:0;;;;;:::i;:::-;;:::i;50729:42::-;;;;;;;;;;;;;;;;52189:171;;;;;;;;;;-1:-1:-1;52189:171:0;;;;;:::i;:::-;;:::i;51488:119::-;;;;;;;;;;-1:-1:-1;51488:119:0;;;;;:::i;:::-;;:::i;14604:87::-;;;;;;;;;;-1:-1:-1;14677:6:0;;-1:-1:-1;;;;;14677:6:0;14604:87;;57543:290;;;;;;;;;;;;;:::i;56243:135::-;;;;;;;;;;-1:-1:-1;56243:135:0;;;;;:::i;:::-;;:::i;:::-;;;;7894:13:1;;-1:-1:-1;;;;;7890:39:1;7872:58;;7990:4;7978:17;;;7972:24;-1:-1:-1;;;;;7968:49:1;7946:20;;;7939:79;8076:17;;;8070:24;8063:32;8056:40;8034:20;;;8027:70;7860:2;7845:18;56243:135:0;7662:441:1;36725:104:0;;;;;;;;;;;;;:::i;55881:121::-;;;;;;;;;;-1:-1:-1;55881:121:0;;;;;:::i;:::-;;:::i;51243:26::-;;;;;;;;;;-1:-1:-1;51243:26:0;;;;-1:-1:-1;;;;;51243:26:0;;;54351:338;;;;;;:::i;:::-;;:::i;38335:279::-;;;;;;;;;;-1:-1:-1;38335:279:0;;;;;:::i;:::-;;:::i;51182:48::-;;;;;;;;;;-1:-1:-1;51182:48:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;39413:342;;;;;;;;;;-1:-1:-1;39413:342:0;;;;;:::i;:::-;;:::i;52368:173::-;;;;;;;;;;-1:-1:-1;52368:173:0;;;;;:::i;:::-;;:::i;50690:32::-;;;;;;;;;;;;;;;;54697:265;;;;;;;;;;-1:-1:-1;54697:265:0;;;;;:::i;:::-;;:::i;51113:62::-;;;;;;;;;;-1:-1:-1;51113:62:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10618:25:1;;;10674:2;10659:18;;10652:34;;;;10702:18;;;10695:34;10606:2;10591:18;51113:62:0;10416:319:1;55087:363:0;;;;;;;;;;-1:-1:-1;55087:363:0;;;;;:::i;:::-;;:::i;60314:133::-;;;;;;;;;;;;;:::i;55552:105::-;;;;;;;;;;-1:-1:-1;55552:105:0;;;;;:::i;:::-;;:::i;51374:33::-;;;;;;;;;;;;;;;;52824:115;;;;;;;;;;-1:-1:-1;52824:115:0;;;;;:::i;:::-;;:::i;38685:164::-;;;;;;;;;;-1:-1:-1;38685:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;38806:25:0;;;38782:4;38806:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;38685:164;51615:122;;;;;;;;;;-1:-1:-1;51615:122:0;;;;;:::i;:::-;;:::i;56010:97::-;;;;;;;;;;-1:-1:-1;56010:97:0;;;;;:::i;:::-;;:::i;15513:201::-;;;;;;;;;;-1:-1:-1;15513:201:0;;;;;:::i;:::-;;:::i;52035:97::-;;;;;;;;;;-1:-1:-1;52035:97:0;;;;;:::i;:::-;;:::i;51928:99::-;;;;;;;;;;-1:-1:-1;51928:99:0;;;;;:::i;:::-;;:::i;52645:171::-;;;;;;;;;;-1:-1:-1;52645:171:0;;;;;:::i;:::-;;:::i;53585:743::-;;;;;;:::i;:::-;;:::i;57841:455::-;-1:-1:-1;;;;;57992:29:0;;57895:7;57992:29;;;:20;:29;;;;;;;;57963:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58105:19;;57935:15;;57963:58;;57895:7;;58128:6;;58105:19;57963:58;58052:28;;57935:15;58052:28;:::i;:::-;58051:51;;;;:::i;:::-;:73;;;;:::i;:::-;:84;;;;:::i;:::-;58034:101;;58174:17;;58152:4;:18;;;:39;58148:91;;58236:3;58219:13;;58213:3;:19;;;;:::i;:::-;58203:30;;:6;:30;:::i;:::-;:36;;;;:::i;:::-;58194:45;;58148:91;58267:12;;:21;;58282:6;;58267:21;:::i;:::-;58260:28;57841:455;-1:-1:-1;;;;;57841:455:0:o;33196:305::-;33298:4;-1:-1:-1;;;;;;33335:40:0;;-1:-1:-1;;;33335:40:0;;:105;;-1:-1:-1;;;;;;;33392:48:0;;-1:-1:-1;;;33392:48:0;33335:105;:158;;;-1:-1:-1;;;;;;;;;;11540:40:0;;;33457:36;33315:178;33196:305;-1:-1:-1;;33196:305:0:o;36556:100::-;36610:13;36643:5;36636:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36556:100;:::o;38059:204::-;38127:7;38152:16;38160:7;38152;:16::i;:::-;38147:64;;38177:34;;-1:-1:-1;;;38177:34:0;;;;;;;;;;;38147:64;-1:-1:-1;38231:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;38231:24:0;;38059:204::o;37622:371::-;37695:13;37711:24;37727:7;37711:15;:24::i;:::-;37695:40;;37756:5;-1:-1:-1;;;;;37750:11:0;:2;-1:-1:-1;;;;;37750:11:0;;37746:48;;37770:24;;-1:-1:-1;;;37770:24:0;;;;;;;;;;;37746:48;13408:10;-1:-1:-1;;;;;37811:21:0;;;;;;:63;;-1:-1:-1;37837:37:0;37854:5;13408:10;38685:164;:::i;37837:37::-;37836:38;37811:63;37807:138;;;37898:35;;-1:-1:-1;;;37898:35:0;;;;;;;;;;;37807:138;37957:28;37966:2;37970:7;37979:5;37957:8;:28::i;:::-;37684:309;37622:371;;:::o;58306:628::-;13408:10;58375:27;58405:34;;;:20;:34;;;;;;58465:20;;57841:455;:::i;58465:20::-;58450:35;;58515:15;58496:16;;;:34;58450:12;;58580:278;58600:23;;;58580:278;;;13408:10;58649:24;58657:12;;58670:1;58657:15;;;;;;;:::i;:::-;;;;;;;58649:7;:24::i;:::-;-1:-1:-1;;;;;58649:40:0;;:86;;;;;58693:16;:33;58710:12;;58723:1;58710:15;;;;;;;:::i;:::-;;;;;;;;;;58693:33;;-1:-1:-1;58693:33:0;;;;;;;;-1:-1:-1;58693:33:0;;;;:42;58649:86;58645:202;;;58756:16;;;;:::i;:::-;;;;58827:4;58791:16;:33;58808:12;;58821:1;58808:15;;;;;;;:::i;:::-;;;;;;;58791:33;;;;;;;;;;;;:40;;;;;;;;;;;;;;;;;;58645:202;58625:3;;;;:::i;:::-;;;;58580:278;;;;58912:14;58891:4;:18;;;:35;;;;:::i;:::-;58870:4;:18;;:56;;;;58364:570;;58306:628;;:::o;38916:170::-;39050:28;39060:4;39066:2;39070:7;39050:9;:28::i;52947:630::-;53078:11;;53093:1;53078:16;53070:52;;;;-1:-1:-1;;;53070:52:0;;13383:2:1;53070:52:0;;;13365:21:1;13422:2;13402:18;;;13395:30;13461:25;13441:18;;;13434:53;13504:18;;53070:52:0;;;;;;;;;53143:57;53156:35;53163:10;53175:6;53183:7;53156:6;:35::i;:::-;53193:6;;53143:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53143:12:0;;-1:-1:-1;;;53143:57:0:i;:::-;53135:83;;;;-1:-1:-1;;;53135:83:0;;13735:2:1;53135:83:0;;;13717:21:1;13774:2;13754:18;;;13747:30;-1:-1:-1;;;13793:18:1;;;13786:43;13846:18;;53135:83:0;13533:337:1;53135:83:0;53278:10;;53263:11;53247:13;33089:12;;32897:7;33073:13;:28;;32853:271;53247:13;:27;;;;:::i;:::-;:41;;53239:72;;;;-1:-1:-1;;;53239:72:0;;;;;;;:::i;:::-;53357:10;53341:27;;;;:15;:27;;;;;;53387:7;;53341:41;;53371:11;;53341:41;:::i;:::-;53340:54;;53332:90;;;;-1:-1:-1;;;53332:90:0;;14424:2:1;53332:90:0;;;14406:21:1;14463:2;14443:18;;;14436:30;-1:-1:-1;;;14482:18:1;;;14475:53;14545:18;;53332:90:0;14222:347:1;53332:90:0;53451:34;53461:10;53473:11;53451:9;:34::i;:::-;53544:10;53528:27;;;;:15;:27;;;;;;:41;;53558:11;;53528:41;:::i;:::-;53514:10;53498:27;;;;:15;:27;;;;;:71;-1:-1:-1;;;;;52947:630:0:o;60163:143::-;14677:6;;-1:-1:-1;;;;;14677:6:0;13408:10;14824:23;14816:68;;;;-1:-1:-1;;;14816:68:0;;;;;;;:::i;:::-;60261:37:::1;::::0;60229:21:::1;::::0;60269:10:::1;::::0;60261:37;::::1;;;::::0;60229:21;;60211:15:::1;60261:37:::0;60211:15;60261:37;60229:21;60269:10;60261:37;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;60200:106;60163:143::o:0;39157:185::-;39295:39;39312:4;39318:2;39322:7;39295:39;;;;;;;;;;;;:16;:39::i;55458:86::-;14677:6;;-1:-1:-1;;;;;14677:6:0;13408:10;14824:23;14816:68;;;;-1:-1:-1;;;14816:68:0;;;;;;;:::i;:::-;55521:4:::1;:15:::0;55458:86::o;58942:447::-;13408:10;58981:27;59011:34;;;:20;:34;;;;;;59071:20;;57841:455;:::i;59071:20::-;59056:35;;;59121:15;59102:16;;;:34;59157:12;;:37;;-1:-1:-1;;;59157:37:0;;59188:4;59157:37;;;2225:51:1;-1:-1:-1;;;;;59157:12:0;;;;:22;;2198:18:1;;59157:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:53;;59149:93;;;;-1:-1:-1;;;59149:93:0;;15326:2:1;59149:93:0;;;15308:21:1;15365:2;15345:18;;;15338:30;15404;15384:18;;;15377:58;15452:18;;59149:93:0;15124:352:1;59149:93:0;59259:12;;:16;59255:98;;59292:12;;-1:-1:-1;;;;;59292:12:0;:21;13408:10;59328:12;;59292:49;;;;;;-1:-1:-1;;;;;;59292:49:0;;;-1:-1:-1;;;;;15673:32:1;;;59292:49:0;;;15655:51:1;15722:18;;;15715:34;15628:18;;59292:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;59255:98;59380:1;59365:16;;58942:447::o;56386:147::-;56469:7;56496:21;56510:6;56496:13;:21::i;:::-;56518:6;56496:29;;;;;;;;:::i;:::-;;;;;;;56489:36;;56386:147;;;;:::o;55768:105::-;14677:6;;-1:-1:-1;;;;;14677:6:0;13408:10;14824:23;14816:68;;;;-1:-1:-1;;;14816:68:0;;;;;;;:::i;:::-;55843:22;;::::1;::::0;:8:::1;::::0;:22:::1;::::0;::::1;::::0;::::1;:::i;57011:524::-:0;-1:-1:-1;;;;;57128:28:0;;57106:19;57128:28;;;:20;:28;;;;;:42;;;57077:16;;57128:42;-1:-1:-1;;;;;57210:26:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57210:26:0;;57181:55;;57247:19;57286:9;57281:220;33089:12;;32897:7;33073:13;:28;57301:1;:17;57281:220;;;57358:6;-1:-1:-1;;;;;57344:20:0;:10;57352:1;57344:7;:10::i;:::-;-1:-1:-1;;;;;57344:20:0;;:51;;;;-1:-1:-1;57368:19:0;;;;:16;:19;;;;;;;;:27;;:19;:27;57344:51;57340:150;;;57441:1;57416:9;57426:11;57416:22;;;;;;;;:::i;:::-;;;;;;;;;;:26;57461:13;;;;:::i;:::-;;;;57340:150;57320:3;;;;:::i;:::-;;;;57281:220;;;-1:-1:-1;57518:9:0;;57011:524;-1:-1:-1;;;;57011:524:0:o;36365:124::-;36429:7;36456:20;36468:7;36456:11;:20::i;:::-;:25;;36365:124;-1:-1:-1;;36365:124:0:o;51745:175::-;14677:6;;-1:-1:-1;;;;;14677:6:0;13408:10;14824:23;14816:68;;;;-1:-1:-1;;;14816:68:0;;;;;;;:::i;:::-;51841:17:::1;:31:::0;;;;51883:13:::1;:29:::0;51745:175::o;55665:95::-;14677:6;;-1:-1:-1;;;;;14677:6:0;13408:10;14824:23;14816:68;;;;-1:-1:-1;;;14816:68:0;;;;;;;:::i;:::-;55732:10:::1;:20:::0;55665:95::o;33565:206::-;33629:7;-1:-1:-1;;;;;33653:19:0;;33649:60;;33681:28;;-1:-1:-1;;;33681:28:0;;;;;;;;;;;33649:60;-1:-1:-1;;;;;;33735:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;33735:27:0;;33565:206::o;15255:103::-;14677:6;;-1:-1:-1;;;;;14677:6:0;13408:10;14824:23;14816:68;;;;-1:-1:-1;;;14816:68:0;;;;;;;:::i;:::-;15320:30:::1;15347:1;15320:18;:30::i;:::-;15255:103::o:0;56541:462::-;56601:16;56630:19;56652:17;56662:6;56652:9;:17::i;:::-;56630:39;;56680:26;56723:11;-1:-1:-1;;;;;56709:26:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56709:26:0;;56680:55;;56746:19;56785:9;56780:189;33089:12;;32897:7;33073:13;:28;56800:1;:17;56780:189;;;56857:6;-1:-1:-1;;;;;56843:20:0;:10;56851:1;56843:7;:10::i;:::-;-1:-1:-1;;;;;56843:20:0;;56839:119;;56909:1;56884:9;56894:11;56884:22;;;;;;;;:::i;:::-;;;;;;;;;;:26;56929:13;;;;:::i;:::-;;;;56839:119;56819:3;;;;:::i;:::-;;;;56780:189;;52189:171;52276:4;52300:52;52319:6;52327:13;;52342:9;52300:18;:52::i;:::-;52293:59;52189:171;-1:-1:-1;;;52189:171:0:o;51488:119::-;14677:6;;-1:-1:-1;;;;;14677:6:0;13408:10;14824:23;14816:68;;;;-1:-1:-1;;;14816:68:0;;;;;;;:::i;:::-;51563:12:::1;:36:::0;;-1:-1:-1;;;;;;51563:36:0::1;-1:-1:-1::0;;;;;51563:36:0;;;::::1;::::0;;;::::1;::::0;;51488:119::o;57543:290::-;57592:7;;;57646:151;33089:12;;32897:7;33073:13;:28;57666:1;:17;57646:151;;;57709:19;;;;:16;:19;;;;;;;;:27;;:19;:27;57705:81;;57757:13;;;;:::i;:::-;;;;57705:81;57685:3;;;;:::i;:::-;;;;57646:151;;;-1:-1:-1;57814:11:0;57543:290;-1:-1:-1;57543:290:0:o;56243:135::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;56350:20:0;56362:7;56350:11;:20::i;36725:104::-;36781:13;36814:7;36807:14;;;;;:::i;55881:121::-;14677:6;;-1:-1:-1;;;;;14677:6:0;13408:10;14824:23;14816:68;;;;-1:-1:-1;;;14816:68:0;;;;;;;:::i;:::-;55964:30;;::::1;::::0;:12:::1;::::0;:30:::1;::::0;::::1;::::0;::::1;:::i;54351:338::-:0;54422:11;;54437:1;54422:16;54414:54;;;;-1:-1:-1;;;54414:54:0;;16212:2:1;54414:54:0;;;16194:21:1;16251:2;16231:18;;;16224:30;16290:27;16270:18;;;16263:55;16335:18;;54414:54:0;16010:349:1;54414:54:0;54520:10;;54505:11;54489:13;33089:12;;32897:7;33073:13;:28;;32853:271;54489:13;:27;;;;:::i;:::-;:41;;54481:72;;;;-1:-1:-1;;;54481:72:0;;;;;;;:::i;:::-;54602:11;54595:4;;:18;;;;:::i;:::-;54582:9;:31;;54574:60;;;;-1:-1:-1;;;54574:60:0;;16566:2:1;54574:60:0;;;16548:21:1;16605:2;16585:18;;;16578:30;-1:-1:-1;;;16624:18:1;;;16617:46;16680:18;;54574:60:0;16364:340:1;54574:60:0;54647:34;54657:10;54669:11;54647:9;:34::i;:::-;54351:338;:::o;38335:279::-;13408:10;-1:-1:-1;;;;;38426:24:0;;;38422:54;;38459:17;;-1:-1:-1;;;38459:17:0;;;;;;;;;;;38422:54;13408:10;38489:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;38489:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;38489:53:0;;;;;;;;;;38558:48;;1091:41:1;;;38489:42:0;;13408:10;38558:48;;1064:18:1;38558:48:0;;;;;;;38335:279;;:::o;39413:342::-;39580:28;39590:4;39596:2;39600:7;39580:9;:28::i;:::-;39624:48;39647:4;39653:2;39657:7;39666:5;39624:22;:48::i;:::-;39619:129;;39696:40;;-1:-1:-1;;;39696:40:0;;;;;;;;;;;39619:129;39413:342;;;;:::o;52368:173::-;52456:4;52480:53;52499:6;52507:14;;52523:9;52480:18;:53::i;54697:265::-;14677:6;;-1:-1:-1;;;;;14677:6:0;13408:10;14824:23;14816:68;;;;-1:-1:-1;;;14816:68:0;;;;;;;:::i;:::-;54804:9:::1;54799:156;54823:17;:24;54819:1;:28;54799:156;;;54869:10;54882:17;54900:1;54882:20;;;;;;;;:::i;:::-;;;;;;;54869:33;;54917:26;54927:2;54931:11;54917:9;:26::i;:::-;-1:-1:-1::0;54849:3:0;::::1;::::0;::::1;:::i;:::-;;;;54799:156;;55087:363:::0;55160:13;55194:16;55202:7;55194;:16::i;:::-;55186:76;;;;-1:-1:-1;;;55186:76:0;;16911:2:1;55186:76:0;;;16893:21:1;16950:2;16930:18;;;16923:30;16989:34;16969:18;;;16962:62;-1:-1:-1;;;17040:18:1;;;17033:45;17095:19;;55186:76:0;16709:411:1;55186:76:0;55273:28;55304:10;:8;:10::i;:::-;55273:41;;55363:1;55338:14;55332:28;:32;:110;;55430:12;55332:110;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55391:14;55407:18;:7;:16;:18::i;:::-;55374:52;;;;;;;;;:::i;:::-;;;;;;;;;;;;;55325:117;55087:363;-1:-1:-1;;;55087:363:0:o;60314:133::-;14677:6;;-1:-1:-1;;;;;14677:6:0;13408:10;14824:23;14816:68;;;;-1:-1:-1;;;14816:68:0;;;;;;;:::i;:::-;60367:12:::1;::::0;60401:37:::1;::::0;-1:-1:-1;;;60401:37:0;;60432:4:::1;60401:37;::::0;::::1;2225:51:1::0;-1:-1:-1;;;;;60367:12:0;;::::1;::::0;:21:::1;::::0;60389:10:::1;::::0;60367:12;;60401:22:::1;::::0;2198:18:1;;60401:37:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60367:72;::::0;-1:-1:-1;;;;;;60367:72:0::1;::::0;;;;;;-1:-1:-1;;;;;15673:32:1;;;60367:72:0::1;::::0;::::1;15655:51:1::0;15722:18;;;15715:34;15628:18;;60367:72:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;55552:105::-:0;14677:6;;-1:-1:-1;;;;;14677:6:0;13408:10;14824:23;14816:68;;;;-1:-1:-1;;;14816:68:0;;;;;;;:::i;:::-;55624:14:::1;:25:::0;55552:105::o;52824:115::-;52883:7;52910:21;52924:6;52910:13;:21::i;51615:122::-;14677:6;;-1:-1:-1;;;;;14677:6:0;13408:10;14824:23;14816:68;;;;-1:-1:-1;;;14816:68:0;;;;;;;:::i;:::-;51695:19:::1;:34:::0;51615:122::o;56010:97::-;14677:6;;-1:-1:-1;;;;;14677:6:0;13408:10;14824:23;14816:68;;;;-1:-1:-1;;;14816:68:0;;;;;;;:::i;:::-;56078:11:::1;:21:::0;56010:97::o;15513:201::-;14677:6;;-1:-1:-1;;;;;14677:6:0;13408:10;14824:23;14816:68;;;;-1:-1:-1;;;14816:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;15602:22:0;::::1;15594:73;;;::::0;-1:-1:-1;;;15594:73:0;;17802:2:1;15594:73:0::1;::::0;::::1;17784:21:1::0;17841:2;17821:18;;;17814:30;17880:34;17860:18;;;17853:62;-1:-1:-1;;;17931:18:1;;;17924:36;17977:19;;15594:73:0::1;17600:402:1::0;15594:73:0::1;15678:28;15697:8;15678:18;:28::i;52035:97::-:0;14677:6;;-1:-1:-1;;;;;14677:6:0;13408:10;14824:23;14816:68;;;;-1:-1:-1;;;14816:68:0;;;;;;;:::i;:::-;52103:13:::1;:21:::0;52035:97::o;51928:99::-;14677:6;;-1:-1:-1;;;;;14677:6:0;13408:10;14824:23;14816:68;;;;-1:-1:-1;;;14816:68:0;;;;;;;:::i;:::-;51997:14:::1;:22:::0;51928:99::o;52645:171::-;52767:40;;;;;;;18192:19:1;;;;18249:2;18245:15;;;;-1:-1:-1;;18241:53:1;18227:12;;;18220:75;18311:12;;;;18304:28;;;;52767:40:0;;;;;;;;;;18348:12:1;;;;52767:40:0;;;52757:51;;;;;;52645:171::o;53585:743::-;53725:11;;53740:1;53725:16;53717:57;;;;-1:-1:-1;;;53717:57:0;;18573:2:1;53717:57:0;;;18555:21:1;18612:2;18592:18;;;18585:30;18651;18631:18;;;18624:58;18699:18;;53717:57:0;18371:352:1;53717:57:0;53795:58;53809:35;53816:10;53828:6;53836:7;53809:6;:35::i;:::-;53846:6;;53795:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53795:13:0;;-1:-1:-1;;;53795:58:0:i;:::-;53787:84;;;;-1:-1:-1;;;53787:84:0;;13735:2:1;53787:84:0;;;13717:21:1;13774:2;13754:18;;;13747:30;-1:-1:-1;;;13793:18:1;;;13786:43;13846:18;;53787:84:0;13533:337:1;53787:84:0;53931:10;;53916:11;53900:13;33089:12;;32897:7;33073:13;:28;;32853:271;53900:13;:27;;;;:::i;:::-;:41;;53892:72;;;;-1:-1:-1;;;53892:72:0;;;;;;;:::i;:::-;54015:10;53994:32;;;;:20;:32;;;;;;54045:7;;53994:46;;54029:11;;53994:46;:::i;:::-;53993:59;;53985:95;;;;-1:-1:-1;;;53985:95:0;;14424:2:1;53985:95:0;;;14406:21:1;14463:2;14443:18;;;14436:30;-1:-1:-1;;;14482:18:1;;;14475:53;14545:18;;53985:95:0;14222:347:1;53985:95:0;54131:11;54114:14;;:28;;;;:::i;:::-;54101:9;:41;;54093:70;;;;-1:-1:-1;;;54093:70:0;;16566:2:1;54093:70:0;;;16548:21:1;16605:2;16585:18;;;16578:30;-1:-1:-1;;;16624:18:1;;;16617:46;16680:18;;54093:70:0;16364:340:1;54093:70:0;54192:34;54202:10;54214:11;54192:9;:34::i;:::-;54295:10;54274:32;;;;:20;:32;;;;;;:46;;54309:11;;54274:46;:::i;:::-;54260:10;54239:32;;;;:20;:32;;;;;:81;-1:-1:-1;;;;;53585:743:0:o;40010:144::-;40067:4;40101:13;;40091:7;:23;:55;;;;-1:-1:-1;;40119:20:0;;;;:11;:20;;;;;:27;-1:-1:-1;;;40119:27:0;;;;40118:28;;40010:144::o;47216:196::-;47331:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;47331:29:0;-1:-1:-1;;;;;47331:29:0;;;;;;;;;47376:28;;47331:24;;47376:28;;;;;;;47216:196;;;:::o;42717:2112::-;42832:35;42870:20;42882:7;42870:11;:20::i;:::-;42945:18;;42832:58;;-1:-1:-1;42903:22:0;;-1:-1:-1;;;;;42929:34:0;13408:10;-1:-1:-1;;;;;42929:34:0;;:101;;;-1:-1:-1;42997:18:0;;42980:50;;13408:10;38685:164;:::i;42980:50::-;42929:154;;;-1:-1:-1;13408:10:0;43047:20;43059:7;43047:11;:20::i;:::-;-1:-1:-1;;;;;43047:36:0;;42929:154;42903:181;;43102:17;43097:66;;43128:35;;-1:-1:-1;;;43128:35:0;;;;;;;;;;;43097:66;43200:4;-1:-1:-1;;;;;43178:26:0;:13;:18;;;-1:-1:-1;;;;;43178:26:0;;43174:67;;43213:28;;-1:-1:-1;;;43213:28:0;;;;;;;;;;;43174:67;-1:-1:-1;;;;;43256:16:0;;43252:52;;43281:23;;-1:-1:-1;;;43281:23:0;;;;;;;;;;;43252:52;43317:43;43339:4;43345:2;43349:7;43358:1;43317:21;:43::i;:::-;43425:49;43442:1;43446:7;43455:13;:18;;;43425:8;:49::i;:::-;-1:-1:-1;;;;;43770:18:0;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;43770:31:0;;;-1:-1:-1;;;;;43770:31:0;;;-1:-1:-1;;43770:31:0;;;;;;;43816:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;43816:29:0;;;;;;;;;;;43862:20;;;:11;:20;;;;;;:30;;-1:-1:-1;;;;;;43907:61:0;;;;-1:-1:-1;;;43952:15:0;43907:61;;;;;;;;;;;44242:11;;;44272:24;;;;;:29;44242:11;;44272:29;44268:445;;44497:13;;44483:11;:27;44479:219;;;44567:18;;;44535:24;;;:11;:24;;;;;;;;:50;;44650:28;;;;-1:-1:-1;;;;;44608:70:0;-1:-1:-1;;;44608:70:0;-1:-1:-1;;;;;;44608:70:0;;;-1:-1:-1;;;;;44535:50:0;;;44608:70;;;;;;;44479:219;43745:979;44760:7;44756:2;-1:-1:-1;;;;;44741:27:0;44750:4;-1:-1:-1;;;;;44741:27:0;;;;;;;;;;;44779:42;42821:2008;;42717:2112;;;:::o;56115:120::-;56194:33;56204:9;56215:11;56194:9;:33::i;35220:1083::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;35386:13:0;;35330:7;;35379:20;;35375:861;;;35420:31;35454:17;;;:11;:17;;;;;;;;;35420:51;;;;;;;;;-1:-1:-1;;;;;35420:51:0;;;;-1:-1:-1;;;35420:51:0;;-1:-1:-1;;;;;35420:51:0;;;;;;;;-1:-1:-1;;;35420:51:0;;;;;;;;;;;;;;35490:731;;35540:14;;-1:-1:-1;;;;;35540:28:0;;35536:101;;35604:9;35220:1083;-1:-1:-1;;;35220:1083:0:o;35536:101::-;-1:-1:-1;;;35981:6:0;36026:17;;;;:11;:17;;;;;;;;;36014:29;;;;;;;;;-1:-1:-1;;;;;36014:29:0;;;;;-1:-1:-1;;;36014:29:0;;-1:-1:-1;;;;;36014:29:0;;;;;;;;-1:-1:-1;;;36014:29:0;;;;;;;;;;;;;36074:28;36070:109;;36142:9;35220:1083;-1:-1:-1;;;35220:1083:0:o;36070:109::-;35941:261;;;35401:835;35375:861;36264:31;;-1:-1:-1;;;36264:31:0;;;;;;;;;;;15874:191;15967:6;;;-1:-1:-1;;;;;15984:17:0;;;-1:-1:-1;;;;;;15984:17:0;;;;;;;16017:40;;15967:6;;;15984:17;15967:6;;16017:40;;15948:16;;16017:40;15937:128;15874:191;:::o;27919:190::-;28044:4;28097;28068:25;28081:5;28088:4;28068:12;:25::i;:::-;:33;;27919:190;-1:-1:-1;;;;27919:190:0:o;47977:790::-;48132:4;-1:-1:-1;;;;;48153:13:0;;17600:19;:23;48149:611;;48189:72;;-1:-1:-1;;;48189:72:0;;-1:-1:-1;;;;;48189:36:0;;;;;:72;;13408:10;;48240:4;;48246:7;;48255:5;;48189:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48189:72:0;;;;;;;;-1:-1:-1;;48189:72:0;;;;;;;;;;;;:::i;:::-;;;48185:520;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48435:6;:13;48452:1;48435:18;48431:259;;48485:40;;-1:-1:-1;;;48485:40:0;;;;;;;;;;;48431:259;48640:6;48634:13;48625:6;48621:2;48617:15;48610:38;48185:520;-1:-1:-1;;;;;;48312:55:0;-1:-1:-1;;;48312:55:0;;-1:-1:-1;48305:62:0;;48149:611;-1:-1:-1;48744:4:0;48149:611;47977:790;;;;;;:::o;54970:109::-;55030:13;55063:8;55056:15;;;;;:::i;24940:723::-;24996:13;25217:5;25226:1;25217:10;25213:53;;-1:-1:-1;;25244:10:0;;;;;;;;;;;;-1:-1:-1;;;25244:10:0;;;;;24940:723::o;25213:53::-;25291:5;25276:12;25332:78;25339:9;;25332:78;;25365:8;;;;:::i;:::-;;-1:-1:-1;25388:10:0;;-1:-1:-1;25396:2:0;25388:10;;:::i;:::-;;;25332:78;;;25420:19;25452:6;-1:-1:-1;;;;;25442:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25442:17:0;;25420:39;;25470:154;25477:10;;25470:154;;25504:11;25514:1;25504:11;;:::i;:::-;;-1:-1:-1;25573:10:0;25581:2;25573:5;:10;:::i;:::-;25560:24;;:2;:24;:::i;:::-;25547:39;;25530:6;25537;25530:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;25530:56:0;;;;;;;;-1:-1:-1;25601:11:0;25610:2;25601:11;;:::i;:::-;;;25470:154;;33853:207;33914:7;-1:-1:-1;;;;;33938:19:0;;33934:59;;33966:27;;-1:-1:-1;;;33966:27:0;;;;;;;;;;;33934:59;-1:-1:-1;;;;;;34019:19:0;;;;;:12;:19;;;;;:32;-1:-1:-1;;;34019:32:0;;-1:-1:-1;;;;;34019:32:0;;33853:207::o;59397:758::-;-1:-1:-1;;;;;59604:18:0;;;;;;:60;;-1:-1:-1;59626:30:0;;;;:16;:30;;;;;;;;:38;;:30;:38;59604:60;59600:548;;;-1:-1:-1;;;;;59715:26:0;;;59681:31;59715:26;;;:20;:26;;;;;;59788:24;;;;;;;59848:12;59736:4;59848:6;:12::i;:::-;59829:31;;59898:15;59875:20;;;;:38;;;;59953:22;;;;:26;;59875:20;59953:26;:::i;:::-;59928:22;;;:51;60013:10;60020:2;60013:6;:10::i;:::-;59996:27;;60059:15;60038:18;;;;:36;;;;60112:20;;;;:24;;;:::i;:::-;60089:20;;;;:47;-1:-1:-1;59397:758:0;;;;:::o;40162:104::-;40231:27;40241:2;40245:8;40231:27;;;;;;;;;;;;:9;:27::i;28470:675::-;28553:7;28596:4;28553:7;28611:497;28635:5;:12;28631:1;:16;28611:497;;;28669:20;28692:5;28698:1;28692:8;;;;;;;;:::i;:::-;;;;;;;28669:31;;28735:12;28719;:28;28715:382;;29221:13;29271:15;;;29307:4;29300:15;;;29354:4;29338:21;;28847:57;;28715:382;;;29221:13;29271:15;;;29307:4;29300:15;;;29354:4;29338:21;;29024:57;;28715:382;-1:-1:-1;28649:3:0;;;;:::i;:::-;;;;28611:497;;;-1:-1:-1;29125:12:0;28470:675;-1:-1:-1;;;28470:675:0:o;40629:163::-;40752:32;40758:2;40762:8;40772:5;40779:4;41190:20;41213:13;-1:-1:-1;;;;;41241:16:0;;41237:48;;41266:19;;-1:-1:-1;;;41266:19:0;;;;;;;;;;;41237:48;41300:8;41312:1;41300:13;41296:44;;41322:18;;-1:-1:-1;;;41322:18:0;;;;;;;;;;;41296:44;41353:61;41383:1;41387:2;41391:12;41405:8;41353:21;:61::i;:::-;-1:-1:-1;;;;;41691:16:0;;;;;;:12;:16;;;;;;;;:44;;-1:-1:-1;;41750:49:0;;-1:-1:-1;;;;;41691:44:0;;;;;;;41750:49;;;-1:-1:-1;;;;;41691:44:0;;;;;;41750:49;;;;;;;;;;;;;;;;41816:25;;;:11;:25;;;;;:35;;-1:-1:-1;;;;;;41866:66:0;;;;-1:-1:-1;;;41916:15:0;41866:66;;;;;;;;;;;41816:25;;42001:328;42021:8;42017:1;:12;42001:328;;;42060:38;;42085:12;;-1:-1:-1;;;;;42060:38:0;;;42077:1;;42060:38;;42077:1;;42060:38;42121:4;:68;;;;;42130:59;42161:1;42165:2;42169:12;42183:5;42130:22;:59::i;:::-;42129:60;42121:68;42117:164;;;42221:40;;-1:-1:-1;;;42221:40:0;;;;;;;;;;;42117:164;42299:14;;;;;42031:3;42001:328;;;-1:-1:-1;42345:13:0;:28;42395:60;39413:342;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:173:1;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:186::-;251:6;304:2;292:9;283:7;279:23;275:32;272:52;;;320:1;317;310:12;272:52;343:29;362:9;343:29;:::i;565:131::-;-1:-1:-1;;;;;;639:32:1;;629:43;;619:71;;686:1;683;676:12;701:245;759:6;812:2;800:9;791:7;787:23;783:32;780:52;;;828:1;825;818:12;780:52;867:9;854:23;886:30;910:5;886:30;:::i;1143:258::-;1215:1;1225:113;1239:6;1236:1;1233:13;1225:113;;;1315:11;;;1309:18;1296:11;;;1289:39;1261:2;1254:10;1225:113;;;1356:6;1353:1;1350:13;1347:48;;;-1:-1:-1;;1391:1:1;1373:16;;1366:27;1143:258::o;1406:::-;1448:3;1486:5;1480:12;1513:6;1508:3;1501:19;1529:63;1585:6;1578:4;1573:3;1569:14;1562:4;1555:5;1551:16;1529:63;:::i;:::-;1646:2;1625:15;-1:-1:-1;;1621:29:1;1612:39;;;;1653:4;1608:50;;1406:258;-1:-1:-1;;1406:258:1:o;1669:220::-;1818:2;1807:9;1800:21;1781:4;1838:45;1879:2;1868:9;1864:18;1856:6;1838:45;:::i;1894:180::-;1953:6;2006:2;1994:9;1985:7;1981:23;1977:32;1974:52;;;2022:1;2019;2012:12;1974:52;-1:-1:-1;2045:23:1;;1894:180;-1:-1:-1;1894:180:1:o;2287:254::-;2355:6;2363;2416:2;2404:9;2395:7;2391:23;2387:32;2384:52;;;2432:1;2429;2422:12;2384:52;2455:29;2474:9;2455:29;:::i;:::-;2445:39;2531:2;2516:18;;;;2503:32;;-1:-1:-1;;;2287:254:1:o;2546:367::-;2609:8;2619:6;2673:3;2666:4;2658:6;2654:17;2650:27;2640:55;;2691:1;2688;2681:12;2640:55;-1:-1:-1;2714:20:1;;-1:-1:-1;;;;;2746:30:1;;2743:50;;;2789:1;2786;2779:12;2743:50;2826:4;2818:6;2814:17;2802:29;;2886:3;2879:4;2869:6;2866:1;2862:14;2854:6;2850:27;2846:38;2843:47;2840:67;;;2903:1;2900;2893:12;2840:67;2546:367;;;;;:::o;2918:437::-;3004:6;3012;3065:2;3053:9;3044:7;3040:23;3036:32;3033:52;;;3081:1;3078;3071:12;3033:52;3121:9;3108:23;-1:-1:-1;;;;;3146:6:1;3143:30;3140:50;;;3186:1;3183;3176:12;3140:50;3225:70;3287:7;3278:6;3267:9;3263:22;3225:70;:::i;:::-;3314:8;;3199:96;;-1:-1:-1;2918:437:1;-1:-1:-1;;;;2918:437:1:o;3360:328::-;3437:6;3445;3453;3506:2;3494:9;3485:7;3481:23;3477:32;3474:52;;;3522:1;3519;3512:12;3474:52;3545:29;3564:9;3545:29;:::i;:::-;3535:39;;3593:38;3627:2;3616:9;3612:18;3593:38;:::i;:::-;3583:48;;3678:2;3667:9;3663:18;3650:32;3640:42;;3360:328;;;;;:::o;3693:642::-;3806:6;3814;3822;3830;3838;3891:3;3879:9;3870:7;3866:23;3862:33;3859:53;;;3908:1;3905;3898:12;3859:53;3944:9;3931:23;3921:33;;4001:2;3990:9;3986:18;3973:32;3963:42;;4052:2;4041:9;4037:18;4024:32;4014:42;;4107:2;4096:9;4092:18;4079:32;-1:-1:-1;;;;;4126:6:1;4123:30;4120:50;;;4166:1;4163;4156:12;4120:50;4205:70;4267:7;4258:6;4247:9;4243:22;4205:70;:::i;:::-;3693:642;;;;-1:-1:-1;3693:642:1;;-1:-1:-1;4294:8:1;;4179:96;3693:642;-1:-1:-1;;;3693:642:1:o;4340:127::-;4401:10;4396:3;4392:20;4389:1;4382:31;4432:4;4429:1;4422:15;4456:4;4453:1;4446:15;4472:275;4543:2;4537:9;4608:2;4589:13;;-1:-1:-1;;4585:27:1;4573:40;;-1:-1:-1;;;;;4628:34:1;;4664:22;;;4625:62;4622:88;;;4690:18;;:::i;:::-;4726:2;4719:22;4472:275;;-1:-1:-1;4472:275:1:o;4752:407::-;4817:5;-1:-1:-1;;;;;4843:6:1;4840:30;4837:56;;;4873:18;;:::i;:::-;4911:57;4956:2;4935:15;;-1:-1:-1;;4931:29:1;4962:4;4927:40;4911:57;:::i;:::-;4902:66;;4991:6;4984:5;4977:21;5031:3;5022:6;5017:3;5013:16;5010:25;5007:45;;;5048:1;5045;5038:12;5007:45;5097:6;5092:3;5085:4;5078:5;5074:16;5061:43;5151:1;5144:4;5135:6;5128:5;5124:18;5120:29;5113:40;4752:407;;;;;:::o;5164:451::-;5233:6;5286:2;5274:9;5265:7;5261:23;5257:32;5254:52;;;5302:1;5299;5292:12;5254:52;5342:9;5329:23;-1:-1:-1;;;;;5367:6:1;5364:30;5361:50;;;5407:1;5404;5397:12;5361:50;5430:22;;5483:4;5475:13;;5471:27;-1:-1:-1;5461:55:1;;5512:1;5509;5502:12;5461:55;5535:74;5601:7;5596:2;5583:16;5578:2;5574;5570:11;5535:74;:::i;5620:632::-;5791:2;5843:21;;;5913:13;;5816:18;;;5935:22;;;5762:4;;5791:2;6014:15;;;;5988:2;5973:18;;;5762:4;6057:169;6071:6;6068:1;6065:13;6057:169;;;6132:13;;6120:26;;6201:15;;;;6166:12;;;;6093:1;6086:9;6057:169;;;-1:-1:-1;6243:3:1;;5620:632;-1:-1:-1;;;;;;5620:632:1:o;6257:248::-;6325:6;6333;6386:2;6374:9;6365:7;6361:23;6357:32;6354:52;;;6402:1;6399;6392:12;6354:52;-1:-1:-1;;6425:23:1;;;6495:2;6480:18;;;6467:32;;-1:-1:-1;6257:248:1:o;6510:183::-;6570:4;-1:-1:-1;;;;;6595:6:1;6592:30;6589:56;;;6625:18;;:::i;:::-;-1:-1:-1;6670:1:1;6666:14;6682:4;6662:25;;6510:183::o;6698:959::-;6791:6;6799;6852:2;6840:9;6831:7;6827:23;6823:32;6820:52;;;6868:1;6865;6858:12;6820:52;6904:9;6891:23;6881:33;;6933:2;6986;6975:9;6971:18;6958:32;-1:-1:-1;;;;;7005:6:1;7002:30;6999:50;;;7045:1;7042;7035:12;6999:50;7068:22;;7121:4;7113:13;;7109:27;-1:-1:-1;7099:55:1;;7150:1;7147;7140:12;7099:55;7186:2;7173:16;7209:60;7225:43;7265:2;7225:43;:::i;:::-;7209:60;:::i;:::-;7303:15;;;7385:1;7381:10;;;;7373:19;;7369:28;;;7334:12;;;;7409:19;;;7406:39;;;7441:1;7438;7431:12;7406:39;7465:11;;;;7485:142;7501:6;7496:3;7493:15;7485:142;;;7567:17;;7555:30;;7518:12;;;;7605;;;;7485:142;;;7646:5;7636:15;;;;;;;6698:959;;;;;:::o;8329:118::-;8415:5;8408:13;8401:21;8394:5;8391:32;8381:60;;8437:1;8434;8427:12;8452:315;8517:6;8525;8578:2;8566:9;8557:7;8553:23;8549:32;8546:52;;;8594:1;8591;8584:12;8546:52;8617:29;8636:9;8617:29;:::i;:::-;8607:39;;8696:2;8685:9;8681:18;8668:32;8709:28;8731:5;8709:28;:::i;:::-;8756:5;8746:15;;;8452:315;;;;;:::o;8772:667::-;8867:6;8875;8883;8891;8944:3;8932:9;8923:7;8919:23;8915:33;8912:53;;;8961:1;8958;8951:12;8912:53;8984:29;9003:9;8984:29;:::i;:::-;8974:39;;9032:38;9066:2;9055:9;9051:18;9032:38;:::i;:::-;9022:48;;9117:2;9106:9;9102:18;9089:32;9079:42;;9172:2;9161:9;9157:18;9144:32;-1:-1:-1;;;;;9191:6:1;9188:30;9185:50;;;9231:1;9228;9221:12;9185:50;9254:22;;9307:4;9299:13;;9295:27;-1:-1:-1;9285:55:1;;9336:1;9333;9326:12;9285:55;9359:74;9425:7;9420:2;9407:16;9402:2;9398;9394:11;9359:74;:::i;:::-;9349:84;;;8772:667;;;;;;;:::o;9444:967::-;9537:6;9545;9598:2;9586:9;9577:7;9573:23;9569:32;9566:52;;;9614:1;9611;9604:12;9566:52;9654:9;9641:23;-1:-1:-1;;;;;9679:6:1;9676:30;9673:50;;;9719:1;9716;9709:12;9673:50;9742:22;;9795:4;9787:13;;9783:27;-1:-1:-1;9773:55:1;;9824:1;9821;9814:12;9773:55;9860:2;9847:16;9882:4;9906:60;9922:43;9962:2;9922:43;:::i;9906:60::-;10000:15;;;10082:1;10078:10;;;;10070:19;;10066:28;;;10031:12;;;;10106:19;;;10103:39;;;10138:1;10135;10128:12;10103:39;10162:11;;;;10182:148;10198:6;10193:3;10190:15;10182:148;;;10264:23;10283:3;10264:23;:::i;:::-;10252:36;;10215:12;;;;10308;;;;10182:148;;;10349:5;10386:18;;;;10373:32;;-1:-1:-1;;;;;;9444:967:1:o;10740:260::-;10808:6;10816;10869:2;10857:9;10848:7;10844:23;10840:32;10837:52;;;10885:1;10882;10875:12;10837:52;10908:29;10927:9;10908:29;:::i;:::-;10898:39;;10956:38;10990:2;10979:9;10975:18;10956:38;:::i;:::-;10946:48;;10740:260;;;;;:::o;11190:322::-;11267:6;11275;11283;11336:2;11324:9;11315:7;11311:23;11307:32;11304:52;;;11352:1;11349;11342:12;11304:52;11375:29;11394:9;11375:29;:::i;:::-;11365:39;11451:2;11436:18;;11423:32;;-1:-1:-1;11502:2:1;11487:18;;;11474:32;;11190:322;-1:-1:-1;;;11190:322:1:o;11699:127::-;11760:10;11755:3;11751:20;11748:1;11741:31;11791:4;11788:1;11781:15;11815:4;11812:1;11805:15;11831:125;11871:4;11899:1;11896;11893:8;11890:34;;;11904:18;;:::i;:::-;-1:-1:-1;11941:9:1;;11831:125::o;11961:168::-;12001:7;12067:1;12063;12059:6;12055:14;12052:1;12049:21;12044:1;12037:9;12030:17;12026:45;12023:71;;;12074:18;;:::i;:::-;-1:-1:-1;12114:9:1;;11961:168::o;12134:127::-;12195:10;12190:3;12186:20;12183:1;12176:31;12226:4;12223:1;12216:15;12250:4;12247:1;12240:15;12266:120;12306:1;12332;12322:35;;12337:18;;:::i;:::-;-1:-1:-1;12371:9:1;;12266:120::o;12391:128::-;12431:3;12462:1;12458:6;12455:1;12452:13;12449:39;;;12468:18;;:::i;:::-;-1:-1:-1;12504:9:1;;12391:128::o;12524:380::-;12603:1;12599:12;;;;12646;;;12667:61;;12721:4;12713:6;12709:17;12699:27;;12667:61;12774:2;12766:6;12763:14;12743:18;12740:38;12737:161;;12820:10;12815:3;12811:20;12808:1;12801:31;12855:4;12852:1;12845:15;12883:4;12880:1;12873:15;12909:127;12970:10;12965:3;12961:20;12958:1;12951:31;13001:4;12998:1;12991:15;13025:4;13022:1;13015:15;13041:135;13080:3;13101:17;;;13098:43;;13121:18;;:::i;:::-;-1:-1:-1;13168:1:1;13157:13;;13041:135::o;13875:342::-;14077:2;14059:21;;;14116:2;14096:18;;;14089:30;-1:-1:-1;;;14150:2:1;14135:18;;14128:48;14208:2;14193:18;;13875:342::o;14574:356::-;14776:2;14758:21;;;14795:18;;;14788:30;14854:34;14849:2;14834:18;;14827:62;14921:2;14906:18;;14574:356::o;14935:184::-;15005:6;15058:2;15046:9;15037:7;15033:23;15029:32;15026:52;;;15074:1;15071;15064:12;15026:52;-1:-1:-1;15097:16:1;;14935:184;-1:-1:-1;14935:184:1:o;15760:245::-;15827:6;15880:2;15868:9;15859:7;15855:23;15851:32;15848:52;;;15896:1;15893;15886:12;15848:52;15928:9;15922:16;15947:28;15969:5;15947:28;:::i;17125:470::-;17304:3;17342:6;17336:13;17358:53;17404:6;17399:3;17392:4;17384:6;17380:17;17358:53;:::i;:::-;17474:13;;17433:16;;;;17496:57;17474:13;17433:16;17530:4;17518:17;;17496:57;:::i;:::-;17569:20;;17125:470;-1:-1:-1;;;;17125:470:1:o;18728:489::-;-1:-1:-1;;;;;18997:15:1;;;18979:34;;19049:15;;19044:2;19029:18;;19022:43;19096:2;19081:18;;19074:34;;;19144:3;19139:2;19124:18;;19117:31;;;18922:4;;19165:46;;19191:19;;19183:6;19165:46;:::i;:::-;19157:54;18728:489;-1:-1:-1;;;;;;18728:489:1:o;19222:249::-;19291:6;19344:2;19332:9;19323:7;19319:23;19315:32;19312:52;;;19360:1;19357;19350:12;19312:52;19392:9;19386:16;19411:30;19435:5;19411:30;:::i;19476:112::-;19508:1;19534;19524:35;;19539:18;;:::i;:::-;-1:-1:-1;19573:9:1;;19476:112::o

Swarm Source

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