ETH Price: $2,391.13 (-3.65%)
Gas: 3.98 Gwei

Token

SparkleMuffinz (SPMZ)
 

Overview

Max Total Supply

218 SPMZ

Holders

76

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
1 SPMZ
0x52107524c6cfffbe58098deb18e066888f37d82e
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:
SparkleMuffinz

Compiler Version
v0.8.11+commit.d7f03943

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol


// OpenZeppelin Contracts v4.4.1 (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.
 */
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 Merklee 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 = keccak256(abi.encodePacked(computedHash, proofElement));
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = keccak256(abi.encodePacked(proofElement, computedHash));
            }
        }
        return computedHash;
    }
}

// File: @openzeppelin/contracts/security/ReentrancyGuard.sol


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

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


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

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

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

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

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

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

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

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


// OpenZeppelin Contracts v4.4.1 (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 tokenId);

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

// File: @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/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/token/ERC721/ERC721.sol


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

pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

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

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


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

pragma solidity ^0.8.0;



/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

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

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

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

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

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

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

// 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: SparkleMuffinzERC721.sol


pragma solidity ^0.8.11;





contract SparkleMuffinzERC721 is ERC721Enumerable, Ownable, ReentrancyGuard {
    using Address for address;

    event Mint(address indexed owner, uint256 indexed tokenId);

    uint256 internal _tokenIds;
    uint256 internal _reserved;
    string internal _baseTokenURI;

    uint256 public constant MAX_SUPPLY = 8888;
    uint256 public constant MAX_RESERVED = 30;

    uint256 public mintPrice = 0.1 ether;
    string public unrevealedTokenURI;

    bytes32 public merkleRoot = "";
    mapping(address => uint256) public whitelistRemaining;
    mapping(address => bool) public whitelistUsed;

    bool public revealed;
    bool public presaleActive;
    bool public saleActive;
    mapping(address => uint256) public presaleMints;

    constructor(string memory URI, bytes32 root) ERC721("SparkleMuffinz", "SPMZ") {
        unrevealedTokenURI = URI;
        merkleRoot = root;
    }

    // VIEW FUNCTIONS

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

    // ADMIN FUNCTIONALITY

    function setBaseTokenURI(string memory URI) public onlyOwner {
        _baseTokenURI = URI;
    }

    function setUnrevealedTokenURI(string memory URI) public onlyOwner {
        unrevealedTokenURI = URI;
    }

    function reveal(string memory URI) public onlyOwner {
        require(!revealed, "NFTs already revealed");
        revealed = true;
        _baseTokenURI = URI;
    }

    function setMintPrice(uint256 _mintPrice) external onlyOwner {
        mintPrice = _mintPrice;
    }

    function setMerkleRoot(bytes32 _merkleRoot) public onlyOwner {
        merkleRoot = _merkleRoot;
    }

    function flipPresaleStatus() public onlyOwner {
        presaleActive = !presaleActive;
    }

    function flipSaleStatus() public onlyOwner {
        saleActive = !saleActive;
    }

    function reserve(uint256 amount, address to) public onlyOwner {
        require(_reserved + amount <= MAX_RESERVED, "Exceeds maximum number of reserved tokens");

        _mintWithoutValidation(to, amount);
        _reserved += amount;
    }

    // MINTING FUNCTIONS

    // verifies a merkle proof for whitelist checking
    function verify(
        bytes32 root,
        bytes32 leaf,
        bytes32[] memory proof
    ) public pure returns (bool) {
        return MerkleProof.verify(proof, root, leaf);
    }

    // function to mint based off of whitelist allocation
    function presaleMint(
        uint256 amount,
        uint256 totalAllocation,
        bytes32 leaf,
        bytes32[] memory proof
    ) external payable {
        require(presaleActive, "Presale not active");

        // Create storage element tracking user mints if this is the first mint for them
        if (!whitelistUsed[msg.sender]) {
            // Verify that (msg.sender, amount) correspond to Merkle leaf
            require(
                keccak256(abi.encodePacked(msg.sender, totalAllocation)) == leaf,
                "Sender and amount don't match Merkle leaf"
            );

            // Verify that (leaf, proof) matches the Merkle root
            require(verify(merkleRoot, leaf, proof), "Not a valid leaf in the Merkle tree");

            whitelistUsed[msg.sender] = true;
            whitelistRemaining[msg.sender] = totalAllocation;
        }

        require(amount > 0, "Invalid mint amount");
        require(msg.value >= amount * mintPrice, "Not enough ETH sent");
        require(whitelistRemaining[msg.sender] >= amount, "Can't mint more than remaining allocation");

        whitelistRemaining[msg.sender] -= amount;
        _mintWithoutValidation(msg.sender, amount);
    }

    // function to mint in public sale
    function publicMint(uint256 amount) external payable {
        require(saleActive, "Public sale not active");
        require(amount > 0, "Invalid mint amount");
        require(msg.value >= amount * mintPrice, "Not enough ETH sent");

        _mintWithoutValidation(msg.sender, amount);
    }

    // internal function for minting without checks
    function _mintWithoutValidation(address to, uint256 amount) internal {
        require(_tokenIds + amount < MAX_SUPPLY, "Exceeds maximum number of tokens");

        for (uint256 i = 0; i < amount; i++) {
            _mint(to, _tokenIds);
            emit Mint(to, _tokenIds);
            _tokenIds += 1;
        }
    }

    /**
     * @dev Returns the wallet of a given wallet. Mainly for ease for frontend devs.
     * @param wallet The wallet to get the tokens of.
     */
    function walletOfOwner(address wallet) public view returns (uint256[] memory) {
        uint256 tokenCount = balanceOf(wallet);

        uint256[] memory tokenIds = new uint256[](tokenCount);
        for (uint256 i; i < tokenCount; i++) {
            tokenIds[i] = tokenOfOwnerByIndex(wallet, i);
        }
        return tokenIds;
    }

    // WITHDRAWAL FUNCTIONALITY

    function withdraw() public onlyOwner nonReentrant {
        Address.sendValue(payable(owner()), address(this).balance);
    }
}

// File: SparkleMuffinz.sol


pragma solidity ^0.8.11;


interface IWeb {
    function burn(address from, uint256 amount) external;

    function update(address from, address to) external;
}

contract SparkleMuffinz is SparkleMuffinzERC721 {
    using Address for address;
    using Strings for uint256;

    struct MuffinInfo {
        string name;
        string description;
        bool locked;
        uint256 tier;
    }

    event UpdateName(uint256 indexed tokenId, string name);
    event UpdateDescription(uint256 indexed tokenId, string description);
    event UpdateLockStatus(uint256 indexed tokenId, bool lockStatus);
    event UpdateTier(uint256 indexed tokenId, uint256 previousTier, uint256 newTier);
    event MassUnlock();

    IWeb public Web;

    uint256 public constant MAX_TIER = 3;

    uint256 public updateNamePrice = 50 ether;
    uint256 public updateDescriptionPrice = 50 ether;
    uint256 public bakePrice = 100 ether;

    mapping(uint256 => MuffinInfo) public muffinInfo;

    constructor(string memory unrevealedTokenURI, bytes32 root) SparkleMuffinzERC721(unrevealedTokenURI, root) {}

    // MODIFIERS

    modifier onlyTokenOwner(uint256 tokenId) {
        require(ownerOf(tokenId) == msg.sender, "Sender is not the token owner");
        _;
    }

    // TOKENURI

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        string memory baseURI = _baseURI();
        if (revealed) {
            bool locked = this.getLockStatus(tokenId);
            if (locked) {
                return string(abi.encodePacked(baseURI, tokenId.toString(), "-locked"));
            } else {
                uint256 tier = this.getTier(tokenId);
                return string(abi.encodePacked(baseURI, tokenId.toString(), "-", tier.toString()));
            }
        } else {
            return unrevealedTokenURI;
        }
    }

    // ADMIN FUNCTIONS

    function setWebAddress(address web) public onlyOwner {
        Web = IWeb(web);
    }

    function setUpdateNamePrice(uint256 price) public onlyOwner {
        updateNamePrice = price;
    }

    function setUpdateDescriptionPrice(uint256 price) public onlyOwner {
        updateDescriptionPrice = price;
    }

    function setBakePrice(uint256 price) public onlyOwner {
        bakePrice = price;
    }

    function massUnlock() public onlyOwner {
        for (uint256 i = 0; i < _tokenIds; i++) {
            muffinInfo[i].locked = false;
        }
        emit MassUnlock();
    }

    // VIEW FUNCTIONS

    function getName(uint256 tokenId) external view returns (string memory) {
        return muffinInfo[tokenId].name;
    }

    function getDescription(uint256 tokenId) external view returns (string memory) {
        return muffinInfo[tokenId].description;
    }

    function getLockStatus(uint256 tokenId) external view returns (bool) {
        return muffinInfo[tokenId].locked;
    }

    function getTier(uint256 tokenId) external view returns (uint256) {
        return muffinInfo[tokenId].tier;
    }

    // UPDATE FUNCTIONS

    function updateName(uint256 tokenId, string calldata name) public onlyTokenOwner(tokenId) {
        require(address(Web) != address(0), "No token contract set");

        bytes memory n = bytes(name);
        require(n.length > 0 && n.length < 25, "Invalid name length");
        require(sha256(n) != sha256(bytes(muffinInfo[tokenId].name)), "New name is same as current name");

        Web.burn(msg.sender, updateNamePrice);

        muffinInfo[tokenId].name = name;
        emit UpdateName(tokenId, name);
    }

    function updateDescription(uint256 tokenId, string calldata description) public onlyTokenOwner(tokenId) {
        require(address(Web) != address(0), "No token contract set");

        bytes memory d = bytes(description);
        require(d.length > 0 && d.length < 280, "Invalid description length");
        require(
            sha256(bytes(d)) != sha256(bytes(muffinInfo[tokenId].description)),
            "New description is same as current description"
        );

        Web.burn(msg.sender, updateDescriptionPrice);

        muffinInfo[tokenId].description = description;
        emit UpdateDescription(tokenId, description);
    }

    // override transferFrom to update WEB token reward balances
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public override nonReentrant {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        if (address(Web) != address(0)) {
            Web.update(from, to);
        }

        ERC721.transferFrom(from, to, tokenId);
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory data
    ) public override nonReentrant {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        if (address(Web) != address(0)) {
            Web.update(from, to);
        }

        ERC721.safeTransferFrom(from, to, tokenId, data);
    }

    function bake(uint256 tokenId) public onlyTokenOwner(tokenId) {
        require(address(Web) != address(0), "No token contract set");
        require(!this.getLockStatus(tokenId), "Token is locked");

        uint256 currentTier = this.getTier(tokenId);
        require(currentTier < MAX_TIER, "Token already max tier");

        Web.burn(msg.sender, bakePrice);

        uint256 pseudoRandomNumber = _genPseudoRandomNumber(tokenId);
        if (pseudoRandomNumber == 0) {
            muffinInfo[tokenId].locked = true;
            muffinInfo[tokenId].tier = 0;
            emit UpdateLockStatus(tokenId, true);
            emit UpdateTier(tokenId, currentTier, 0);
        } else {
            muffinInfo[tokenId].tier = currentTier + 1;
            emit UpdateTier(tokenId, currentTier, currentTier + 1);
        }
    }

    function _genPseudoRandomNumber(uint256 tokenId) private view returns (uint256) {
        uint256 pseudoRandomHash = uint256(keccak256(abi.encodePacked(block.difficulty, block.timestamp, tokenId)));
        return pseudoRandomHash % 2;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"unrevealedTokenURI","type":"string"},{"internalType":"bytes32","name":"root","type":"bytes32"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[],"name":"MassUnlock","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Mint","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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"string","name":"description","type":"string"}],"name":"UpdateDescription","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"bool","name":"lockStatus","type":"bool"}],"name":"UpdateLockStatus","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"string","name":"name","type":"string"}],"name":"UpdateName","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"previousTier","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newTier","type":"uint256"}],"name":"UpdateTier","type":"event"},{"inputs":[],"name":"MAX_RESERVED","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":"MAX_TIER","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Web","outputs":[{"internalType":"contract IWeb","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"bake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"bakePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipPresaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipSaleStatus","outputs":[],"stateMutability":"nonpayable","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":"getDescription","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getLockStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getName","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getTier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"massUnlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"muffinInfo","outputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"description","type":"string"},{"internalType":"bool","name":"locked","type":"bool"},{"internalType":"uint256","name":"tier","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"totalAllocation","type":"uint256"},{"internalType":"bytes32","name":"leaf","type":"bytes32"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"presaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"presaleMints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"reserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"URI","type":"string"}],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":[],"name":"saleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"setBakePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"URI","type":"string"}],"name":"setBaseTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintPrice","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"URI","type":"string"}],"name":"setUnrevealedTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"setUpdateDescriptionPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"setUpdateNamePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"web","type":"address"}],"name":"setWebAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unrevealedTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"description","type":"string"}],"name":"updateDescription","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"updateDescriptionPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"name","type":"string"}],"name":"updateName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"updateNamePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"root","type":"bytes32"},{"internalType":"bytes32","name":"leaf","type":"bytes32"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"verify","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistRemaining","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistUsed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405267016345785d8a0000600f5560006011556802b5e3af16b18800006017556802b5e3af16b188000060185568056bc75e2d631000006019553480156200004957600080fd5b506040516200450c3803806200450c8339810160408190526200006c916200022f565b604080518082018252600e81526d29b830b935b632a6bab33334b73d60911b60208083019182528351808501909452600484526329a826ad60e11b90840152815185938593929091620000c29160009162000173565b508051620000d890600190602084019062000173565b505050620000f5620000ef6200011d60201b60201c565b62000121565b6001600b5581516200010f90601090602085019062000173565b506011555062000351915050565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620001819062000314565b90600052602060002090601f016020900481019282620001a55760008555620001f0565b82601f10620001c057805160ff1916838001178555620001f0565b82800160010185558215620001f0579182015b82811115620001f0578251825591602001919060010190620001d3565b50620001fe92915062000202565b5090565b5b80821115620001fe576000815560010162000203565b634e487b7160e01b600052604160045260246000fd5b600080604083850312156200024357600080fd5b82516001600160401b03808211156200025b57600080fd5b818501915085601f8301126200027057600080fd5b81518181111562000285576200028562000219565b604051601f8201601f19908116603f01168101908382118183101715620002b057620002b062000219565b81604052828152602093508884848701011115620002cd57600080fd5b600091505b82821015620002f15784820184015181830185015290830190620002d2565b82821115620003035760008484830101525b969092015195979596505050505050565b600181811c908216806200032957607f821691505b602082108114156200034b57634e487b7160e01b600052602260045260246000fd5b50919050565b6141ab80620003616000396000f3fe6080604052600436106103a25760003560e01c806353e76f2c116101e7578063a22cb4651161010d578063e52f7d0b116100a0578063f2fde38b1161006f578063f2fde38b14610abb578063f4a0a52814610adb578063f569043014610afb578063ff50188514610b1b57600080fd5b8063e52f7d0b14610a0f578063e63ec94714610a2f578063e7a686bd14610a5c578063e985e9c514610a7257600080fd5b8063b88d4fde116100dc578063b88d4fde146109a4578063c87b56dd146109c4578063ce03ec93146109e4578063e3bdf0c9146109f957600080fd5b8063a22cb4651461093a578063af3a19c71461095a578063b2873d5c1461096f578063b4ced2101461098457600080fd5b806370a0823111610185578063851a299311610154578063851a2993146108a45780638978b2da146108d45780638da5cb5b1461090757806395d89b411461092557600080fd5b806370a082311461082f578063715018a61461084f5780637cb6475914610864578063820de0c51461088457600080fd5b80636817c76c116101c15780636817c76c146107c457806368428a1b146107da5780636b8ff574146107fa5780636ba90c6e1461081a57600080fd5b806353e76f2c1461076e5780635e80d2bb1461078e5780636352211e146107a457600080fd5b806330176e13116102cc578063438b63001161026a5780634f062c5a116102395780634f062c5a146106e55780634f6ccce714610715578063518302271461073557806353135ca01461074f57600080fd5b8063438b6300146106635780634925ec55146106905780634c261247146106b05780634de8815c146106d057600080fd5b80633423e548116102a65780633423e548146105ee578063391709d71461060e5780633ccfd60b1461062e57806342842e0e1461064357600080fd5b806330176e131461059857806332cb6b0c146105b857806333da99f6146105ce57600080fd5b80631725051f1161034457806323b872dd1161031357806323b872dd1461052f5780632db115441461054f5780632eb4a7ab146105625780632f745c591461057857600080fd5b80631725051f146104b857806318160ddd146104cd5780631a3ff970146104ec57806321328f9e146104ff57600080fd5b8063081812fc11610380578063081812fc14610420578063095ea7b31461045857806314dee4b31461047857806316646fc81461049857600080fd5b806301ffc9a7146103a757806303339bcb146103dc57806306fdde03146103fe575b600080fd5b3480156103b357600080fd5b506103c76103c2366004613786565b610b48565b60405190151581526020015b60405180910390f35b3480156103e857600080fd5b506103fc6103f73660046137bf565b610b73565b005b34801561040a57600080fd5b50610413610c3b565b6040516103d39190613843565b34801561042c57600080fd5b5061044061043b366004613856565b610ccd565b6040516001600160a01b0390911681526020016103d3565b34801561046457600080fd5b506103fc61047336600461386f565b610d62565b34801561048457600080fd5b506103fc610493366004613899565b610e78565b3480156104a457600080fd5b506103fc6104b3366004613856565b61114a565b3480156104c457600080fd5b506103fc611179565b3480156104d957600080fd5b506008545b6040519081526020016103d3565b6103fc6104fa3660046139dc565b6111c0565b34801561050b57600080fd5b506103c761051a366004613a36565b60136020526000908152604090205460ff1681565b34801561053b57600080fd5b506103fc61054a366004613a51565b61148a565b6103fc61055d366004613856565b611567565b34801561056e57600080fd5b506104de60115481565b34801561058457600080fd5b506104de61059336600461386f565b61165d565b3480156105a457600080fd5b506103fc6105b3366004613ae5565b6116f3565b3480156105c457600080fd5b506104de6122b881565b3480156105da57600080fd5b50601654610440906001600160a01b031681565b3480156105fa57600080fd5b506103c7610609366004613b2e565b611734565b34801561061a57600080fd5b506103fc610629366004613856565b611749565b34801561063a57600080fd5b506103fc611778565b34801561064f57600080fd5b506103fc61065e366004613a51565b6117ec565b34801561066f57600080fd5b5061068361067e366004613a36565b611807565b6040516103d39190613b7e565b34801561069c57600080fd5b506104136106ab366004613856565b6118a9565b3480156106bc57600080fd5b506103fc6106cb366004613ae5565b61194e565b3480156106dc57600080fd5b506103fc6119e3565b3480156106f157600080fd5b506104de610700366004613856565b6000908152601a602052604090206003015490565b34801561072157600080fd5b506104de610730366004613856565b611a71565b34801561074157600080fd5b506014546103c79060ff1681565b34801561075b57600080fd5b506014546103c790610100900460ff1681565b34801561077a57600080fd5b506103fc610789366004613899565b611b04565b34801561079a57600080fd5b506104de60195481565b3480156107b057600080fd5b506104406107bf366004613856565b611d9b565b3480156107d057600080fd5b506104de600f5481565b3480156107e657600080fd5b506014546103c79062010000900460ff1681565b34801561080657600080fd5b50610413610815366004613856565b611e12565b34801561082657600080fd5b506104de601e81565b34801561083b57600080fd5b506104de61084a366004613a36565b611e2f565b34801561085b57600080fd5b506103fc611eb6565b34801561087057600080fd5b506103fc61087f366004613856565b611eec565b34801561089057600080fd5b506103fc61089f366004613ae5565b611f1b565b3480156108b057600080fd5b506108c46108bf366004613856565b611f58565b6040516103d39493929190613bc2565b3480156108e057600080fd5b506103c76108ef366004613856565b6000908152601a602052604090206002015460ff1690565b34801561091357600080fd5b50600a546001600160a01b0316610440565b34801561093157600080fd5b50610413612094565b34801561094657600080fd5b506103fc610955366004613c09565b6120a3565b34801561096657600080fd5b506104de600381565b34801561097b57600080fd5b506104136120ae565b34801561099057600080fd5b506103fc61099f366004613856565b61213c565b3480156109b057600080fd5b506103fc6109bf366004613c40565b612462565b3480156109d057600080fd5b506104136109df366004613856565b612541565b3480156109f057600080fd5b506103fc612735565b348015610a0557600080fd5b506104de60185481565b348015610a1b57600080fd5b506103fc610a2a366004613856565b61277e565b348015610a3b57600080fd5b506104de610a4a366004613a36565b60126020526000908152604090205481565b348015610a6857600080fd5b506104de60175481565b348015610a7e57600080fd5b506103c7610a8d366004613cb0565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b348015610ac757600080fd5b506103fc610ad6366004613a36565b6127ad565b348015610ae757600080fd5b506103fc610af6366004613856565b612845565b348015610b0757600080fd5b506103fc610b16366004613a36565b612874565b348015610b2757600080fd5b506104de610b36366004613a36565b60156020526000908152604090205481565b60006001600160e01b0319821663780e9d6360e01b1480610b6d5750610b6d826128c0565b92915050565b600a546001600160a01b03163314610ba65760405162461bcd60e51b8152600401610b9d90613cda565b60405180910390fd5b601e82600d54610bb69190613d25565b1115610c165760405162461bcd60e51b815260206004820152602960248201527f45786365656473206d6178696d756d206e756d626572206f6620726573657276604482015268656420746f6b656e7360b81b6064820152608401610b9d565b610c208183612910565b81600d6000828254610c329190613d25565b90915550505050565b606060008054610c4a90613d3d565b80601f0160208091040260200160405190810160405280929190818152602001828054610c7690613d3d565b8015610cc35780601f10610c9857610100808354040283529160200191610cc3565b820191906000526020600020905b815481529060010190602001808311610ca657829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610d465760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610b9d565b506000908152600460205260409020546001600160a01b031690565b6000610d6d82611d9b565b9050806001600160a01b0316836001600160a01b03161415610ddb5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610b9d565b336001600160a01b0382161480610df75750610df78133610a8d565b610e695760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610b9d565b610e7383836129e7565b505050565b8233610e8382611d9b565b6001600160a01b031614610ea95760405162461bcd60e51b8152600401610b9d90613d72565b6016546001600160a01b0316610ed15760405162461bcd60e51b8152600401610b9d90613da9565b600083838080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250508251929350505015801590610f1e57506101188151105b610f6a5760405162461bcd60e51b815260206004820152601a60248201527f496e76616c6964206465736372697074696f6e206c656e6774680000000000006044820152606401610b9d565b6002601a6000878152602001908152602001600020600101604051610f8f9190613dd8565b602060405180830381855afa158015610fac573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190610fcf9190613e74565b600282604051610fdf9190613e8d565b602060405180830381855afa158015610ffc573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061101f9190613e74565b14156110845760405162461bcd60e51b815260206004820152602e60248201527f4e6577206465736372697074696f6e2069732073616d6520617320637572726560448201526d373a103232b9b1b934b83a34b7b760911b6064820152608401610b9d565b601654601854604051632770a7eb60e21b815233600482015260248101919091526001600160a01b0390911690639dc29fac90604401600060405180830381600087803b1580156110d457600080fd5b505af11580156110e8573d6000803e3d6000fd5b5050506000868152601a6020526040902061110891506001018585613663565b50847fa5eb4fe2f21ddb28c752c9927387264d67ce06b0ce619ad8b4b06d8dfe948347858560405161113b929190613ea9565b60405180910390a25050505050565b600a546001600160a01b031633146111745760405162461bcd60e51b8152600401610b9d90613cda565b601855565b600a546001600160a01b031633146111a35760405162461bcd60e51b8152600401610b9d90613cda565b6014805461ff001981166101009182900460ff1615909102179055565b601454610100900460ff1661120c5760405162461bcd60e51b815260206004820152601260248201527150726573616c65206e6f742061637469766560701b6044820152606401610b9d565b3360009081526013602052604090205460ff1661134c576040516bffffffffffffffffffffffff193360601b16602082015260348101849052829060540160405160208183030381529060405280519060200120146112bf5760405162461bcd60e51b815260206004820152602960248201527f53656e64657220616e6420616d6f756e7420646f6e2774206d61746368204d656044820152683935b632903632b0b360b91b6064820152608401610b9d565b6112cc6011548383611734565b6113245760405162461bcd60e51b815260206004820152602360248201527f4e6f7420612076616c6964206c65616620696e20746865204d65726b6c65207460448201526272656560e81b6064820152608401610b9d565b336000908152601360209081526040808320805460ff19166001179055601290915290208390555b600084116113925760405162461bcd60e51b8152602060048201526013602482015272125b9d985b1a59081b5a5b9d08185b5bdd5b9d606a1b6044820152606401610b9d565b600f5461139f9085613ed8565b3410156113e45760405162461bcd60e51b8152602060048201526013602482015272139bdd08195b9bdd59da08115512081cd95b9d606a1b6044820152606401610b9d565b336000908152601260205260409020548411156114555760405162461bcd60e51b815260206004820152602960248201527f43616e2774206d696e74206d6f7265207468616e2072656d61696e696e672061604482015268363637b1b0ba34b7b760b91b6064820152608401610b9d565b3360009081526012602052604081208054869290611474908490613ef7565b9091555061148490503385612910565b50505050565b6002600b5414156114ad5760405162461bcd60e51b8152600401610b9d90613f0e565b6002600b556114bd335b82612a55565b6114d95760405162461bcd60e51b8152600401610b9d90613f45565b6016546001600160a01b0316156115525760165460405163c640752d60e01b81526001600160a01b03858116600483015284811660248301529091169063c640752d90604401600060405180830381600087803b15801561153957600080fd5b505af115801561154d573d6000803e3d6000fd5b505050505b61155d838383612b48565b50506001600b5550565b60145462010000900460ff166115b85760405162461bcd60e51b81526020600482015260166024820152755075626c69632073616c65206e6f742061637469766560501b6044820152606401610b9d565b600081116115fe5760405162461bcd60e51b8152602060048201526013602482015272125b9d985b1a59081b5a5b9d08185b5bdd5b9d606a1b6044820152606401610b9d565b600f5461160b9082613ed8565b3410156116505760405162461bcd60e51b8152602060048201526013602482015272139bdd08195b9bdd59da08115512081cd95b9d606a1b6044820152606401610b9d565b61165a3382612910565b50565b600061166883611e2f565b82106116ca5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610b9d565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600a546001600160a01b0316331461171d5760405162461bcd60e51b8152600401610b9d90613cda565b805161173090600e9060208401906136e7565b5050565b6000611741828585612b78565b949350505050565b600a546001600160a01b031633146117735760405162461bcd60e51b8152600401610b9d90613cda565b601755565b600a546001600160a01b031633146117a25760405162461bcd60e51b8152600401610b9d90613cda565b6002600b5414156117c55760405162461bcd60e51b8152600401610b9d90613f0e565b6002600b556117e56117df600a546001600160a01b031690565b47612b8e565b6001600b55565b610e7383838360405180602001604052806000815250612462565b6060600061181483611e2f565b905060008167ffffffffffffffff81111561183157611831613915565b60405190808252806020026020018201604052801561185a578160200160208202803683370190505b50905060005b828110156118a157611872858261165d565b82828151811061188457611884613f96565b60209081029190910101528061189981613fac565b915050611860565b509392505050565b6000818152601a602052604090206001018054606091906118c990613d3d565b80601f01602080910402602001604051908101604052809291908181526020018280546118f590613d3d565b80156119425780601f1061191757610100808354040283529160200191611942565b820191906000526020600020905b81548152906001019060200180831161192557829003601f168201915b50505050509050919050565b600a546001600160a01b031633146119785760405162461bcd60e51b8152600401610b9d90613cda565b60145460ff16156119c35760405162461bcd60e51b81526020600482015260156024820152741391951cc8185b1c9958591e481c995d99585b1959605a1b6044820152606401610b9d565b6014805460ff19166001179055805161173090600e9060208401906136e7565b600a546001600160a01b03163314611a0d5760405162461bcd60e51b8152600401610b9d90613cda565b60005b600c54811015611a45576000818152601a60205260409020600201805460ff1916905580611a3d81613fac565b915050611a10565b506040517ffcf20df6e8058edf51cac04597457f11c3185616b462bbfa0603f574b308551b90600090a1565b6000611a7c60085490565b8210611adf5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610b9d565b60088281548110611af257611af2613f96565b90600052602060002001549050919050565b8233611b0f82611d9b565b6001600160a01b031614611b355760405162461bcd60e51b8152600401610b9d90613d72565b6016546001600160a01b0316611b5d5760405162461bcd60e51b8152600401610b9d90613da9565b600083838080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250508251929350505015801590611ba9575060198151105b611beb5760405162461bcd60e51b8152602060048201526013602482015272092dcecc2d8d2c840dcc2daca40d8cadccee8d606b1b6044820152606401610b9d565b6000858152601a6020526040908190209051600291611c0991613dd8565b602060405180830381855afa158015611c26573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190611c499190613e74565b600282604051611c599190613e8d565b602060405180830381855afa158015611c76573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190611c999190613e74565b1415611ce75760405162461bcd60e51b815260206004820181905260248201527f4e6577206e616d652069732073616d652061732063757272656e74206e616d656044820152606401610b9d565b601654601754604051632770a7eb60e21b815233600482015260248101919091526001600160a01b0390911690639dc29fac90604401600060405180830381600087803b158015611d3757600080fd5b505af1158015611d4b573d6000803e3d6000fd5b5050506000868152601a60205260409020611d6891508585613663565b50847fac2072268d18e10aecad35c0c04acd66330b2571a8ff403e3c702d77d3bab134858560405161113b929190613ea9565b6000818152600260205260408120546001600160a01b031680610b6d5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610b9d565b6000818152601a602052604090208054606091906118c990613d3d565b60006001600160a01b038216611e9a5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610b9d565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b03163314611ee05760405162461bcd60e51b8152600401610b9d90613cda565b611eea6000612ca7565b565b600a546001600160a01b03163314611f165760405162461bcd60e51b8152600401610b9d90613cda565b601155565b600a546001600160a01b03163314611f455760405162461bcd60e51b8152600401610b9d90613cda565b80516117309060109060208401906136e7565b601a60205260009081526040902080548190611f7390613d3d565b80601f0160208091040260200160405190810160405280929190818152602001828054611f9f90613d3d565b8015611fec5780601f10611fc157610100808354040283529160200191611fec565b820191906000526020600020905b815481529060010190602001808311611fcf57829003601f168201915b50505050509080600101805461200190613d3d565b80601f016020809104026020016040519081016040528092919081815260200182805461202d90613d3d565b801561207a5780601f1061204f5761010080835404028352916020019161207a565b820191906000526020600020905b81548152906001019060200180831161205d57829003601f168201915b505050506002830154600390930154919260ff1691905084565b606060018054610c4a90613d3d565b611730338383612cf9565b601080546120bb90613d3d565b80601f01602080910402602001604051908101604052809291908181526020018280546120e790613d3d565b80156121345780601f1061210957610100808354040283529160200191612134565b820191906000526020600020905b81548152906001019060200180831161211757829003601f168201915b505050505081565b803361214782611d9b565b6001600160a01b03161461216d5760405162461bcd60e51b8152600401610b9d90613d72565b6016546001600160a01b03166121955760405162461bcd60e51b8152600401610b9d90613da9565b6040516344bc596d60e11b8152600481018390523090638978b2da90602401602060405180830381865afa1580156121d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121f59190613fc7565b156122345760405162461bcd60e51b815260206004820152600f60248201526e151bdad95b881a5cc81b1bd8dad959608a1b6044820152606401610b9d565b604051632783162d60e11b8152600481018390526000903090634f062c5a90602401602060405180830381865afa158015612273573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122979190613e74565b9050600381106122e25760405162461bcd60e51b81526020600482015260166024820152752a37b5b2b71030b63932b0b23c9036b0bc103a34b2b960511b6044820152606401610b9d565b601654601954604051632770a7eb60e21b815233600482015260248101919091526001600160a01b0390911690639dc29fac90604401600060405180830381600087803b15801561233257600080fd5b505af1158015612346573d6000803e3d6000fd5b50505050600061235584612dc8565b9050806123f9576000848152601a6020908152604080832060028101805460ff191660019081179091556003909101939093555191825285917fb471b3e3af9a1892fc86eff069103ffd01354f72aa939339d1510ec5eaf89c23910160405180910390a2604080518381526000602082015285917f7bf3c87192c766908d5bc0948bf458d12ea76ac1f015c328ed888f083883e3b8910160405180910390a2611484565b612404826001613d25565b6000858152601a6020526040902060030155837f7bf3c87192c766908d5bc0948bf458d12ea76ac1f015c328ed888f083883e3b883612444816001613d25565b6040805192835260208301919091520160405180910390a250505050565b6002600b5414156124855760405162461bcd60e51b8152600401610b9d90613f0e565b6002600b55612495335b83612a55565b6124b15760405162461bcd60e51b8152600401610b9d90613f45565b6016546001600160a01b03161561252a5760165460405163c640752d60e01b81526001600160a01b03868116600483015285811660248301529091169063c640752d90604401600060405180830381600087803b15801561251157600080fd5b505af1158015612525573d6000803e3d6000fd5b505050505b61253684848484612e0f565b50506001600b555050565b6060600061254d612e40565b60145490915060ff161561269c576040516344bc596d60e11b8152600481018490526000903090638978b2da90602401602060405180830381865afa15801561259a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125be9190613fc7565b905080156125f957816125d085612e4f565b6040516020016125e1929190613fe4565b60405160208183030381529060405292505050919050565b604051632783162d60e11b8152600481018590526000903090634f062c5a90602401602060405180830381865afa158015612638573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061265c9190613e74565b90508261266886612e4f565b61267183612e4f565b60405160200161268393929190614025565b6040516020818303038152906040529350505050919050565b601080546126a990613d3d565b80601f01602080910402602001604051908101604052809291908181526020018280546126d590613d3d565b80156127225780601f106126f757610100808354040283529160200191612722565b820191906000526020600020905b81548152906001019060200180831161270557829003601f168201915b5050505050915050919050565b50919050565b600a546001600160a01b0316331461275f5760405162461bcd60e51b8152600401610b9d90613cda565b6014805462ff0000198116620100009182900460ff1615909102179055565b600a546001600160a01b031633146127a85760405162461bcd60e51b8152600401610b9d90613cda565b601955565b600a546001600160a01b031633146127d75760405162461bcd60e51b8152600401610b9d90613cda565b6001600160a01b03811661283c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b9d565b61165a81612ca7565b600a546001600160a01b0316331461286f5760405162461bcd60e51b8152600401610b9d90613cda565b600f55565b600a546001600160a01b0316331461289e5760405162461bcd60e51b8152600401610b9d90613cda565b601680546001600160a01b0319166001600160a01b0392909216919091179055565b60006001600160e01b031982166380ac58cd60e01b14806128f157506001600160e01b03198216635b5e139f60e01b145b80610b6d57506301ffc9a760e01b6001600160e01b0319831614610b6d565b6122b881600c546129219190613d25565b1061296e5760405162461bcd60e51b815260206004820181905260248201527f45786365656473206d6178696d756d206e756d626572206f6620746f6b656e736044820152606401610b9d565b60005b81811015610e735761298583600c54612f4d565b600c546040516001600160a01b038516907f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d412139688590600090a36001600c60008282546129cf9190613d25565b909155508190506129df81613fac565b915050612971565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190612a1c82611d9b565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316612ace5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610b9d565b6000612ad983611d9b565b9050806001600160a01b0316846001600160a01b03161480612b145750836001600160a01b0316612b0984610ccd565b6001600160a01b0316145b8061174157506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff16611741565b612b51336114b7565b612b6d5760405162461bcd60e51b8152600401610b9d90613f45565b610e7383838361309b565b600082612b858584613246565b14949350505050565b80471015612bde5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610b9d565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612c2b576040519150601f19603f3d011682016040523d82523d6000602084013e612c30565b606091505b5050905080610e735760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610b9d565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b03161415612d5b5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610b9d565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6040805144602080830191909152428284015260608083018590528351808403909101815260809092019092528051910120600090612e0860028261408b565b9392505050565b612e183361248f565b612e345760405162461bcd60e51b8152600401610b9d90613f45565b611484848484846132ea565b6060600e8054610c4a90613d3d565b606081612e735750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612e9d5780612e8781613fac565b9150612e969050600a8361409f565b9150612e77565b60008167ffffffffffffffff811115612eb857612eb8613915565b6040519080825280601f01601f191660200182016040528015612ee2576020820181803683370190505b5090505b841561174157612ef7600183613ef7565b9150612f04600a8661408b565b612f0f906030613d25565b60f81b818381518110612f2457612f24613f96565b60200101906001600160f81b031916908160001a905350612f46600a8661409f565b9450612ee6565b6001600160a01b038216612fa35760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610b9d565b6000818152600260205260409020546001600160a01b0316156130085760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610b9d565b6130146000838361331d565b6001600160a01b038216600090815260036020526040812080546001929061303d908490613d25565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b826001600160a01b03166130ae82611d9b565b6001600160a01b0316146131165760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610b9d565b6001600160a01b0382166131785760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610b9d565b61318383838361331d565b61318e6000826129e7565b6001600160a01b03831660009081526003602052604081208054600192906131b7908490613ef7565b90915550506001600160a01b03821660009081526003602052604081208054600192906131e5908490613d25565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600081815b84518110156118a157600085828151811061326857613268613f96565b602002602001015190508083116132aa5760408051602081018590529081018290526060016040516020818303038152906040528051906020012092506132d7565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b50806132e281613fac565b91505061324b565b6132f584848461309b565b613301848484846133d5565b6114845760405162461bcd60e51b8152600401610b9d906140b3565b6001600160a01b0383166133785761337381600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b61339b565b816001600160a01b0316836001600160a01b03161461339b5761339b83826134d3565b6001600160a01b0382166133b257610e7381613570565b826001600160a01b0316826001600160a01b031614610e7357610e73828261361f565b60006001600160a01b0384163b156134c857604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290613419903390899088908890600401614105565b6020604051808303816000875af1925050508015613454575060408051601f3d908101601f1916820190925261345191810190614142565b60015b6134ae573d808015613482576040519150601f19603f3d011682016040523d82523d6000602084013e613487565b606091505b5080516134a65760405162461bcd60e51b8152600401610b9d906140b3565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611741565b506001949350505050565b600060016134e084611e2f565b6134ea9190613ef7565b60008381526007602052604090205490915080821461353d576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061358290600190613ef7565b600083815260096020526040812054600880549394509092849081106135aa576135aa613f96565b9060005260206000200154905080600883815481106135cb576135cb613f96565b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806136035761360361415f565b6001900381819060005260206000200160009055905550505050565b600061362a83611e2f565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b82805461366f90613d3d565b90600052602060002090601f01602090048101928261369157600085556136d7565b82601f106136aa5782800160ff198235161785556136d7565b828001600101855582156136d7579182015b828111156136d75782358255916020019190600101906136bc565b506136e392915061375b565b5090565b8280546136f390613d3d565b90600052602060002090601f01602090048101928261371557600085556136d7565b82601f1061372e57805160ff19168380011785556136d7565b828001600101855582156136d7579182015b828111156136d7578251825591602001919060010190613740565b5b808211156136e3576000815560010161375c565b6001600160e01b03198116811461165a57600080fd5b60006020828403121561379857600080fd5b8135612e0881613770565b80356001600160a01b03811681146137ba57600080fd5b919050565b600080604083850312156137d257600080fd5b823591506137e2602084016137a3565b90509250929050565b60005b838110156138065781810151838201526020016137ee565b838111156114845750506000910152565b6000815180845261382f8160208601602086016137eb565b601f01601f19169290920160200192915050565b602081526000612e086020830184613817565b60006020828403121561386857600080fd5b5035919050565b6000806040838503121561388257600080fd5b61388b836137a3565b946020939093013593505050565b6000806000604084860312156138ae57600080fd5b83359250602084013567ffffffffffffffff808211156138cd57600080fd5b818601915086601f8301126138e157600080fd5b8135818111156138f057600080fd5b87602082850101111561390257600080fd5b6020830194508093505050509250925092565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561395457613954613915565b604052919050565b600082601f83011261396d57600080fd5b8135602067ffffffffffffffff82111561398957613989613915565b8160051b61399882820161392b565b92835284810182019282810190878511156139b257600080fd5b83870192505b848310156139d1578235825291830191908301906139b8565b979650505050505050565b600080600080608085870312156139f257600080fd5b843593506020850135925060408501359150606085013567ffffffffffffffff811115613a1e57600080fd5b613a2a8782880161395c565b91505092959194509250565b600060208284031215613a4857600080fd5b612e08826137a3565b600080600060608486031215613a6657600080fd5b613a6f846137a3565b9250613a7d602085016137a3565b9150604084013590509250925092565b600067ffffffffffffffff831115613aa757613aa7613915565b613aba601f8401601f191660200161392b565b9050828152838383011115613ace57600080fd5b828260208301376000602084830101529392505050565b600060208284031215613af757600080fd5b813567ffffffffffffffff811115613b0e57600080fd5b8201601f81018413613b1f57600080fd5b61174184823560208401613a8d565b600080600060608486031215613b4357600080fd5b8335925060208401359150604084013567ffffffffffffffff811115613b6857600080fd5b613b748682870161395c565b9150509250925092565b6020808252825182820181905260009190848201906040850190845b81811015613bb657835183529284019291840191600101613b9a565b50909695505050505050565b608081526000613bd56080830187613817565b8281036020840152613be78187613817565b941515604084015250506060015292915050565b801515811461165a57600080fd5b60008060408385031215613c1c57600080fd5b613c25836137a3565b91506020830135613c3581613bfb565b809150509250929050565b60008060008060808587031215613c5657600080fd5b613c5f856137a3565b9350613c6d602086016137a3565b925060408501359150606085013567ffffffffffffffff811115613c9057600080fd5b8501601f81018713613ca157600080fd5b613a2a87823560208401613a8d565b60008060408385031215613cc357600080fd5b613ccc836137a3565b91506137e2602084016137a3565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b60008219821115613d3857613d38613d0f565b500190565b600181811c90821680613d5157607f821691505b6020821081141561272f57634e487b7160e01b600052602260045260246000fd5b6020808252601d908201527f53656e646572206973206e6f742074686520746f6b656e206f776e6572000000604082015260600190565b602080825260159082015274139bc81d1bdad95b8818dbdb9d1c9858dd081cd95d605a1b604082015260600190565b600080835481600182811c915080831680613df457607f831692505b6020808410821415613e1457634e487b7160e01b86526022600452602486fd5b818015613e285760018114613e3957613e66565b60ff19861689528489019650613e66565b60008a81526020902060005b86811015613e5e5781548b820152908501908301613e45565b505084890196505b509498975050505050505050565b600060208284031215613e8657600080fd5b5051919050565b60008251613e9f8184602087016137eb565b9190910192915050565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b6000816000190483118215151615613ef257613ef2613d0f565b500290565b600082821015613f0957613f09613d0f565b500390565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b6000600019821415613fc057613fc0613d0f565b5060010190565b600060208284031215613fd957600080fd5b8151612e0881613bfb565b60008351613ff68184602088016137eb565b83519083019061400a8183602088016137eb565b660b5b1bd8dad95960ca1b9101908152600701949350505050565b600084516140378184602089016137eb565b84519083019061404b8183602089016137eb565b602d60f81b910190815283516140688160018401602088016137eb565b0160010195945050505050565b634e487b7160e01b600052601260045260246000fd5b60008261409a5761409a614075565b500690565b6000826140ae576140ae614075565b500490565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061413890830184613817565b9695505050505050565b60006020828403121561415457600080fd5b8151612e0881613770565b634e487b7160e01b600052603160045260246000fdfea264697066735822122049f8cc3d512d4e36cb031185e8eae25fa712f9fb0cd3d79374285abb35127cba64736f6c634300080b003300000000000000000000000000000000000000000000000000000000000000403d2ec815b12127dd6521cdca69a43ac8cdde13be4a435b0f52066027c78e8b490000000000000000000000000000000000000000000000000000000000000035697066733a2f2f516d58763664574b52696a796677615441414a484c327a6e503854386b4b747677454750665638385261744a59570000000000000000000000

Deployed Bytecode

0x6080604052600436106103a25760003560e01c806353e76f2c116101e7578063a22cb4651161010d578063e52f7d0b116100a0578063f2fde38b1161006f578063f2fde38b14610abb578063f4a0a52814610adb578063f569043014610afb578063ff50188514610b1b57600080fd5b8063e52f7d0b14610a0f578063e63ec94714610a2f578063e7a686bd14610a5c578063e985e9c514610a7257600080fd5b8063b88d4fde116100dc578063b88d4fde146109a4578063c87b56dd146109c4578063ce03ec93146109e4578063e3bdf0c9146109f957600080fd5b8063a22cb4651461093a578063af3a19c71461095a578063b2873d5c1461096f578063b4ced2101461098457600080fd5b806370a0823111610185578063851a299311610154578063851a2993146108a45780638978b2da146108d45780638da5cb5b1461090757806395d89b411461092557600080fd5b806370a082311461082f578063715018a61461084f5780637cb6475914610864578063820de0c51461088457600080fd5b80636817c76c116101c15780636817c76c146107c457806368428a1b146107da5780636b8ff574146107fa5780636ba90c6e1461081a57600080fd5b806353e76f2c1461076e5780635e80d2bb1461078e5780636352211e146107a457600080fd5b806330176e13116102cc578063438b63001161026a5780634f062c5a116102395780634f062c5a146106e55780634f6ccce714610715578063518302271461073557806353135ca01461074f57600080fd5b8063438b6300146106635780634925ec55146106905780634c261247146106b05780634de8815c146106d057600080fd5b80633423e548116102a65780633423e548146105ee578063391709d71461060e5780633ccfd60b1461062e57806342842e0e1461064357600080fd5b806330176e131461059857806332cb6b0c146105b857806333da99f6146105ce57600080fd5b80631725051f1161034457806323b872dd1161031357806323b872dd1461052f5780632db115441461054f5780632eb4a7ab146105625780632f745c591461057857600080fd5b80631725051f146104b857806318160ddd146104cd5780631a3ff970146104ec57806321328f9e146104ff57600080fd5b8063081812fc11610380578063081812fc14610420578063095ea7b31461045857806314dee4b31461047857806316646fc81461049857600080fd5b806301ffc9a7146103a757806303339bcb146103dc57806306fdde03146103fe575b600080fd5b3480156103b357600080fd5b506103c76103c2366004613786565b610b48565b60405190151581526020015b60405180910390f35b3480156103e857600080fd5b506103fc6103f73660046137bf565b610b73565b005b34801561040a57600080fd5b50610413610c3b565b6040516103d39190613843565b34801561042c57600080fd5b5061044061043b366004613856565b610ccd565b6040516001600160a01b0390911681526020016103d3565b34801561046457600080fd5b506103fc61047336600461386f565b610d62565b34801561048457600080fd5b506103fc610493366004613899565b610e78565b3480156104a457600080fd5b506103fc6104b3366004613856565b61114a565b3480156104c457600080fd5b506103fc611179565b3480156104d957600080fd5b506008545b6040519081526020016103d3565b6103fc6104fa3660046139dc565b6111c0565b34801561050b57600080fd5b506103c761051a366004613a36565b60136020526000908152604090205460ff1681565b34801561053b57600080fd5b506103fc61054a366004613a51565b61148a565b6103fc61055d366004613856565b611567565b34801561056e57600080fd5b506104de60115481565b34801561058457600080fd5b506104de61059336600461386f565b61165d565b3480156105a457600080fd5b506103fc6105b3366004613ae5565b6116f3565b3480156105c457600080fd5b506104de6122b881565b3480156105da57600080fd5b50601654610440906001600160a01b031681565b3480156105fa57600080fd5b506103c7610609366004613b2e565b611734565b34801561061a57600080fd5b506103fc610629366004613856565b611749565b34801561063a57600080fd5b506103fc611778565b34801561064f57600080fd5b506103fc61065e366004613a51565b6117ec565b34801561066f57600080fd5b5061068361067e366004613a36565b611807565b6040516103d39190613b7e565b34801561069c57600080fd5b506104136106ab366004613856565b6118a9565b3480156106bc57600080fd5b506103fc6106cb366004613ae5565b61194e565b3480156106dc57600080fd5b506103fc6119e3565b3480156106f157600080fd5b506104de610700366004613856565b6000908152601a602052604090206003015490565b34801561072157600080fd5b506104de610730366004613856565b611a71565b34801561074157600080fd5b506014546103c79060ff1681565b34801561075b57600080fd5b506014546103c790610100900460ff1681565b34801561077a57600080fd5b506103fc610789366004613899565b611b04565b34801561079a57600080fd5b506104de60195481565b3480156107b057600080fd5b506104406107bf366004613856565b611d9b565b3480156107d057600080fd5b506104de600f5481565b3480156107e657600080fd5b506014546103c79062010000900460ff1681565b34801561080657600080fd5b50610413610815366004613856565b611e12565b34801561082657600080fd5b506104de601e81565b34801561083b57600080fd5b506104de61084a366004613a36565b611e2f565b34801561085b57600080fd5b506103fc611eb6565b34801561087057600080fd5b506103fc61087f366004613856565b611eec565b34801561089057600080fd5b506103fc61089f366004613ae5565b611f1b565b3480156108b057600080fd5b506108c46108bf366004613856565b611f58565b6040516103d39493929190613bc2565b3480156108e057600080fd5b506103c76108ef366004613856565b6000908152601a602052604090206002015460ff1690565b34801561091357600080fd5b50600a546001600160a01b0316610440565b34801561093157600080fd5b50610413612094565b34801561094657600080fd5b506103fc610955366004613c09565b6120a3565b34801561096657600080fd5b506104de600381565b34801561097b57600080fd5b506104136120ae565b34801561099057600080fd5b506103fc61099f366004613856565b61213c565b3480156109b057600080fd5b506103fc6109bf366004613c40565b612462565b3480156109d057600080fd5b506104136109df366004613856565b612541565b3480156109f057600080fd5b506103fc612735565b348015610a0557600080fd5b506104de60185481565b348015610a1b57600080fd5b506103fc610a2a366004613856565b61277e565b348015610a3b57600080fd5b506104de610a4a366004613a36565b60126020526000908152604090205481565b348015610a6857600080fd5b506104de60175481565b348015610a7e57600080fd5b506103c7610a8d366004613cb0565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b348015610ac757600080fd5b506103fc610ad6366004613a36565b6127ad565b348015610ae757600080fd5b506103fc610af6366004613856565b612845565b348015610b0757600080fd5b506103fc610b16366004613a36565b612874565b348015610b2757600080fd5b506104de610b36366004613a36565b60156020526000908152604090205481565b60006001600160e01b0319821663780e9d6360e01b1480610b6d5750610b6d826128c0565b92915050565b600a546001600160a01b03163314610ba65760405162461bcd60e51b8152600401610b9d90613cda565b60405180910390fd5b601e82600d54610bb69190613d25565b1115610c165760405162461bcd60e51b815260206004820152602960248201527f45786365656473206d6178696d756d206e756d626572206f6620726573657276604482015268656420746f6b656e7360b81b6064820152608401610b9d565b610c208183612910565b81600d6000828254610c329190613d25565b90915550505050565b606060008054610c4a90613d3d565b80601f0160208091040260200160405190810160405280929190818152602001828054610c7690613d3d565b8015610cc35780601f10610c9857610100808354040283529160200191610cc3565b820191906000526020600020905b815481529060010190602001808311610ca657829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610d465760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610b9d565b506000908152600460205260409020546001600160a01b031690565b6000610d6d82611d9b565b9050806001600160a01b0316836001600160a01b03161415610ddb5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610b9d565b336001600160a01b0382161480610df75750610df78133610a8d565b610e695760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610b9d565b610e7383836129e7565b505050565b8233610e8382611d9b565b6001600160a01b031614610ea95760405162461bcd60e51b8152600401610b9d90613d72565b6016546001600160a01b0316610ed15760405162461bcd60e51b8152600401610b9d90613da9565b600083838080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250508251929350505015801590610f1e57506101188151105b610f6a5760405162461bcd60e51b815260206004820152601a60248201527f496e76616c6964206465736372697074696f6e206c656e6774680000000000006044820152606401610b9d565b6002601a6000878152602001908152602001600020600101604051610f8f9190613dd8565b602060405180830381855afa158015610fac573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190610fcf9190613e74565b600282604051610fdf9190613e8d565b602060405180830381855afa158015610ffc573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061101f9190613e74565b14156110845760405162461bcd60e51b815260206004820152602e60248201527f4e6577206465736372697074696f6e2069732073616d6520617320637572726560448201526d373a103232b9b1b934b83a34b7b760911b6064820152608401610b9d565b601654601854604051632770a7eb60e21b815233600482015260248101919091526001600160a01b0390911690639dc29fac90604401600060405180830381600087803b1580156110d457600080fd5b505af11580156110e8573d6000803e3d6000fd5b5050506000868152601a6020526040902061110891506001018585613663565b50847fa5eb4fe2f21ddb28c752c9927387264d67ce06b0ce619ad8b4b06d8dfe948347858560405161113b929190613ea9565b60405180910390a25050505050565b600a546001600160a01b031633146111745760405162461bcd60e51b8152600401610b9d90613cda565b601855565b600a546001600160a01b031633146111a35760405162461bcd60e51b8152600401610b9d90613cda565b6014805461ff001981166101009182900460ff1615909102179055565b601454610100900460ff1661120c5760405162461bcd60e51b815260206004820152601260248201527150726573616c65206e6f742061637469766560701b6044820152606401610b9d565b3360009081526013602052604090205460ff1661134c576040516bffffffffffffffffffffffff193360601b16602082015260348101849052829060540160405160208183030381529060405280519060200120146112bf5760405162461bcd60e51b815260206004820152602960248201527f53656e64657220616e6420616d6f756e7420646f6e2774206d61746368204d656044820152683935b632903632b0b360b91b6064820152608401610b9d565b6112cc6011548383611734565b6113245760405162461bcd60e51b815260206004820152602360248201527f4e6f7420612076616c6964206c65616620696e20746865204d65726b6c65207460448201526272656560e81b6064820152608401610b9d565b336000908152601360209081526040808320805460ff19166001179055601290915290208390555b600084116113925760405162461bcd60e51b8152602060048201526013602482015272125b9d985b1a59081b5a5b9d08185b5bdd5b9d606a1b6044820152606401610b9d565b600f5461139f9085613ed8565b3410156113e45760405162461bcd60e51b8152602060048201526013602482015272139bdd08195b9bdd59da08115512081cd95b9d606a1b6044820152606401610b9d565b336000908152601260205260409020548411156114555760405162461bcd60e51b815260206004820152602960248201527f43616e2774206d696e74206d6f7265207468616e2072656d61696e696e672061604482015268363637b1b0ba34b7b760b91b6064820152608401610b9d565b3360009081526012602052604081208054869290611474908490613ef7565b9091555061148490503385612910565b50505050565b6002600b5414156114ad5760405162461bcd60e51b8152600401610b9d90613f0e565b6002600b556114bd335b82612a55565b6114d95760405162461bcd60e51b8152600401610b9d90613f45565b6016546001600160a01b0316156115525760165460405163c640752d60e01b81526001600160a01b03858116600483015284811660248301529091169063c640752d90604401600060405180830381600087803b15801561153957600080fd5b505af115801561154d573d6000803e3d6000fd5b505050505b61155d838383612b48565b50506001600b5550565b60145462010000900460ff166115b85760405162461bcd60e51b81526020600482015260166024820152755075626c69632073616c65206e6f742061637469766560501b6044820152606401610b9d565b600081116115fe5760405162461bcd60e51b8152602060048201526013602482015272125b9d985b1a59081b5a5b9d08185b5bdd5b9d606a1b6044820152606401610b9d565b600f5461160b9082613ed8565b3410156116505760405162461bcd60e51b8152602060048201526013602482015272139bdd08195b9bdd59da08115512081cd95b9d606a1b6044820152606401610b9d565b61165a3382612910565b50565b600061166883611e2f565b82106116ca5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610b9d565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600a546001600160a01b0316331461171d5760405162461bcd60e51b8152600401610b9d90613cda565b805161173090600e9060208401906136e7565b5050565b6000611741828585612b78565b949350505050565b600a546001600160a01b031633146117735760405162461bcd60e51b8152600401610b9d90613cda565b601755565b600a546001600160a01b031633146117a25760405162461bcd60e51b8152600401610b9d90613cda565b6002600b5414156117c55760405162461bcd60e51b8152600401610b9d90613f0e565b6002600b556117e56117df600a546001600160a01b031690565b47612b8e565b6001600b55565b610e7383838360405180602001604052806000815250612462565b6060600061181483611e2f565b905060008167ffffffffffffffff81111561183157611831613915565b60405190808252806020026020018201604052801561185a578160200160208202803683370190505b50905060005b828110156118a157611872858261165d565b82828151811061188457611884613f96565b60209081029190910101528061189981613fac565b915050611860565b509392505050565b6000818152601a602052604090206001018054606091906118c990613d3d565b80601f01602080910402602001604051908101604052809291908181526020018280546118f590613d3d565b80156119425780601f1061191757610100808354040283529160200191611942565b820191906000526020600020905b81548152906001019060200180831161192557829003601f168201915b50505050509050919050565b600a546001600160a01b031633146119785760405162461bcd60e51b8152600401610b9d90613cda565b60145460ff16156119c35760405162461bcd60e51b81526020600482015260156024820152741391951cc8185b1c9958591e481c995d99585b1959605a1b6044820152606401610b9d565b6014805460ff19166001179055805161173090600e9060208401906136e7565b600a546001600160a01b03163314611a0d5760405162461bcd60e51b8152600401610b9d90613cda565b60005b600c54811015611a45576000818152601a60205260409020600201805460ff1916905580611a3d81613fac565b915050611a10565b506040517ffcf20df6e8058edf51cac04597457f11c3185616b462bbfa0603f574b308551b90600090a1565b6000611a7c60085490565b8210611adf5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610b9d565b60088281548110611af257611af2613f96565b90600052602060002001549050919050565b8233611b0f82611d9b565b6001600160a01b031614611b355760405162461bcd60e51b8152600401610b9d90613d72565b6016546001600160a01b0316611b5d5760405162461bcd60e51b8152600401610b9d90613da9565b600083838080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250508251929350505015801590611ba9575060198151105b611beb5760405162461bcd60e51b8152602060048201526013602482015272092dcecc2d8d2c840dcc2daca40d8cadccee8d606b1b6044820152606401610b9d565b6000858152601a6020526040908190209051600291611c0991613dd8565b602060405180830381855afa158015611c26573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190611c499190613e74565b600282604051611c599190613e8d565b602060405180830381855afa158015611c76573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190611c999190613e74565b1415611ce75760405162461bcd60e51b815260206004820181905260248201527f4e6577206e616d652069732073616d652061732063757272656e74206e616d656044820152606401610b9d565b601654601754604051632770a7eb60e21b815233600482015260248101919091526001600160a01b0390911690639dc29fac90604401600060405180830381600087803b158015611d3757600080fd5b505af1158015611d4b573d6000803e3d6000fd5b5050506000868152601a60205260409020611d6891508585613663565b50847fac2072268d18e10aecad35c0c04acd66330b2571a8ff403e3c702d77d3bab134858560405161113b929190613ea9565b6000818152600260205260408120546001600160a01b031680610b6d5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610b9d565b6000818152601a602052604090208054606091906118c990613d3d565b60006001600160a01b038216611e9a5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610b9d565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b03163314611ee05760405162461bcd60e51b8152600401610b9d90613cda565b611eea6000612ca7565b565b600a546001600160a01b03163314611f165760405162461bcd60e51b8152600401610b9d90613cda565b601155565b600a546001600160a01b03163314611f455760405162461bcd60e51b8152600401610b9d90613cda565b80516117309060109060208401906136e7565b601a60205260009081526040902080548190611f7390613d3d565b80601f0160208091040260200160405190810160405280929190818152602001828054611f9f90613d3d565b8015611fec5780601f10611fc157610100808354040283529160200191611fec565b820191906000526020600020905b815481529060010190602001808311611fcf57829003601f168201915b50505050509080600101805461200190613d3d565b80601f016020809104026020016040519081016040528092919081815260200182805461202d90613d3d565b801561207a5780601f1061204f5761010080835404028352916020019161207a565b820191906000526020600020905b81548152906001019060200180831161205d57829003601f168201915b505050506002830154600390930154919260ff1691905084565b606060018054610c4a90613d3d565b611730338383612cf9565b601080546120bb90613d3d565b80601f01602080910402602001604051908101604052809291908181526020018280546120e790613d3d565b80156121345780601f1061210957610100808354040283529160200191612134565b820191906000526020600020905b81548152906001019060200180831161211757829003601f168201915b505050505081565b803361214782611d9b565b6001600160a01b03161461216d5760405162461bcd60e51b8152600401610b9d90613d72565b6016546001600160a01b03166121955760405162461bcd60e51b8152600401610b9d90613da9565b6040516344bc596d60e11b8152600481018390523090638978b2da90602401602060405180830381865afa1580156121d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121f59190613fc7565b156122345760405162461bcd60e51b815260206004820152600f60248201526e151bdad95b881a5cc81b1bd8dad959608a1b6044820152606401610b9d565b604051632783162d60e11b8152600481018390526000903090634f062c5a90602401602060405180830381865afa158015612273573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122979190613e74565b9050600381106122e25760405162461bcd60e51b81526020600482015260166024820152752a37b5b2b71030b63932b0b23c9036b0bc103a34b2b960511b6044820152606401610b9d565b601654601954604051632770a7eb60e21b815233600482015260248101919091526001600160a01b0390911690639dc29fac90604401600060405180830381600087803b15801561233257600080fd5b505af1158015612346573d6000803e3d6000fd5b50505050600061235584612dc8565b9050806123f9576000848152601a6020908152604080832060028101805460ff191660019081179091556003909101939093555191825285917fb471b3e3af9a1892fc86eff069103ffd01354f72aa939339d1510ec5eaf89c23910160405180910390a2604080518381526000602082015285917f7bf3c87192c766908d5bc0948bf458d12ea76ac1f015c328ed888f083883e3b8910160405180910390a2611484565b612404826001613d25565b6000858152601a6020526040902060030155837f7bf3c87192c766908d5bc0948bf458d12ea76ac1f015c328ed888f083883e3b883612444816001613d25565b6040805192835260208301919091520160405180910390a250505050565b6002600b5414156124855760405162461bcd60e51b8152600401610b9d90613f0e565b6002600b55612495335b83612a55565b6124b15760405162461bcd60e51b8152600401610b9d90613f45565b6016546001600160a01b03161561252a5760165460405163c640752d60e01b81526001600160a01b03868116600483015285811660248301529091169063c640752d90604401600060405180830381600087803b15801561251157600080fd5b505af1158015612525573d6000803e3d6000fd5b505050505b61253684848484612e0f565b50506001600b555050565b6060600061254d612e40565b60145490915060ff161561269c576040516344bc596d60e11b8152600481018490526000903090638978b2da90602401602060405180830381865afa15801561259a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125be9190613fc7565b905080156125f957816125d085612e4f565b6040516020016125e1929190613fe4565b60405160208183030381529060405292505050919050565b604051632783162d60e11b8152600481018590526000903090634f062c5a90602401602060405180830381865afa158015612638573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061265c9190613e74565b90508261266886612e4f565b61267183612e4f565b60405160200161268393929190614025565b6040516020818303038152906040529350505050919050565b601080546126a990613d3d565b80601f01602080910402602001604051908101604052809291908181526020018280546126d590613d3d565b80156127225780601f106126f757610100808354040283529160200191612722565b820191906000526020600020905b81548152906001019060200180831161270557829003601f168201915b5050505050915050919050565b50919050565b600a546001600160a01b0316331461275f5760405162461bcd60e51b8152600401610b9d90613cda565b6014805462ff0000198116620100009182900460ff1615909102179055565b600a546001600160a01b031633146127a85760405162461bcd60e51b8152600401610b9d90613cda565b601955565b600a546001600160a01b031633146127d75760405162461bcd60e51b8152600401610b9d90613cda565b6001600160a01b03811661283c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b9d565b61165a81612ca7565b600a546001600160a01b0316331461286f5760405162461bcd60e51b8152600401610b9d90613cda565b600f55565b600a546001600160a01b0316331461289e5760405162461bcd60e51b8152600401610b9d90613cda565b601680546001600160a01b0319166001600160a01b0392909216919091179055565b60006001600160e01b031982166380ac58cd60e01b14806128f157506001600160e01b03198216635b5e139f60e01b145b80610b6d57506301ffc9a760e01b6001600160e01b0319831614610b6d565b6122b881600c546129219190613d25565b1061296e5760405162461bcd60e51b815260206004820181905260248201527f45786365656473206d6178696d756d206e756d626572206f6620746f6b656e736044820152606401610b9d565b60005b81811015610e735761298583600c54612f4d565b600c546040516001600160a01b038516907f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d412139688590600090a36001600c60008282546129cf9190613d25565b909155508190506129df81613fac565b915050612971565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190612a1c82611d9b565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316612ace5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610b9d565b6000612ad983611d9b565b9050806001600160a01b0316846001600160a01b03161480612b145750836001600160a01b0316612b0984610ccd565b6001600160a01b0316145b8061174157506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff16611741565b612b51336114b7565b612b6d5760405162461bcd60e51b8152600401610b9d90613f45565b610e7383838361309b565b600082612b858584613246565b14949350505050565b80471015612bde5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610b9d565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612c2b576040519150601f19603f3d011682016040523d82523d6000602084013e612c30565b606091505b5050905080610e735760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610b9d565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b03161415612d5b5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610b9d565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6040805144602080830191909152428284015260608083018590528351808403909101815260809092019092528051910120600090612e0860028261408b565b9392505050565b612e183361248f565b612e345760405162461bcd60e51b8152600401610b9d90613f45565b611484848484846132ea565b6060600e8054610c4a90613d3d565b606081612e735750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612e9d5780612e8781613fac565b9150612e969050600a8361409f565b9150612e77565b60008167ffffffffffffffff811115612eb857612eb8613915565b6040519080825280601f01601f191660200182016040528015612ee2576020820181803683370190505b5090505b841561174157612ef7600183613ef7565b9150612f04600a8661408b565b612f0f906030613d25565b60f81b818381518110612f2457612f24613f96565b60200101906001600160f81b031916908160001a905350612f46600a8661409f565b9450612ee6565b6001600160a01b038216612fa35760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610b9d565b6000818152600260205260409020546001600160a01b0316156130085760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610b9d565b6130146000838361331d565b6001600160a01b038216600090815260036020526040812080546001929061303d908490613d25565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b826001600160a01b03166130ae82611d9b565b6001600160a01b0316146131165760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610b9d565b6001600160a01b0382166131785760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610b9d565b61318383838361331d565b61318e6000826129e7565b6001600160a01b03831660009081526003602052604081208054600192906131b7908490613ef7565b90915550506001600160a01b03821660009081526003602052604081208054600192906131e5908490613d25565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600081815b84518110156118a157600085828151811061326857613268613f96565b602002602001015190508083116132aa5760408051602081018590529081018290526060016040516020818303038152906040528051906020012092506132d7565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b50806132e281613fac565b91505061324b565b6132f584848461309b565b613301848484846133d5565b6114845760405162461bcd60e51b8152600401610b9d906140b3565b6001600160a01b0383166133785761337381600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b61339b565b816001600160a01b0316836001600160a01b03161461339b5761339b83826134d3565b6001600160a01b0382166133b257610e7381613570565b826001600160a01b0316826001600160a01b031614610e7357610e73828261361f565b60006001600160a01b0384163b156134c857604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290613419903390899088908890600401614105565b6020604051808303816000875af1925050508015613454575060408051601f3d908101601f1916820190925261345191810190614142565b60015b6134ae573d808015613482576040519150601f19603f3d011682016040523d82523d6000602084013e613487565b606091505b5080516134a65760405162461bcd60e51b8152600401610b9d906140b3565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611741565b506001949350505050565b600060016134e084611e2f565b6134ea9190613ef7565b60008381526007602052604090205490915080821461353d576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061358290600190613ef7565b600083815260096020526040812054600880549394509092849081106135aa576135aa613f96565b9060005260206000200154905080600883815481106135cb576135cb613f96565b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806136035761360361415f565b6001900381819060005260206000200160009055905550505050565b600061362a83611e2f565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b82805461366f90613d3d565b90600052602060002090601f01602090048101928261369157600085556136d7565b82601f106136aa5782800160ff198235161785556136d7565b828001600101855582156136d7579182015b828111156136d75782358255916020019190600101906136bc565b506136e392915061375b565b5090565b8280546136f390613d3d565b90600052602060002090601f01602090048101928261371557600085556136d7565b82601f1061372e57805160ff19168380011785556136d7565b828001600101855582156136d7579182015b828111156136d7578251825591602001919060010190613740565b5b808211156136e3576000815560010161375c565b6001600160e01b03198116811461165a57600080fd5b60006020828403121561379857600080fd5b8135612e0881613770565b80356001600160a01b03811681146137ba57600080fd5b919050565b600080604083850312156137d257600080fd5b823591506137e2602084016137a3565b90509250929050565b60005b838110156138065781810151838201526020016137ee565b838111156114845750506000910152565b6000815180845261382f8160208601602086016137eb565b601f01601f19169290920160200192915050565b602081526000612e086020830184613817565b60006020828403121561386857600080fd5b5035919050565b6000806040838503121561388257600080fd5b61388b836137a3565b946020939093013593505050565b6000806000604084860312156138ae57600080fd5b83359250602084013567ffffffffffffffff808211156138cd57600080fd5b818601915086601f8301126138e157600080fd5b8135818111156138f057600080fd5b87602082850101111561390257600080fd5b6020830194508093505050509250925092565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561395457613954613915565b604052919050565b600082601f83011261396d57600080fd5b8135602067ffffffffffffffff82111561398957613989613915565b8160051b61399882820161392b565b92835284810182019282810190878511156139b257600080fd5b83870192505b848310156139d1578235825291830191908301906139b8565b979650505050505050565b600080600080608085870312156139f257600080fd5b843593506020850135925060408501359150606085013567ffffffffffffffff811115613a1e57600080fd5b613a2a8782880161395c565b91505092959194509250565b600060208284031215613a4857600080fd5b612e08826137a3565b600080600060608486031215613a6657600080fd5b613a6f846137a3565b9250613a7d602085016137a3565b9150604084013590509250925092565b600067ffffffffffffffff831115613aa757613aa7613915565b613aba601f8401601f191660200161392b565b9050828152838383011115613ace57600080fd5b828260208301376000602084830101529392505050565b600060208284031215613af757600080fd5b813567ffffffffffffffff811115613b0e57600080fd5b8201601f81018413613b1f57600080fd5b61174184823560208401613a8d565b600080600060608486031215613b4357600080fd5b8335925060208401359150604084013567ffffffffffffffff811115613b6857600080fd5b613b748682870161395c565b9150509250925092565b6020808252825182820181905260009190848201906040850190845b81811015613bb657835183529284019291840191600101613b9a565b50909695505050505050565b608081526000613bd56080830187613817565b8281036020840152613be78187613817565b941515604084015250506060015292915050565b801515811461165a57600080fd5b60008060408385031215613c1c57600080fd5b613c25836137a3565b91506020830135613c3581613bfb565b809150509250929050565b60008060008060808587031215613c5657600080fd5b613c5f856137a3565b9350613c6d602086016137a3565b925060408501359150606085013567ffffffffffffffff811115613c9057600080fd5b8501601f81018713613ca157600080fd5b613a2a87823560208401613a8d565b60008060408385031215613cc357600080fd5b613ccc836137a3565b91506137e2602084016137a3565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b60008219821115613d3857613d38613d0f565b500190565b600181811c90821680613d5157607f821691505b6020821081141561272f57634e487b7160e01b600052602260045260246000fd5b6020808252601d908201527f53656e646572206973206e6f742074686520746f6b656e206f776e6572000000604082015260600190565b602080825260159082015274139bc81d1bdad95b8818dbdb9d1c9858dd081cd95d605a1b604082015260600190565b600080835481600182811c915080831680613df457607f831692505b6020808410821415613e1457634e487b7160e01b86526022600452602486fd5b818015613e285760018114613e3957613e66565b60ff19861689528489019650613e66565b60008a81526020902060005b86811015613e5e5781548b820152908501908301613e45565b505084890196505b509498975050505050505050565b600060208284031215613e8657600080fd5b5051919050565b60008251613e9f8184602087016137eb565b9190910192915050565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b6000816000190483118215151615613ef257613ef2613d0f565b500290565b600082821015613f0957613f09613d0f565b500390565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b6000600019821415613fc057613fc0613d0f565b5060010190565b600060208284031215613fd957600080fd5b8151612e0881613bfb565b60008351613ff68184602088016137eb565b83519083019061400a8183602088016137eb565b660b5b1bd8dad95960ca1b9101908152600701949350505050565b600084516140378184602089016137eb565b84519083019061404b8183602089016137eb565b602d60f81b910190815283516140688160018401602088016137eb565b0160010195945050505050565b634e487b7160e01b600052601260045260246000fd5b60008261409a5761409a614075565b500690565b6000826140ae576140ae614075565b500490565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061413890830184613817565b9695505050505050565b60006020828403121561415457600080fd5b8151612e0881613770565b634e487b7160e01b600052603160045260246000fdfea264697066735822122049f8cc3d512d4e36cb031185e8eae25fa712f9fb0cd3d79374285abb35127cba64736f6c634300080b0033

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

00000000000000000000000000000000000000000000000000000000000000403d2ec815b12127dd6521cdca69a43ac8cdde13be4a435b0f52066027c78e8b490000000000000000000000000000000000000000000000000000000000000035697066733a2f2f516d58763664574b52696a796677615441414a484c327a6e503854386b4b747677454750665638385261744a59570000000000000000000000

-----Decoded View---------------
Arg [0] : unrevealedTokenURI (string): ipfs://QmXv6dWKRijyfwaTAAJHL2znP8T8kKtvwEGPfV88RatJYW
Arg [1] : root (bytes32): 0x3d2ec815b12127dd6521cdca69a43ac8cdde13be4a435b0f52066027c78e8b49

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 3d2ec815b12127dd6521cdca69a43ac8cdde13be4a435b0f52066027c78e8b49
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000035
Arg [3] : 697066733a2f2f516d58763664574b52696a796677615441414a484c327a6e50
Arg [4] : 3854386b4b747677454750665638385261744a59570000000000000000000000


Deployed Bytecode Sourcemap

54802:6182:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40663:224;;;;;;;;;;-1:-1:-1;40663:224:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;40663:224:0;;;;;;;;51337:246;;;;;;;;;;-1:-1:-1;51337:246:0;;;;;:::i;:::-;;:::i;:::-;;28157:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;29716:221::-;;;;;;;;;;-1:-1:-1;29716:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2129:32:1;;;2111:51;;2099:2;2084:18;29716:221:0;1965:203:1;29239:411:0;;;;;;;;;;-1:-1:-1;29239:411:0;;;;;:::i;:::-;;:::i;58318:654::-;;;;;;;;;;-1:-1:-1;58318:654:0;;;;;:::i;:::-;;:::i;56796:116::-;;;;;;;;;;-1:-1:-1;56796:116:0;;;;;:::i;:::-;;:::i;51140:95::-;;;;;;;;;;;;;:::i;41303:113::-;;;;;;;;;;-1:-1:-1;41391:10:0;:17;41303:113;;;3243:25:1;;;3231:2;3216:18;41303:113:0;3097:177:1;51933:1240:0;;;;;;:::i;:::-;;:::i;49983:45::-;;;;;;;;;;-1:-1:-1;49983:45:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;59046:392;;;;;;;;;;-1:-1:-1;59046:392:0;;;;;:::i;:::-;;:::i;53221:299::-;;;;;;:::i;:::-;;:::i;49886:30::-;;;;;;;;;;;;;;;;40971:256;;;;;;;;;;-1:-1:-1;40971:256:0;;;;;:::i;:::-;;:::i;50515:99::-;;;;;;;;;;-1:-1:-1;50515:99:0;;;;;:::i;:::-;;:::i;49704:41::-;;;;;;;;;;;;49741:4;49704:41;;55374:15;;;;;;;;;;-1:-1:-1;55374:15:0;;;;-1:-1:-1;;;;;55374:15:0;;;51674:192;;;;;;;;;;-1:-1:-1;51674:192:0;;;;;:::i;:::-;;:::i;56686:102::-;;;;;;;;;;-1:-1:-1;56686:102:0;;;;;:::i;:::-;;:::i;54464:127::-;;;;;;;;;;;;;:::i;30876:185::-;;;;;;;;;;-1:-1:-1;30876:185:0;;;;;:::i;:::-;;:::i;54076:345::-;;;;;;;;;;-1:-1:-1;54076:345:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;57361:136::-;;;;;;;;;;-1:-1:-1;57361:136:0;;;;;:::i;:::-;;:::i;50740:170::-;;;;;;;;;;-1:-1:-1;50740:170:0;;;;;:::i;:::-;;:::i;57018:180::-;;;;;;;;;;;;;:::i;57634:116::-;;;;;;;;;;-1:-1:-1;57634:116:0;;;;;:::i;:::-;57691:7;57718:19;;;:10;:19;;;;;:24;;;;57634:116;41493:233;;;;;;;;;;-1:-1:-1;41493:233:0;;;;;:::i;:::-;;:::i;50037:20::-;;;;;;;;;;-1:-1:-1;50037:20:0;;;;;;;;50064:25;;;;;;;;;;-1:-1:-1;50064:25:0;;;;;;;;;;;57785:525;;;;;;;;;;-1:-1:-1;57785:525:0;;;;;:::i;:::-;;:::i;55546:36::-;;;;;;;;;;;;;;;;27851:239;;;;;;;;;;-1:-1:-1;27851:239:0;;;;;:::i;:::-;;:::i;49802:36::-;;;;;;;;;;;;;;;;50096:22;;;;;;;;;;-1:-1:-1;50096:22:0;;;;;;;;;;;57231:122;;;;;;;;;;-1:-1:-1;57231:122:0;;;;;:::i;:::-;;:::i;49752:41::-;;;;;;;;;;;;49791:2;49752:41;;27581:208;;;;;;;;;;-1:-1:-1;27581:208:0;;;;;:::i;:::-;;:::i;48524:103::-;;;;;;;;;;;;;:::i;51028:104::-;;;;;;;;;;-1:-1:-1;51028:104:0;;;;;:::i;:::-;;:::i;50622:110::-;;;;;;;;;;-1:-1:-1;50622:110:0;;;;;:::i;:::-;;:::i;55591:48::-;;;;;;;;;;-1:-1:-1;55591:48:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;57505:121::-;;;;;;;;;;-1:-1:-1;57505:121:0;;;;;:::i;:::-;57568:4;57592:19;;;:10;:19;;;;;:26;;;;;;57505:121;47873:87;;;;;;;;;;-1:-1:-1;47946:6:0;;-1:-1:-1;;;;;47946:6:0;47873:87;;28326:104;;;;;;;;;;;;;:::i;30009:155::-;;;;;;;;;;-1:-1:-1;30009:155:0;;;;;:::i;:::-;;:::i;55398:36::-;;;;;;;;;;;;55433:1;55398:36;;49845:32;;;;;;;;;;;;;:::i;59888:841::-;;;;;;;;;;-1:-1:-1;59888:841:0;;;;;:::i;:::-;;:::i;59446:434::-;;;;;;;;;;-1:-1:-1;59446:434:0;;;;;:::i;:::-;;:::i;55956:601::-;;;;;;;;;;-1:-1:-1;55956:601:0;;;;;:::i;:::-;;:::i;51243:86::-;;;;;;;;;;;;;:::i;55491:48::-;;;;;;;;;;;;;;;;56920:90;;;;;;;;;;-1:-1:-1;56920:90:0;;;;;:::i;:::-;;:::i;49923:53::-;;;;;;;;;;-1:-1:-1;49923:53:0;;;;;:::i;:::-;;;;;;;;;;;;;;55443:41;;;;;;;;;;;;;;;;30235:164;;;;;;;;;;-1:-1:-1;30235:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;30356:25:0;;;30332:4;30356:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;30235:164;48782:201;;;;;;;;;;-1:-1:-1;48782:201:0;;;;;:::i;:::-;;:::i;50918:102::-;;;;;;;;;;-1:-1:-1;50918:102:0;;;;;:::i;:::-;;:::i;56591:87::-;;;;;;;;;;-1:-1:-1;56591:87:0;;;;;:::i;:::-;;:::i;50125:47::-;;;;;;;;;;-1:-1:-1;50125:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;40663:224;40765:4;-1:-1:-1;;;;;;40789:50:0;;-1:-1:-1;;;40789:50:0;;:90;;;40843:36;40867:11;40843:23;:36::i;:::-;40782:97;40663:224;-1:-1:-1;;40663:224:0:o;51337:246::-;47946:6;;-1:-1:-1;;;;;47946:6:0;25686:10;48093:23;48085:68;;;;-1:-1:-1;;;48085:68:0;;;;;;;:::i;:::-;;;;;;;;;49791:2:::1;51430:6;51418:9;;:18;;;;:::i;:::-;:34;;51410:88;;;::::0;-1:-1:-1;;;51410:88:0;;10822:2:1;51410:88:0::1;::::0;::::1;10804:21:1::0;10861:2;10841:18;;;10834:30;10900:34;10880:18;;;10873:62;-1:-1:-1;;;10951:18:1;;;10944:39;11000:19;;51410:88:0::1;10620:405:1::0;51410:88:0::1;51511:34;51534:2;51538:6;51511:22;:34::i;:::-;51569:6;51556:9;;:19;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;;51337:246:0:o;28157:100::-;28211:13;28244:5;28237:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28157:100;:::o;29716:221::-;29792:7;33059:16;;;:7;:16;;;;;;-1:-1:-1;;;;;33059:16:0;29812:73;;;;-1:-1:-1;;;29812:73:0;;11617:2:1;29812:73:0;;;11599:21:1;11656:2;11636:18;;;11629:30;11695:34;11675:18;;;11668:62;-1:-1:-1;;;11746:18:1;;;11739:42;11798:19;;29812:73:0;11415:408:1;29812:73:0;-1:-1:-1;29905:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;29905:24:0;;29716:221::o;29239:411::-;29320:13;29336:23;29351:7;29336:14;:23::i;:::-;29320:39;;29384:5;-1:-1:-1;;;;;29378:11:0;:2;-1:-1:-1;;;;;29378:11:0;;;29370:57;;;;-1:-1:-1;;;29370:57:0;;12030:2:1;29370:57:0;;;12012:21:1;12069:2;12049:18;;;12042:30;12108:34;12088:18;;;12081:62;-1:-1:-1;;;12159:18:1;;;12152:31;12200:19;;29370:57:0;11828:397:1;29370:57:0;25686:10;-1:-1:-1;;;;;29462:21:0;;;;:62;;-1:-1:-1;29487:37:0;29504:5;25686:10;30235:164;:::i;29487:37::-;29440:168;;;;-1:-1:-1;;;29440:168:0;;12432:2:1;29440:168:0;;;12414:21:1;12471:2;12451:18;;;12444:30;12510:34;12490:18;;;12483:62;12581:26;12561:18;;;12554:54;12625:19;;29440:168:0;12230:420:1;29440:168:0;29621:21;29630:2;29634:7;29621:8;:21::i;:::-;29309:341;29239:411;;:::o;58318:654::-;58413:7;55865:10;55845:16;58413:7;55845;:16::i;:::-;-1:-1:-1;;;;;55845:30:0;;55837:72;;;;-1:-1:-1;;;55837:72:0;;;;;;;:::i;:::-;58449:3:::1;::::0;-1:-1:-1;;;;;58449:3:0::1;58433:60;;;;-1:-1:-1::0;;;58433:60:0::1;;;;;;;:::i;:::-;58506:14;58529:11;;58506:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;58560:8:0;;58506:35;;-1:-1:-1;;;58560:12:0;;;;:30:::1;;;58587:3;58576:1;:8;:14;58560:30;58552:69;;;::::0;-1:-1:-1;;;58552:69:0;;13565:2:1;58552:69:0::1;::::0;::::1;13547:21:1::0;13604:2;13584:18;;;13577:30;13643:28;13623:18;;;13616:56;13689:18;;58552:69:0::1;13363:350:1::0;58552:69:0::1;58674:46;58687:10;:19;58698:7;58687:19;;;;;;;;;;;:31;;58674:46;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58654:16;58667:1;58654:16;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:66;;58632:162;;;::::0;-1:-1:-1;;;58632:162:0;;15626:2:1;58632:162:0::1;::::0;::::1;15608:21:1::0;15665:2;15645:18;;;15638:30;15704:34;15684:18;;;15677:62;-1:-1:-1;;;15755:18:1;;;15748:44;15809:19;;58632:162:0::1;15424:410:1::0;58632:162:0::1;58807:3;::::0;58828:22:::1;::::0;58807:44:::1;::::0;-1:-1:-1;;;58807:44:0;;58816:10:::1;58807:44;::::0;::::1;16013:51:1::0;16080:18;;;16073:34;;;;-1:-1:-1;;;;;58807:3:0;;::::1;::::0;:8:::1;::::0;15986:18:1;;58807:44:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;;58864:19:0::1;::::0;;;:10:::1;:19;::::0;;;;:45:::1;::::0;-1:-1:-1;58864:31:0::1;;58898:11:::0;;58864:45:::1;:::i;:::-;;58943:7;58925:39;58952:11;;58925:39;;;;;;;:::i;:::-;;;;;;;;58422:550;58318:654:::0;;;;:::o;56796:116::-;47946:6;;-1:-1:-1;;;;;47946:6:0;25686:10;48093:23;48085:68;;;;-1:-1:-1;;;48085:68:0;;;;;;;:::i;:::-;56874:22:::1;:30:::0;56796:116::o;51140:95::-;47946:6;;-1:-1:-1;;;;;47946:6:0;25686:10;48093:23;48085:68;;;;-1:-1:-1;;;48085:68:0;;;;;;;:::i;:::-;51214:13:::1;::::0;;-1:-1:-1;;51197:30:0;::::1;51214:13;::::0;;;::::1;;;51213:14;51197:30:::0;;::::1;;::::0;;51140:95::o;51933:1240::-;52112:13;;;;;;;52104:44;;;;-1:-1:-1;;;52104:44:0;;16715:2:1;52104:44:0;;;16697:21:1;16754:2;16734:18;;;16727:30;-1:-1:-1;;;16773:18:1;;;16766:48;16831:18;;52104:44:0;16513:342:1;52104:44:0;52270:10;52256:25;;;;:13;:25;;;;;;;;52251:575;;52409:45;;-1:-1:-1;;52426:10:0;17037:2:1;17033:15;17029:53;52409:45:0;;;17017:66:1;17099:12;;;17092:28;;;52459:4:0;;17136:12:1;;52409:45:0;;;;;;;;;;;;52399:56;;;;;;:64;52373:167;;;;-1:-1:-1;;;52373:167:0;;17361:2:1;52373:167:0;;;17343:21:1;17400:2;17380:18;;;17373:30;17439:34;17419:18;;;17412:62;-1:-1:-1;;;17490:18:1;;;17483:39;17539:19;;52373:167:0;17159:405:1;52373:167:0;52631:31;52638:10;;52650:4;52656:5;52631:6;:31::i;:::-;52623:79;;;;-1:-1:-1;;;52623:79:0;;17771:2:1;52623:79:0;;;17753:21:1;17810:2;17790:18;;;17783:30;17849:34;17829:18;;;17822:62;-1:-1:-1;;;17900:18:1;;;17893:33;17943:19;;52623:79:0;17569:399:1;52623:79:0;52733:10;52719:25;;;;:13;:25;;;;;;;;:32;;-1:-1:-1;;52719:32:0;52747:4;52719:32;;;52766:18;:30;;;;;:48;;;52251:575;52855:1;52846:6;:10;52838:42;;;;-1:-1:-1;;;52838:42:0;;18175:2:1;52838:42:0;;;18157:21:1;18214:2;18194:18;;;18187:30;-1:-1:-1;;;18233:18:1;;;18226:49;18292:18;;52838:42:0;17973:343:1;52838:42:0;52921:9;;52912:18;;:6;:18;:::i;:::-;52899:9;:31;;52891:63;;;;-1:-1:-1;;;52891:63:0;;18696:2:1;52891:63:0;;;18678:21:1;18735:2;18715:18;;;18708:30;-1:-1:-1;;;18754:18:1;;;18747:49;18813:18;;52891:63:0;18494:343:1;52891:63:0;52992:10;52973:30;;;;:18;:30;;;;;;:40;-1:-1:-1;52973:40:0;52965:94;;;;-1:-1:-1;;;52965:94:0;;19044:2:1;52965:94:0;;;19026:21:1;19083:2;19063:18;;;19056:30;19122:34;19102:18;;;19095:62;-1:-1:-1;;;19173:18:1;;;19166:39;19222:19;;52965:94:0;18842:405:1;52965:94:0;53091:10;53072:30;;;;:18;:30;;;;;:40;;53106:6;;53072:30;:40;;53106:6;;53072:40;:::i;:::-;;;;-1:-1:-1;53123:42:0;;-1:-1:-1;53146:10:0;53158:6;53123:22;:42::i;:::-;51933:1240;;;;:::o;59046:392::-;3980:1;4578:7;;:19;;4570:63;;;;-1:-1:-1;;;4570:63:0;;;;;;;:::i;:::-;3980:1;4711:7;:18;59193:41:::1;25686:10:::0;59212:12:::1;59226:7;59193:18;:41::i;:::-;59185:103;;;;-1:-1:-1::0;;;59185:103:0::1;;;;;;;:::i;:::-;59313:3;::::0;-1:-1:-1;;;;;59313:3:0::1;59305:26:::0;59301:79:::1;;59348:3;::::0;:20:::1;::::0;-1:-1:-1;;;59348:20:0;;-1:-1:-1;;;;;20390:15:1;;;59348:20:0::1;::::0;::::1;20372:34:1::0;20442:15;;;20422:18;;;20415:43;59348:3:0;;::::1;::::0;:10:::1;::::0;20307:18:1;;59348:20:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;59301:79;59392:38;59412:4;59418:2;59422:7;59392:19;:38::i;:::-;-1:-1:-1::0;;3936:1:0;4890:7;:22;-1:-1:-1;59046:392:0:o;53221:299::-;53293:10;;;;;;;53285:45;;;;-1:-1:-1;;;53285:45:0;;20671:2:1;53285:45:0;;;20653:21:1;20710:2;20690:18;;;20683:30;-1:-1:-1;;;20729:18:1;;;20722:52;20791:18;;53285:45:0;20469:346:1;53285:45:0;53358:1;53349:6;:10;53341:42;;;;-1:-1:-1;;;53341:42:0;;18175:2:1;53341:42:0;;;18157:21:1;18214:2;18194:18;;;18187:30;-1:-1:-1;;;18233:18:1;;;18226:49;18292:18;;53341:42:0;17973:343:1;53341:42:0;53424:9;;53415:18;;:6;:18;:::i;:::-;53402:9;:31;;53394:63;;;;-1:-1:-1;;;53394:63:0;;18696:2:1;53394:63:0;;;18678:21:1;18735:2;18715:18;;;18708:30;-1:-1:-1;;;18754:18:1;;;18747:49;18813:18;;53394:63:0;18494:343:1;53394:63:0;53470:42;53493:10;53505:6;53470:22;:42::i;:::-;53221:299;:::o;40971:256::-;41068:7;41104:23;41121:5;41104:16;:23::i;:::-;41096:5;:31;41088:87;;;;-1:-1:-1;;;41088:87:0;;21022:2:1;41088:87:0;;;21004:21:1;21061:2;21041:18;;;21034:30;21100:34;21080:18;;;21073:62;-1:-1:-1;;;21151:18:1;;;21144:41;21202:19;;41088:87:0;20820:407:1;41088:87:0;-1:-1:-1;;;;;;41193:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;40971:256::o;50515:99::-;47946:6;;-1:-1:-1;;;;;47946:6:0;25686:10;48093:23;48085:68;;;;-1:-1:-1;;;48085:68:0;;;;;;;:::i;:::-;50587:19;;::::1;::::0;:13:::1;::::0;:19:::1;::::0;::::1;::::0;::::1;:::i;:::-;;50515:99:::0;:::o;51674:192::-;51797:4;51821:37;51840:5;51847:4;51853;51821:18;:37::i;:::-;51814:44;51674:192;-1:-1:-1;;;;51674:192:0:o;56686:102::-;47946:6;;-1:-1:-1;;;;;47946:6:0;25686:10;48093:23;48085:68;;;;-1:-1:-1;;;48085:68:0;;;;;;;:::i;:::-;56757:15:::1;:23:::0;56686:102::o;54464:127::-;47946:6;;-1:-1:-1;;;;;47946:6:0;25686:10;48093:23;48085:68;;;;-1:-1:-1;;;48085:68:0;;;;;;;:::i;:::-;3980:1:::1;4578:7;;:19;;4570:63;;;;-1:-1:-1::0;;;4570:63:0::1;;;;;;;:::i;:::-;3980:1;4711:7;:18:::0;54525:58:::2;54551:7;47946:6:::0;;-1:-1:-1;;;;;47946:6:0;;47873:87;54551:7:::2;54561:21;54525:17;:58::i;:::-;3936:1:::1;4890:7;:22:::0;54464:127::o;30876:185::-;31014:39;31031:4;31037:2;31041:7;31014:39;;;;;;;;;;;;:16;:39::i;54076:345::-;54136:16;54165:18;54186:17;54196:6;54186:9;:17::i;:::-;54165:38;;54216:25;54258:10;54244:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54244:25:0;;54216:53;;54285:9;54280:108;54300:10;54296:1;:14;54280:108;;;54346:30;54366:6;54374:1;54346:19;:30::i;:::-;54332:8;54341:1;54332:11;;;;;;;;:::i;:::-;;;;;;;;;;:44;54312:3;;;;:::i;:::-;;;;54280:108;;;-1:-1:-1;54405:8:0;54076:345;-1:-1:-1;;;54076:345:0:o;57361:136::-;57458:19;;;;:10;:19;;;;;:31;;57451:38;;57425:13;;57458:31;57451:38;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57361:136;;;:::o;50740:170::-;47946:6;;-1:-1:-1;;;;;47946:6:0;25686:10;48093:23;48085:68;;;;-1:-1:-1;;;48085:68:0;;;;;;;:::i;:::-;50812:8:::1;::::0;::::1;;50811:9;50803:43;;;::::0;-1:-1:-1;;;50803:43:0;;21706:2:1;50803:43:0::1;::::0;::::1;21688:21:1::0;21745:2;21725:18;;;21718:30;-1:-1:-1;;;21764:18:1;;;21757:51;21825:18;;50803:43:0::1;21504:345:1::0;50803:43:0::1;50857:8;:15:::0;;-1:-1:-1;;50857:15:0::1;50868:4;50857:15;::::0;;50883:19;;::::1;::::0;:13:::1;::::0;:19:::1;::::0;::::1;::::0;::::1;:::i;57018:180::-:0;47946:6;;-1:-1:-1;;;;;47946:6:0;25686:10;48093:23;48085:68;;;;-1:-1:-1;;;48085:68:0;;;;;;;:::i;:::-;57073:9:::1;57068:95;57092:9;;57088:1;:13;57068:95;;;57146:5;57123:13:::0;;;:10:::1;:13;::::0;;;;:20:::1;;:28:::0;;-1:-1:-1;;57123:28:0::1;::::0;;57134:1;57103:3:::1;57134:1:::0;57103:3:::1;:::i;:::-;;;;57068:95;;;-1:-1:-1::0;57178:12:0::1;::::0;::::1;::::0;;;::::1;57018:180::o:0;41493:233::-;41568:7;41604:30;41391:10;:17;;41303:113;41604:30;41596:5;:38;41588:95;;;;-1:-1:-1;;;41588:95:0;;22056:2:1;41588:95:0;;;22038:21:1;22095:2;22075:18;;;22068:30;22134:34;22114:18;;;22107:62;-1:-1:-1;;;22185:18:1;;;22178:42;22237:19;;41588:95:0;21854:408:1;41588:95:0;41701:10;41712:5;41701:17;;;;;;;;:::i;:::-;;;;;;;;;41694:24;;41493:233;;;:::o;57785:525::-;57866:7;55865:10;55845:16;57866:7;55845;:16::i;:::-;-1:-1:-1;;;;;55845:30:0;;55837:72;;;;-1:-1:-1;;;55837:72:0;;;;;;;:::i;:::-;57902:3:::1;::::0;-1:-1:-1;;;;;57902:3:0::1;57886:60;;;;-1:-1:-1::0;;;57886:60:0::1;;;;;;;:::i;:::-;57959:14;57982:4;;57959:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;58006:8:0;;57959:28;;-1:-1:-1;;;58006:12:0;;;;:29:::1;;;58033:2;58022:1;:8;:13;58006:29;57998:61;;;::::0;-1:-1:-1;;;57998:61:0;;22469:2:1;57998:61:0::1;::::0;::::1;22451:21:1::0;22508:2;22488:18;;;22481:30;-1:-1:-1;;;22527:18:1;;;22520:49;22586:18;;57998:61:0::1;22267:343:1::0;57998:61:0::1;58104:19;::::0;;;:10:::1;:19;::::0;;;;;;58091:39;;::::1;::::0;::::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58078:9;58085:1;58078:9;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:52;;58070:97;;;::::0;-1:-1:-1;;;58070:97:0;;22817:2:1;58070:97:0::1;::::0;::::1;22799:21:1::0;;;22836:18;;;22829:30;22895:34;22875:18;;;22868:62;22947:18;;58070:97:0::1;22615:356:1::0;58070:97:0::1;58180:3;::::0;58201:15:::1;::::0;58180:37:::1;::::0;-1:-1:-1;;;58180:37:0;;58189:10:::1;58180:37;::::0;::::1;16013:51:1::0;16080:18;;;16073:34;;;;-1:-1:-1;;;;;58180:3:0;;::::1;::::0;:8:::1;::::0;15986:18:1;;58180:37:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;;58230:19:0::1;::::0;;;:10:::1;:19;::::0;;;;:31:::1;::::0;-1:-1:-1;58257:4:0;;58230:31:::1;:::i;:::-;;58288:7;58277:25;58297:4;;58277:25;;;;;;;:::i;27851:239::-:0;27923:7;27959:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27959:16:0;27994:19;27986:73;;;;-1:-1:-1;;;27986:73:0;;23178:2:1;27986:73:0;;;23160:21:1;23217:2;23197:18;;;23190:30;23256:34;23236:18;;;23229:62;-1:-1:-1;;;23307:18:1;;;23300:39;23356:19;;27986:73:0;22976:405:1;57231:122:0;57321:19;;;;:10;:19;;;;;57314:31;;57288:13;;57321:19;57314:31;;;:::i;27581:208::-;27653:7;-1:-1:-1;;;;;27681:19:0;;27673:74;;;;-1:-1:-1;;;27673:74:0;;23588:2:1;27673:74:0;;;23570:21:1;23627:2;23607:18;;;23600:30;23666:34;23646:18;;;23639:62;-1:-1:-1;;;23717:18:1;;;23710:40;23767:19;;27673:74:0;23386:406:1;27673:74:0;-1:-1:-1;;;;;;27765:16:0;;;;;:9;:16;;;;;;;27581:208::o;48524:103::-;47946:6;;-1:-1:-1;;;;;47946:6:0;25686:10;48093:23;48085:68;;;;-1:-1:-1;;;48085:68:0;;;;;;;:::i;:::-;48589:30:::1;48616:1;48589:18;:30::i;:::-;48524:103::o:0;51028:104::-;47946:6;;-1:-1:-1;;;;;47946:6:0;25686:10;48093:23;48085:68;;;;-1:-1:-1;;;48085:68:0;;;;;;;:::i;:::-;51100:10:::1;:24:::0;51028:104::o;50622:110::-;47946:6;;-1:-1:-1;;;;;47946:6:0;25686:10;48093:23;48085:68;;;;-1:-1:-1;;;48085:68:0;;;;;;;:::i;:::-;50700:24;;::::1;::::0;:18:::1;::::0;:24:::1;::::0;::::1;::::0;::::1;:::i;55591:48::-:0;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;55591:48:0;;;;;;;;;;;;;;;-1:-1:-1;55591:48:0;:::o;28326:104::-;28382:13;28415:7;28408:14;;;;;:::i;30009:155::-;30104:52;25686:10;30137:8;30147;30104:18;:52::i;49845:32::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;59888:841::-;59941:7;55865:10;55845:16;59941:7;55845;:16::i;:::-;-1:-1:-1;;;;;55845:30:0;;55837:72;;;;-1:-1:-1;;;55837:72:0;;;;;;;:::i;:::-;59977:3:::1;::::0;-1:-1:-1;;;;;59977:3:0::1;59961:60;;;;-1:-1:-1::0;;;59961:60:0::1;;;;;;;:::i;:::-;60041:27;::::0;-1:-1:-1;;;60041:27:0;;::::1;::::0;::::1;3243:25:1::0;;;60041:4:0::1;::::0;:18:::1;::::0;3216::1;;60041:27:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60040:28;60032:56;;;::::0;-1:-1:-1;;;60032:56:0;;24249:2:1;60032:56:0::1;::::0;::::1;24231:21:1::0;24288:2;24268:18;;;24261:30;-1:-1:-1;;;24307:18:1;;;24300:45;24362:18;;60032:56:0::1;24047:339:1::0;60032:56:0::1;60123:21;::::0;-1:-1:-1;;;60123:21:0;;::::1;::::0;::::1;3243:25:1::0;;;60101:19:0::1;::::0;60123:4:::1;::::0;:12:::1;::::0;3216:18:1;;60123:21:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60101:43;;55433:1;60163:11;:22;60155:57;;;::::0;-1:-1:-1;;;60155:57:0;;24782:2:1;60155:57:0::1;::::0;::::1;24764:21:1::0;24821:2;24801:18;;;24794:30;-1:-1:-1;;;24840:18:1;;;24833:52;24902:18;;60155:57:0::1;24580:346:1::0;60155:57:0::1;60225:3;::::0;60246:9:::1;::::0;60225:31:::1;::::0;-1:-1:-1;;;60225:31:0;;60234:10:::1;60225:31;::::0;::::1;16013:51:1::0;16080:18;;;16073:34;;;;-1:-1:-1;;;;;60225:3:0;;::::1;::::0;:8:::1;::::0;15986:18:1;;60225:31:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;60269:26;60298:31;60321:7;60298:22;:31::i;:::-;60269:60:::0;-1:-1:-1;60344:23:0;60340:382:::1;;60384:19;::::0;;;:10:::1;:19;::::0;;;;;;;:26:::1;::::0;::::1;:33:::0;;-1:-1:-1;;60384:33:0::1;60413:4;60384:33:::0;;::::1;::::0;;;60432:24:::1;::::0;;::::1;:28:::0;;;;60480:31;540:41:1;;;60384:19:0;;60480:31:::1;::::0;513:18:1;60480:31:0::1;;;;;;;60531:35;::::0;;25113:25:1;;;60564:1:0::1;25169:2:1::0;25154:18;;25147:34;60542:7:0;;60531:35:::1;::::0;25086:18:1;60531:35:0::1;;;;;;;60340:382;;;60626:15;:11:::0;60640:1:::1;60626:15;:::i;:::-;60599:19;::::0;;;:10:::1;:19;::::0;;;;:24:::1;;:42:::0;60610:7;60661:49:::1;60681:11:::0;60694:15:::1;60681:11:::0;60708:1:::1;60694:15;:::i;:::-;60661:49;::::0;;25113:25:1;;;25169:2;25154:18;;25147:34;;;;25086:18;60661:49:0::1;;;;;;;59950:779;;59888:841:::0;;:::o;59446:434::-;3980:1;4578:7;;:19;;4570:63;;;;-1:-1:-1;;;4570:63:0;;;;;;;:::i;:::-;3980:1;4711:7;:18;59625:41:::1;25686:10:::0;59644:12:::1;59658:7;59625:18;:41::i;:::-;59617:103;;;;-1:-1:-1::0;;;59617:103:0::1;;;;;;;:::i;:::-;59745:3;::::0;-1:-1:-1;;;;;59745:3:0::1;59737:26:::0;59733:79:::1;;59780:3;::::0;:20:::1;::::0;-1:-1:-1;;;59780:20:0;;-1:-1:-1;;;;;20390:15:1;;;59780:20:0::1;::::0;::::1;20372:34:1::0;20442:15;;;20422:18;;;20415:43;59780:3:0;;::::1;::::0;:10:::1;::::0;20307:18:1;;59780:20:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;59733:79;59824:48;59848:4;59854:2;59858:7;59867:4;59824:23;:48::i;:::-;-1:-1:-1::0;;3936:1:0;4890:7;:22;-1:-1:-1;;59446:434:0:o;55956:601::-;56029:13;56055:21;56079:10;:8;:10::i;:::-;56104:8;;56055:34;;-1:-1:-1;56104:8:0;;56100:450;;;56143:27;;-1:-1:-1;;;56143:27:0;;;;;3243:25:1;;;56129:11:0;;56143:4;;:18;;3216::1;;56143:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56129:41;;56189:6;56185:296;;;56247:7;56256:18;:7;:16;:18::i;:::-;56230:56;;;;;;;;;:::i;:::-;;;;;;;;;;;;;56216:71;;;;55956:601;;;:::o;56185:296::-;56343:21;;-1:-1:-1;;;56343:21:0;;;;;3243:25:1;;;56328:12:0;;56343:4;;:12;;3216:18:1;;56343:21:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56328:36;;56414:7;56423:18;:7;:16;:18::i;:::-;56448:15;:4;:13;:15::i;:::-;56397:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;56383:82;;;;;55956:601;;;:::o;56100:450::-;56520:18;56513:25;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55956:601;;;:::o;56100:450::-;56044:513;55956:601;;;:::o;51243:86::-;47946:6;;-1:-1:-1;;;;;47946:6:0;25686:10;48093:23;48085:68;;;;-1:-1:-1;;;48085:68:0;;;;;;;:::i;:::-;51311:10:::1;::::0;;-1:-1:-1;;51297:24:0;::::1;51311:10:::0;;;;::::1;;;51310:11;51297:24:::0;;::::1;;::::0;;51243:86::o;56920:90::-;47946:6;;-1:-1:-1;;;;;47946:6:0;25686:10;48093:23;48085:68;;;;-1:-1:-1;;;48085:68:0;;;;;;;:::i;:::-;56985:9:::1;:17:::0;56920:90::o;48782:201::-;47946:6;;-1:-1:-1;;;;;47946:6:0;25686:10;48093:23;48085:68;;;;-1:-1:-1;;;48085:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;48871:22:0;::::1;48863:73;;;::::0;-1:-1:-1;;;48863:73:0;;27104:2:1;48863:73:0::1;::::0;::::1;27086:21:1::0;27143:2;27123:18;;;27116:30;27182:34;27162:18;;;27155:62;-1:-1:-1;;;27233:18:1;;;27226:36;27279:19;;48863:73:0::1;26902:402:1::0;48863:73:0::1;48947:28;48966:8;48947:18;:28::i;50918:102::-:0;47946:6;;-1:-1:-1;;;;;47946:6:0;25686:10;48093:23;48085:68;;;;-1:-1:-1;;;48085:68:0;;;;;;;:::i;:::-;50990:9:::1;:22:::0;50918:102::o;56591:87::-;47946:6;;-1:-1:-1;;;;;47946:6:0;25686:10;48093:23;48085:68;;;;-1:-1:-1;;;48085:68:0;;;;;;;:::i;:::-;56655:3:::1;:15:::0;;-1:-1:-1;;;;;;56655:15:0::1;-1:-1:-1::0;;;;;56655:15:0;;;::::1;::::0;;;::::1;::::0;;56591:87::o;27212:305::-;27314:4;-1:-1:-1;;;;;;27351:40:0;;-1:-1:-1;;;27351:40:0;;:105;;-1:-1:-1;;;;;;;27408:48:0;;-1:-1:-1;;;27408:48:0;27351:105;:158;;;-1:-1:-1;;;;;;;;;;18124:40:0;;;27473:36;18015:157;53581:328;49741:4;53681:6;53669:9;;:18;;;;:::i;:::-;:31;53661:76;;;;-1:-1:-1;;;53661:76:0;;27511:2:1;53661:76:0;;;27493:21:1;;;27530:18;;;27523:30;27589:34;27569:18;;;27562:62;27641:18;;53661:76:0;27309:356:1;53661:76:0;53755:9;53750:152;53774:6;53770:1;:10;53750:152;;;53802:20;53808:2;53812:9;;53802:5;:20::i;:::-;53851:9;;53842:19;;-1:-1:-1;;;;;53842:19:0;;;;;;;;53889:1;53876:9;;:14;;;;;;;:::i;:::-;;;;-1:-1:-1;53782:3:0;;-1:-1:-1;53782:3:0;;;:::i;:::-;;;;53750:152;;36952:174;37027:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;37027:29:0;-1:-1:-1;;;;;37027:29:0;;;;;;;;:24;;37081:23;37027:24;37081:14;:23::i;:::-;-1:-1:-1;;;;;37072:46:0;;;;;;;;;;;36952:174;;:::o;33264:348::-;33357:4;33059:16;;;:7;:16;;;;;;-1:-1:-1;;;;;33059:16:0;33374:73;;;;-1:-1:-1;;;33374:73:0;;27872:2:1;33374:73:0;;;27854:21:1;27911:2;27891:18;;;27884:30;27950:34;27930:18;;;27923:62;-1:-1:-1;;;28001:18:1;;;27994:42;28053:19;;33374:73:0;27670:408:1;33374:73:0;33458:13;33474:23;33489:7;33474:14;:23::i;:::-;33458:39;;33527:5;-1:-1:-1;;;;;33516:16:0;:7;-1:-1:-1;;;;;33516:16:0;;:51;;;;33560:7;-1:-1:-1;;;;;33536:31:0;:20;33548:7;33536:11;:20::i;:::-;-1:-1:-1;;;;;33536:31:0;;33516:51;:87;;;-1:-1:-1;;;;;;30356:25:0;;;30332:4;30356:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;33571:32;30235:164;30466:339;30661:41;25686:10;30680:12;25606:98;30661:41;30653:103;;;;-1:-1:-1;;;30653:103:0;;;;;;;:::i;:::-;30769:28;30779:4;30785:2;30789:7;30769:9;:28::i;908:190::-;1033:4;1086;1057:25;1070:5;1077:4;1057:12;:25::i;:::-;:33;;908:190;-1:-1:-1;;;;908:190:0:o;9193:317::-;9308:6;9283:21;:31;;9275:73;;;;-1:-1:-1;;;9275:73:0;;28285:2:1;9275:73:0;;;28267:21:1;28324:2;28304:18;;;28297:30;28363:31;28343:18;;;28336:59;28412:18;;9275:73:0;28083:353:1;9275:73:0;9362:12;9380:9;-1:-1:-1;;;;;9380:14:0;9402:6;9380:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9361:52;;;9432:7;9424:78;;;;-1:-1:-1;;;9424:78:0;;28853:2:1;9424:78:0;;;28835:21:1;28892:2;28872:18;;;28865:30;28931:34;28911:18;;;28904:62;29002:28;28982:18;;;28975:56;29048:19;;9424:78:0;28651:422:1;49143:191:0;49236:6;;;-1:-1:-1;;;;;49253:17:0;;;-1:-1:-1;;;;;;49253:17:0;;;;;;;49286:40;;49236:6;;;49253:17;49236:6;;49286:40;;49217:16;;49286:40;49206:128;49143:191;:::o;37268:315::-;37423:8;-1:-1:-1;;;;;37414:17:0;:5;-1:-1:-1;;;;;37414:17:0;;;37406:55;;;;-1:-1:-1;;;37406:55:0;;29280:2:1;37406:55:0;;;29262:21:1;29319:2;29299:18;;;29292:30;29358:27;29338:18;;;29331:55;29403:18;;37406:55:0;29078:349:1;37406:55:0;-1:-1:-1;;;;;37472:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;37472:46:0;;;;;;;;;;37534:41;;540::1;;;37534::0;;513:18:1;37534:41:0;;;;;;;37268:315;;;:::o;60737:244::-;60873:60;;;60890:16;60873:60;;;;29617:19:1;;;;60908:15:0;29652:12:1;;;29645:28;29689:12;;;;29682:28;;;60873:60:0;;;;;;;;;;29726:12:1;;;;60873:60:0;;;60863:71;;;;;-1:-1:-1;;60953:20:0;60972:1;60863:71;60953:20;:::i;:::-;60946:27;60737:244;-1:-1:-1;;;60737:244:0:o;31132:328::-;31307:41;25686:10;31326:12;25606:98;31307:41;31299:103;;;;-1:-1:-1;;;31299:103:0;;;;;;;:::i;:::-;31413:39;31427:4;31433:2;31437:7;31446:5;31413:13;:39::i;50363:114::-;50423:13;50456;50449:20;;;;;:::i;5292:723::-;5348:13;5569:10;5565:53;;-1:-1:-1;;5596:10:0;;;;;;;;;;;;-1:-1:-1;;;5596:10:0;;;;;5292:723::o;5565:53::-;5643:5;5628:12;5684:78;5691:9;;5684:78;;5717:8;;;;:::i;:::-;;-1:-1:-1;5740:10:0;;-1:-1:-1;5748:2:0;5740:10;;:::i;:::-;;;5684:78;;;5772:19;5804:6;5794:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5794:17:0;;5772:39;;5822:154;5829:10;;5822:154;;5856:11;5866:1;5856:11;;:::i;:::-;;-1:-1:-1;5925:10:0;5933:2;5925:5;:10;:::i;:::-;5912:24;;:2;:24;:::i;:::-;5899:39;;5882:6;5889;5882:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;5882:56:0;;;;;;;;-1:-1:-1;5953:11:0;5962:2;5953:11;;:::i;:::-;;;5822:154;;34948:382;-1:-1:-1;;;;;35028:16:0;;35020:61;;;;-1:-1:-1;;;35020:61:0;;30325:2:1;35020:61:0;;;30307:21:1;;;30344:18;;;30337:30;30403:34;30383:18;;;30376:62;30455:18;;35020:61:0;30123:356:1;35020:61:0;33035:4;33059:16;;;:7;:16;;;;;;-1:-1:-1;;;;;33059:16:0;:30;35092:58;;;;-1:-1:-1;;;35092:58:0;;30686:2:1;35092:58:0;;;30668:21:1;30725:2;30705:18;;;30698:30;30764;30744:18;;;30737:58;30812:18;;35092:58:0;30484:352:1;35092:58:0;35163:45;35192:1;35196:2;35200:7;35163:20;:45::i;:::-;-1:-1:-1;;;;;35221:13:0;;;;;;:9;:13;;;;;:18;;35238:1;;35221:13;:18;;35238:1;;35221:18;:::i;:::-;;;;-1:-1:-1;;35250:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;35250:21:0;-1:-1:-1;;;;;35250:21:0;;;;;;;;35289:33;;35250:16;;;35289:33;;35250:16;;35289:33;34948:382;;:::o;36256:578::-;36415:4;-1:-1:-1;;;;;36388:31:0;:23;36403:7;36388:14;:23::i;:::-;-1:-1:-1;;;;;36388:31:0;;36380:85;;;;-1:-1:-1;;;36380:85:0;;31043:2:1;36380:85:0;;;31025:21:1;31082:2;31062:18;;;31055:30;31121:34;31101:18;;;31094:62;-1:-1:-1;;;31172:18:1;;;31165:39;31221:19;;36380:85:0;30841:405:1;36380:85:0;-1:-1:-1;;;;;36484:16:0;;36476:65;;;;-1:-1:-1;;;36476:65:0;;31453:2:1;36476:65:0;;;31435:21:1;31492:2;31472:18;;;31465:30;31531:34;31511:18;;;31504:62;-1:-1:-1;;;31582:18:1;;;31575:34;31626:19;;36476:65:0;31251:400:1;36476:65:0;36554:39;36575:4;36581:2;36585:7;36554:20;:39::i;:::-;36658:29;36675:1;36679:7;36658:8;:29::i;:::-;-1:-1:-1;;;;;36700:15:0;;;;;;:9;:15;;;;;:20;;36719:1;;36700:15;:20;;36719:1;;36700:20;:::i;:::-;;;;-1:-1:-1;;;;;;;36731:13:0;;;;;;:9;:13;;;;;:18;;36748:1;;36731:13;:18;;36748:1;;36731:18;:::i;:::-;;;;-1:-1:-1;;36760:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;36760:21:0;-1:-1:-1;;;;;36760:21:0;;;;;;;;;36799:27;;36760:16;;36799:27;;;;;;;36256:578;;;:::o;1460:701::-;1543:7;1586:4;1543:7;1601:523;1625:5;:12;1621:1;:16;1601:523;;;1659:20;1682:5;1688:1;1682:8;;;;;;;;:::i;:::-;;;;;;;1659:31;;1725:12;1709;:28;1705:408;;1862:44;;;;;;31813:19:1;;;31848:12;;;31841:28;;;31885:12;;1862:44:0;;;;;;;;;;;;1852:55;;;;;;1837:70;;1705:408;;;2052:44;;;;;;31813:19:1;;;31848:12;;;31841:28;;;31885:12;;2052:44:0;;;;;;;;;;;;2042:55;;;;;;2027:70;;1705:408;-1:-1:-1;1639:3:0;;;;:::i;:::-;;;;1601:523;;32342:315;32499:28;32509:4;32515:2;32519:7;32499:9;:28::i;:::-;32546:48;32569:4;32575:2;32579:7;32588:5;32546:22;:48::i;:::-;32538:111;;;;-1:-1:-1;;;32538:111:0;;;;;;;:::i;42339:589::-;-1:-1:-1;;;;;42545:18:0;;42541:187;;42580:40;42612:7;43755:10;:17;;43728:24;;;;:15;:24;;;;;:44;;;43783:24;;;;;;;;;;;;43651:164;42580:40;42541:187;;;42650:2;-1:-1:-1;;;;;42642:10:0;:4;-1:-1:-1;;;;;42642:10:0;;42638:90;;42669:47;42702:4;42708:7;42669:32;:47::i;:::-;-1:-1:-1;;;;;42742:16:0;;42738:183;;42775:45;42812:7;42775:36;:45::i;42738:183::-;42848:4;-1:-1:-1;;;;;42842:10:0;:2;-1:-1:-1;;;;;42842:10:0;;42838:83;;42869:40;42897:2;42901:7;42869:27;:40::i;38148:799::-;38303:4;-1:-1:-1;;;;;38324:13:0;;8194:20;8242:8;38320:620;;38360:72;;-1:-1:-1;;;38360:72:0;;-1:-1:-1;;;;;38360:36:0;;;;;:72;;25686:10;;38411:4;;38417:7;;38426:5;;38360:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38360:72:0;;;;;;;;-1:-1:-1;;38360:72:0;;;;;;;;;;;;:::i;:::-;;;38356:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38602:13:0;;38598:272;;38645:60;;-1:-1:-1;;;38645:60:0;;;;;;;:::i;38598:272::-;38820:6;38814:13;38805:6;38801:2;38797:15;38790:38;38356:529;-1:-1:-1;;;;;;38483:51:0;-1:-1:-1;;;38483:51:0;;-1:-1:-1;38476:58:0;;38320:620;-1:-1:-1;38924:4:0;38148:799;;;;;;:::o;44442:988::-;44708:22;44758:1;44733:22;44750:4;44733:16;:22::i;:::-;:26;;;;:::i;:::-;44770:18;44791:26;;;:17;:26;;;;;;44708:51;;-1:-1:-1;44924:28:0;;;44920:328;;-1:-1:-1;;;;;44991:18:0;;44969:19;44991:18;;;:12;:18;;;;;;;;:34;;;;;;;;;45042:30;;;;;;:44;;;45159:30;;:17;:30;;;;;:43;;;44920:328;-1:-1:-1;45344:26:0;;;;:17;:26;;;;;;;;45337:33;;;-1:-1:-1;;;;;45388:18:0;;;;;:12;:18;;;;;:34;;;;;;;45381:41;44442:988::o;45725:1079::-;46003:10;:17;45978:22;;46003:21;;46023:1;;46003:21;:::i;:::-;46035:18;46056:24;;;:15;:24;;;;;;46429:10;:26;;45978:46;;-1:-1:-1;46056:24:0;;45978:46;;46429:26;;;;;;:::i;:::-;;;;;;;;;46407:48;;46493:11;46468:10;46479;46468:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;46573:28;;;:15;:28;;;;;;;:41;;;46745:24;;;;;46738:31;46780:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;45796:1008;;;45725:1079;:::o;43229:221::-;43314:14;43331:20;43348:2;43331:16;:20::i;:::-;-1:-1:-1;;;;;43362:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;43407:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;43229:221:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:173::-;660:20;;-1:-1:-1;;;;;709:31:1;;699:42;;689:70;;755:1;752;745:12;689:70;592:173;;;:::o;770:254::-;838:6;846;899:2;887:9;878:7;874:23;870:32;867:52;;;915:1;912;905:12;867:52;951:9;938:23;928:33;;980:38;1014:2;1003:9;999:18;980:38;:::i;:::-;970:48;;770:254;;;;;:::o;1029:258::-;1101:1;1111:113;1125:6;1122:1;1119:13;1111:113;;;1201:11;;;1195:18;1182:11;;;1175:39;1147:2;1140:10;1111:113;;;1242:6;1239:1;1236:13;1233:48;;;-1:-1:-1;;1277:1:1;1259:16;;1252:27;1029:258::o;1292:::-;1334:3;1372:5;1366:12;1399:6;1394:3;1387:19;1415:63;1471:6;1464:4;1459:3;1455:14;1448:4;1441:5;1437:16;1415:63;:::i;:::-;1532:2;1511:15;-1:-1:-1;;1507:29:1;1498:39;;;;1539:4;1494:50;;1292:258;-1:-1:-1;;1292:258:1:o;1555:220::-;1704:2;1693:9;1686:21;1667:4;1724:45;1765:2;1754:9;1750:18;1742:6;1724:45;:::i;1780:180::-;1839:6;1892:2;1880:9;1871:7;1867:23;1863:32;1860:52;;;1908:1;1905;1898:12;1860:52;-1:-1:-1;1931:23:1;;1780:180;-1:-1:-1;1780:180:1:o;2173:254::-;2241:6;2249;2302:2;2290:9;2281:7;2277:23;2273:32;2270:52;;;2318:1;2315;2308:12;2270:52;2341:29;2360:9;2341:29;:::i;:::-;2331:39;2417:2;2402:18;;;;2389:32;;-1:-1:-1;;;2173:254:1:o;2432:660::-;2512:6;2520;2528;2581:2;2569:9;2560:7;2556:23;2552:32;2549:52;;;2597:1;2594;2587:12;2549:52;2633:9;2620:23;2610:33;;2694:2;2683:9;2679:18;2666:32;2717:18;2758:2;2750:6;2747:14;2744:34;;;2774:1;2771;2764:12;2744:34;2812:6;2801:9;2797:22;2787:32;;2857:7;2850:4;2846:2;2842:13;2838:27;2828:55;;2879:1;2876;2869:12;2828:55;2919:2;2906:16;2945:2;2937:6;2934:14;2931:34;;;2961:1;2958;2951:12;2931:34;3006:7;3001:2;2992:6;2988:2;2984:15;2980:24;2977:37;2974:57;;;3027:1;3024;3017:12;2974:57;3058:2;3054;3050:11;3040:21;;3080:6;3070:16;;;;;2432:660;;;;;:::o;3279:127::-;3340:10;3335:3;3331:20;3328:1;3321:31;3371:4;3368:1;3361:15;3395:4;3392:1;3385:15;3411:275;3482:2;3476:9;3547:2;3528:13;;-1:-1:-1;;3524:27:1;3512:40;;3582:18;3567:34;;3603:22;;;3564:62;3561:88;;;3629:18;;:::i;:::-;3665:2;3658:22;3411:275;;-1:-1:-1;3411:275:1:o;3691:712::-;3745:5;3798:3;3791:4;3783:6;3779:17;3775:27;3765:55;;3816:1;3813;3806:12;3765:55;3852:6;3839:20;3878:4;3901:18;3897:2;3894:26;3891:52;;;3923:18;;:::i;:::-;3969:2;3966:1;3962:10;3992:28;4016:2;4012;4008:11;3992:28;:::i;:::-;4054:15;;;4124;;;4120:24;;;4085:12;;;;4156:15;;;4153:35;;;4184:1;4181;4174:12;4153:35;4220:2;4212:6;4208:15;4197:26;;4232:142;4248:6;4243:3;4240:15;4232:142;;;4314:17;;4302:30;;4265:12;;;;4352;;;;4232:142;;;4392:5;3691:712;-1:-1:-1;;;;;;;3691:712:1:o;4408:553::-;4519:6;4527;4535;4543;4596:3;4584:9;4575:7;4571:23;4567:33;4564:53;;;4613:1;4610;4603:12;4564:53;4649:9;4636:23;4626:33;;4706:2;4695:9;4691:18;4678:32;4668:42;;4757:2;4746:9;4742:18;4729:32;4719:42;;4812:2;4801:9;4797:18;4784:32;4839:18;4831:6;4828:30;4825:50;;;4871:1;4868;4861:12;4825:50;4894:61;4947:7;4938:6;4927:9;4923:22;4894:61;:::i;:::-;4884:71;;;4408:553;;;;;;;:::o;4966:186::-;5025:6;5078:2;5066:9;5057:7;5053:23;5049:32;5046:52;;;5094:1;5091;5084:12;5046:52;5117:29;5136:9;5117:29;:::i;5157:328::-;5234:6;5242;5250;5303:2;5291:9;5282:7;5278:23;5274:32;5271:52;;;5319:1;5316;5309:12;5271:52;5342:29;5361:9;5342:29;:::i;:::-;5332:39;;5390:38;5424:2;5413:9;5409:18;5390:38;:::i;:::-;5380:48;;5475:2;5464:9;5460:18;5447:32;5437:42;;5157:328;;;;;:::o;5672:407::-;5737:5;5771:18;5763:6;5760:30;5757:56;;;5793:18;;:::i;:::-;5831:57;5876:2;5855:15;;-1:-1:-1;;5851:29:1;5882:4;5847:40;5831:57;:::i;:::-;5822:66;;5911:6;5904:5;5897:21;5951:3;5942:6;5937:3;5933:16;5930:25;5927:45;;;5968:1;5965;5958:12;5927:45;6017:6;6012:3;6005:4;5998:5;5994:16;5981:43;6071:1;6064:4;6055:6;6048:5;6044:18;6040:29;6033:40;5672:407;;;;;:::o;6084:451::-;6153:6;6206:2;6194:9;6185:7;6181:23;6177:32;6174:52;;;6222:1;6219;6212:12;6174:52;6262:9;6249:23;6295:18;6287:6;6284:30;6281:50;;;6327:1;6324;6317:12;6281:50;6350:22;;6403:4;6395:13;;6391:27;-1:-1:-1;6381:55:1;;6432:1;6429;6422:12;6381:55;6455:74;6521:7;6516:2;6503:16;6498:2;6494;6490:11;6455:74;:::i;6761:484::-;6863:6;6871;6879;6932:2;6920:9;6911:7;6907:23;6903:32;6900:52;;;6948:1;6945;6938:12;6900:52;6984:9;6971:23;6961:33;;7041:2;7030:9;7026:18;7013:32;7003:42;;7096:2;7085:9;7081:18;7068:32;7123:18;7115:6;7112:30;7109:50;;;7155:1;7152;7145:12;7109:50;7178:61;7231:7;7222:6;7211:9;7207:22;7178:61;:::i;:::-;7168:71;;;6761:484;;;;;:::o;7250:632::-;7421:2;7473:21;;;7543:13;;7446:18;;;7565:22;;;7392:4;;7421:2;7644:15;;;;7618:2;7603:18;;;7392:4;7687:169;7701:6;7698:1;7695:13;7687:169;;;7762:13;;7750:26;;7831:15;;;;7796:12;;;;7723:1;7716:9;7687:169;;;-1:-1:-1;7873:3:1;;7250:632;-1:-1:-1;;;;;;7250:632:1:o;8072:537::-;8319:3;8308:9;8301:22;8282:4;8346:46;8387:3;8376:9;8372:19;8364:6;8346:46;:::i;:::-;8440:9;8432:6;8428:22;8423:2;8412:9;8408:18;8401:50;8468:33;8494:6;8486;8468:33;:::i;:::-;8544:14;;8537:22;8532:2;8517:18;;8510:50;-1:-1:-1;;8591:2:1;8576:18;8569:34;8460:41;8072:537;-1:-1:-1;;8072:537:1:o;8614:118::-;8700:5;8693:13;8686:21;8679:5;8676:32;8666:60;;8722:1;8719;8712:12;8737:315;8802:6;8810;8863:2;8851:9;8842:7;8838:23;8834:32;8831:52;;;8879:1;8876;8869:12;8831:52;8902:29;8921:9;8902:29;:::i;:::-;8892:39;;8981:2;8970:9;8966:18;8953:32;8994:28;9016:5;8994:28;:::i;:::-;9041:5;9031:15;;;8737:315;;;;;:::o;9057:667::-;9152:6;9160;9168;9176;9229:3;9217:9;9208:7;9204:23;9200:33;9197:53;;;9246:1;9243;9236:12;9197:53;9269:29;9288:9;9269:29;:::i;:::-;9259:39;;9317:38;9351:2;9340:9;9336:18;9317:38;:::i;:::-;9307:48;;9402:2;9391:9;9387:18;9374:32;9364:42;;9457:2;9446:9;9442:18;9429:32;9484:18;9476:6;9473:30;9470:50;;;9516:1;9513;9506:12;9470:50;9539:22;;9592:4;9584:13;;9580:27;-1:-1:-1;9570:55:1;;9621:1;9618;9611:12;9570:55;9644:74;9710:7;9705:2;9692:16;9687:2;9683;9679:11;9644:74;:::i;9729:260::-;9797:6;9805;9858:2;9846:9;9837:7;9833:23;9829:32;9826:52;;;9874:1;9871;9864:12;9826:52;9897:29;9916:9;9897:29;:::i;:::-;9887:39;;9945:38;9979:2;9968:9;9964:18;9945:38;:::i;9994:356::-;10196:2;10178:21;;;10215:18;;;10208:30;10274:34;10269:2;10254:18;;10247:62;10341:2;10326:18;;9994:356::o;10355:127::-;10416:10;10411:3;10407:20;10404:1;10397:31;10447:4;10444:1;10437:15;10471:4;10468:1;10461:15;10487:128;10527:3;10558:1;10554:6;10551:1;10548:13;10545:39;;;10564:18;;:::i;:::-;-1:-1:-1;10600:9:1;;10487:128::o;11030:380::-;11109:1;11105:12;;;;11152;;;11173:61;;11227:4;11219:6;11215:17;11205:27;;11173:61;11280:2;11272:6;11269:14;11249:18;11246:38;11243:161;;;11326:10;11321:3;11317:20;11314:1;11307:31;11361:4;11358:1;11351:15;11389:4;11386:1;11379:15;12655:353;12857:2;12839:21;;;12896:2;12876:18;;;12869:30;12935:31;12930:2;12915:18;;12908:59;12999:2;12984:18;;12655:353::o;13013:345::-;13215:2;13197:21;;;13254:2;13234:18;;;13227:30;-1:-1:-1;;;13288:2:1;13273:18;;13266:51;13349:2;13334:18;;13013:345::o;13847:1104::-;13977:3;14006:1;14039:6;14033:13;14069:3;14091:1;14119:9;14115:2;14111:18;14101:28;;14179:2;14168:9;14164:18;14201;14191:61;;14245:4;14237:6;14233:17;14223:27;;14191:61;14271:2;14319;14311:6;14308:14;14288:18;14285:38;14282:165;;;-1:-1:-1;;;14346:33:1;;14402:4;14399:1;14392:15;14432:4;14353:3;14420:17;14282:165;14463:18;14490:104;;;;14608:1;14603:323;;;;14456:470;;14490:104;-1:-1:-1;;14523:24:1;;14511:37;;14568:16;;;;-1:-1:-1;14490:104:1;;14603:323;13794:1;13787:14;;;13831:4;13818:18;;14701:1;14715:165;14729:6;14726:1;14723:13;14715:165;;;14807:14;;14794:11;;;14787:35;14850:16;;;;14744:10;;14715:165;;;14719:3;;14909:6;14904:3;14900:16;14893:23;;14456:470;-1:-1:-1;14942:3:1;;13847:1104;-1:-1:-1;;;;;;;;13847:1104:1:o;14956:184::-;15026:6;15079:2;15067:9;15058:7;15054:23;15050:32;15047:52;;;15095:1;15092;15085:12;15047:52;-1:-1:-1;15118:16:1;;14956:184;-1:-1:-1;14956:184:1:o;15145:274::-;15274:3;15312:6;15306:13;15328:53;15374:6;15369:3;15362:4;15354:6;15350:17;15328:53;:::i;:::-;15397:16;;;;;15145:274;-1:-1:-1;;15145:274:1:o;16118:390::-;16277:2;16266:9;16259:21;16316:6;16311:2;16300:9;16296:18;16289:34;16373:6;16365;16360:2;16349:9;16345:18;16332:48;16429:1;16400:22;;;16424:2;16396:31;;;16389:42;;;;16492:2;16471:15;;;-1:-1:-1;;16467:29:1;16452:45;16448:54;;16118:390;-1:-1:-1;16118:390:1:o;18321:168::-;18361:7;18427:1;18423;18419:6;18415:14;18412:1;18409:21;18404:1;18397:9;18390:17;18386:45;18383:71;;;18434:18;;:::i;:::-;-1:-1:-1;18474:9:1;;18321:168::o;19252:125::-;19292:4;19320:1;19317;19314:8;19311:34;;;19325:18;;:::i;:::-;-1:-1:-1;19362:9:1;;19252:125::o;19382:355::-;19584:2;19566:21;;;19623:2;19603:18;;;19596:30;19662:33;19657:2;19642:18;;19635:61;19728:2;19713:18;;19382:355::o;19742:413::-;19944:2;19926:21;;;19983:2;19963:18;;;19956:30;20022:34;20017:2;20002:18;;19995:62;-1:-1:-1;;;20088:2:1;20073:18;;20066:47;20145:3;20130:19;;19742:413::o;21232:127::-;21293:10;21288:3;21284:20;21281:1;21274:31;21324:4;21321:1;21314:15;21348:4;21345:1;21338:15;21364:135;21403:3;-1:-1:-1;;21424:17:1;;21421:43;;;21444:18;;:::i;:::-;-1:-1:-1;21491:1:1;21480:13;;21364:135::o;23797:245::-;23864:6;23917:2;23905:9;23896:7;23892:23;23888:32;23885:52;;;23933:1;23930;23923:12;23885:52;23965:9;23959:16;23984:28;24006:5;23984:28;:::i;25445:639::-;25725:3;25763:6;25757:13;25779:53;25825:6;25820:3;25813:4;25805:6;25801:17;25779:53;:::i;:::-;25895:13;;25854:16;;;;25917:57;25895:13;25854:16;25951:4;25939:17;;25917:57;:::i;:::-;-1:-1:-1;;;25996:20:1;;26025:24;;;26076:1;26065:13;;25445:639;-1:-1:-1;;;;25445:639:1:o;26089:808::-;26417:3;26455:6;26449:13;26471:53;26517:6;26512:3;26505:4;26497:6;26493:17;26471:53;:::i;:::-;26587:13;;26546:16;;;;26609:57;26587:13;26546:16;26643:4;26631:17;;26609:57;:::i;:::-;-1:-1:-1;;;26688:20:1;;26717:18;;;26760:13;;26782:65;26760:13;26834:1;26823:13;;26816:4;26804:17;;26782:65;:::i;:::-;26867:20;26889:1;26863:28;;26089:808;-1:-1:-1;;;;;26089:808:1:o;29749:127::-;29810:10;29805:3;29801:20;29798:1;29791:31;29841:4;29838:1;29831:15;29865:4;29862:1;29855:15;29881:112;29913:1;29939;29929:35;;29944:18;;:::i;:::-;-1:-1:-1;29978:9:1;;29881:112::o;29998:120::-;30038:1;30064;30054:35;;30069:18;;:::i;:::-;-1:-1:-1;30103:9:1;;29998:120::o;31908:414::-;32110:2;32092:21;;;32149:2;32129:18;;;32122:30;32188:34;32183:2;32168:18;;32161:62;-1:-1:-1;;;32254:2:1;32239:18;;32232:48;32312:3;32297:19;;31908:414::o;32327:489::-;-1:-1:-1;;;;;32596:15:1;;;32578:34;;32648:15;;32643:2;32628:18;;32621:43;32695:2;32680:18;;32673:34;;;32743:3;32738:2;32723:18;;32716:31;;;32521:4;;32764:46;;32790:19;;32782:6;32764:46;:::i;:::-;32756:54;32327:489;-1:-1:-1;;;;;;32327:489:1:o;32821:249::-;32890:6;32943:2;32931:9;32922:7;32918:23;32914:32;32911:52;;;32959:1;32956;32949:12;32911:52;32991:9;32985:16;33010:30;33034:5;33010:30;:::i;33075:127::-;33136:10;33131:3;33127:20;33124:1;33117:31;33167:4;33164:1;33157:15;33191:4;33188:1;33181:15

Swarm Source

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