ETH Price: $3,426.93 (-1.59%)
Gas: 7 Gwei

Token

Soul Mate (SOUL)
 

Overview

Max Total Supply

667 SOUL

Holders

300

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
6 SOUL
0xa4db2d8c9eddd8320ad655934eaeef6febd09f67
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:
SoulMate

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT


// 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/Counters.sol


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

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

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


// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)

pragma solidity ^0.8.0;

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

    /**
     * @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);
    }

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

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


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

pragma solidity ^0.8.0;

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

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

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


// OpenZeppelin Contracts (last updated v4.7.0) (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 Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

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

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

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

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


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: address zero is not a valid owner");
        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: invalid token ID");
        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) {
        _requireMinted(tokenId);

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

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

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

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

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        _requireMinted(tokenId);

        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: caller is not token 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: caller is not token 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) {
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits an {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 an {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 Reverts if the `tokenId` has not been minted yet.
     */
    function _requireMinted(uint256 tokenId) internal view virtual {
        require(_exists(tokenId), "ERC721: invalid token ID");
    }

    /**
     * @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 {
                    /// @solidity memory-safe-assembly
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

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

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

// File: SoulMate.sol


pragma solidity ^0.8.4;





contract SoulMate is ERC721, Ownable, ReentrancyGuard {
    using Strings for uint256;

    using Counters for Counters.Counter;

    string public baseURI;
    uint256 public maxSupply;

    Counters.Counter private _tokenIdCounter;

    constructor() ERC721("Soul Mate", "SOUL") {
        baseURI = "https://murderheaddeathclub.com/assets/nft_soulmate/metadata/";
        maxSupply = 667;
    }

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

    function airDrop(address[] calldata addresses) public onlyOwner {
        require(addresses.length + _tokenIdCounter.current() <= maxSupply, "Amount exceeds max supply");

        for (uint256 i; i < addresses.length; i++) {
            safeMint(addresses[i]);
        }
    }

    function safeMint(address to) public onlyOwner {
        require(_tokenIdCounter.current() < maxSupply, "Amount exceeds max supply");

        _tokenIdCounter.increment();
        uint256 tokenId = _tokenIdCounter.current();
        _safeMint(to, tokenId);
    }

    function totalSupply() public view returns (uint256) {
        return _tokenIdCounter.current();
    }

    function setbaseURI(string memory URI) public onlyOwner {
        baseURI = URI;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"airDrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"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":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"safeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"URI","type":"string"}],"name":"setbaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"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"}]

60806040523480156200001157600080fd5b506040518060400160405280600981526020017f536f756c204d61746500000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f534f554c00000000000000000000000000000000000000000000000000000000815250816000908051906020019062000096929190620001e9565b508060019080519060200190620000af929190620001e9565b505050620000d2620000c66200011b60201b60201c565b6200012360201b60201c565b60016007819055506040518060600160405280603d815260200162003178603d9139600890805190602001906200010b929190620001e9565b5061029b600981905550620002fe565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620001f79062000299565b90600052602060002090601f0160209004810192826200021b576000855562000267565b82601f106200023657805160ff191683800117855562000267565b8280016001018555821562000267579182015b828111156200026657825182559160200191906001019062000249565b5b5090506200027691906200027a565b5090565b5b80821115620002955760008160009055506001016200027b565b5090565b60006002820490506001821680620002b257607f821691505b60208210811415620002c957620002c8620002cf565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b612e6a806200030e6000396000f3fe608060405234801561001057600080fd5b50600436106101415760003560e01c80636c0360eb116100b8578063a22cb4651161007c578063a22cb4651461034e578063b88d4fde1461036a578063c87b56dd14610386578063d5abeb01146103b6578063e985e9c5146103d4578063f2fde38b1461040457610141565b80636c0360eb146102ba57806370a08231146102d8578063715018a6146103085780638da5cb5b1461031257806395d89b411461033057610141565b806318160ddd1161010a57806318160ddd146101fc57806323b872dd1461021a57806340d097c31461023657806342842e0e146102525780634a44f3791461026e5780636352211e1461028a57610141565b8062b6849f1461014657806301ffc9a71461016257806306fdde0314610192578063081812fc146101b0578063095ea7b3146101e0575b600080fd5b610160600480360381019061015b9190611fbe565b610420565b005b61017c6004803603810190610177919061200b565b6104da565b6040516101899190612420565b60405180910390f35b61019a6105bc565b6040516101a7919061243b565b60405180910390f35b6101ca60048036038101906101c591906120ae565b61064e565b6040516101d791906123b9565b60405180910390f35b6101fa60048036038101906101f59190611f7e565b610694565b005b6102046107ac565b604051610211919061261d565b60405180910390f35b610234600480360381019061022f9190611e68565b6107bd565b005b610250600480360381019061024b9190611dfb565b61081d565b005b61026c60048036038101906102679190611e68565b610898565b005b61028860048036038101906102839190612065565b6108b8565b005b6102a4600480360381019061029f91906120ae565b6108da565b6040516102b191906123b9565b60405180910390f35b6102c261098c565b6040516102cf919061243b565b60405180910390f35b6102f260048036038101906102ed9190611dfb565b610a1a565b6040516102ff919061261d565b60405180910390f35b610310610ad2565b005b61031a610ae6565b60405161032791906123b9565b60405180910390f35b610338610b10565b604051610345919061243b565b60405180910390f35b61036860048036038101906103639190611f3e565b610ba2565b005b610384600480360381019061037f9190611ebb565b610bb8565b005b6103a0600480360381019061039b91906120ae565b610c1a565b6040516103ad919061243b565b60405180910390f35b6103be610c82565b6040516103cb919061261d565b60405180910390f35b6103ee60048036038101906103e99190611e28565b610c88565b6040516103fb9190612420565b60405180910390f35b61041e60048036038101906104199190611dfb565b610d1c565b005b610428610da0565b600954610435600a610e1e565b838390506104439190612702565b1115610484576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161047b906125dd565b60405180910390fd5b60005b828290508110156104d5576104c28383838181106104a8576104a76129dd565b5b90506020020160208101906104bd9190611dfb565b61081d565b80806104cd906128d6565b915050610487565b505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806105a557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806105b557506105b482610e2c565b5b9050919050565b6060600080546105cb90612873565b80601f01602080910402602001604051908101604052809291908181526020018280546105f790612873565b80156106445780601f1061061957610100808354040283529160200191610644565b820191906000526020600020905b81548152906001019060200180831161062757829003601f168201915b5050505050905090565b600061065982610e96565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061069f826108da565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610710576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610707906125bd565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661072f610ee1565b73ffffffffffffffffffffffffffffffffffffffff16148061075e575061075d81610758610ee1565b610c88565b5b61079d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107949061253d565b60405180910390fd5b6107a78383610ee9565b505050565b60006107b8600a610e1e565b905090565b6107ce6107c8610ee1565b82610fa2565b61080d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610804906125fd565b60405180910390fd5b610818838383611037565b505050565b610825610da0565b600954610832600a610e1e565b10610872576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610869906125dd565b60405180910390fd5b61087c600a61129e565b6000610888600a610e1e565b905061089482826112b4565b5050565b6108b383838360405180602001604052806000815250610bb8565b505050565b6108c0610da0565b80600890805190602001906108d6929190611bb9565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610983576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097a9061259d565b60405180910390fd5b80915050919050565b6008805461099990612873565b80601f01602080910402602001604051908101604052809291908181526020018280546109c590612873565b8015610a125780601f106109e757610100808354040283529160200191610a12565b820191906000526020600020905b8154815290600101906020018083116109f557829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610a8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a829061251d565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610ada610da0565b610ae460006112d2565b565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610b1f90612873565b80601f0160208091040260200160405190810160405280929190818152602001828054610b4b90612873565b8015610b985780601f10610b6d57610100808354040283529160200191610b98565b820191906000526020600020905b815481529060010190602001808311610b7b57829003601f168201915b5050505050905090565b610bb4610bad610ee1565b8383611398565b5050565b610bc9610bc3610ee1565b83610fa2565b610c08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bff906125fd565b60405180910390fd5b610c1484848484611505565b50505050565b6060610c2582610e96565b6000610c2f611561565b90506000815111610c4f5760405180602001604052806000815250610c7a565b80610c59846115f3565b604051602001610c6a929190612395565b6040516020818303038152906040525b915050919050565b60095481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610d24610da0565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610d94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8b9061247d565b60405180910390fd5b610d9d816112d2565b50565b610da8610ee1565b73ffffffffffffffffffffffffffffffffffffffff16610dc6610ae6565b73ffffffffffffffffffffffffffffffffffffffff1614610e1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e139061257d565b60405180910390fd5b565b600081600001549050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b610e9f81611754565b610ede576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed59061259d565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16610f5c836108da565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080610fae836108da565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480610ff05750610fef8185610c88565b5b8061102e57508373ffffffffffffffffffffffffffffffffffffffff166110168461064e565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611057826108da565b73ffffffffffffffffffffffffffffffffffffffff16146110ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a49061249d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561111d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611114906124dd565b60405180910390fd5b6111288383836117c0565b611133600082610ee9565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546111839190612789565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546111da9190612702565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46112998383836117c5565b505050565b6001816000016000828254019250508190555050565b6112ce8282604051806020016040528060008152506117ca565b5050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611407576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113fe906124fd565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516114f89190612420565b60405180910390a3505050565b611510848484611037565b61151c84848484611825565b61155b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115529061245d565b60405180910390fd5b50505050565b60606008805461157090612873565b80601f016020809104026020016040519081016040528092919081815260200182805461159c90612873565b80156115e95780601f106115be576101008083540402835291602001916115e9565b820191906000526020600020905b8154815290600101906020018083116115cc57829003601f168201915b5050505050905090565b6060600082141561163b576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061174f565b600082905060005b6000821461166d578080611656906128d6565b915050600a826116669190612758565b9150611643565b60008167ffffffffffffffff81111561168957611688612a0c565b5b6040519080825280601f01601f1916602001820160405280156116bb5781602001600182028036833780820191505090505b5090505b60008514611748576001826116d49190612789565b9150600a856116e3919061291f565b60306116ef9190612702565b60f81b818381518110611705576117046129dd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856117419190612758565b94506116bf565b8093505050505b919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b505050565b505050565b6117d483836119bc565b6117e16000848484611825565b611820576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118179061245d565b60405180910390fd5b505050565b60006118468473ffffffffffffffffffffffffffffffffffffffff16611b96565b156119af578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261186f610ee1565b8786866040518563ffffffff1660e01b815260040161189194939291906123d4565b602060405180830381600087803b1580156118ab57600080fd5b505af19250505080156118dc57506040513d601f19601f820116820180604052508101906118d99190612038565b60015b61195f573d806000811461190c576040519150601f19603f3d011682016040523d82523d6000602084013e611911565b606091505b50600081511415611957576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194e9061245d565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506119b4565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a239061255d565b60405180910390fd5b611a3581611754565b15611a75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6c906124bd565b60405180910390fd5b611a81600083836117c0565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ad19190612702565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611b92600083836117c5565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b828054611bc590612873565b90600052602060002090601f016020900481019282611be75760008555611c2e565b82601f10611c0057805160ff1916838001178555611c2e565b82800160010185558215611c2e579182015b82811115611c2d578251825591602001919060010190611c12565b5b509050611c3b9190611c3f565b5090565b5b80821115611c58576000816000905550600101611c40565b5090565b6000611c6f611c6a8461265d565b612638565b905082815260208101848484011115611c8b57611c8a612a4a565b5b611c96848285612831565b509392505050565b6000611cb1611cac8461268e565b612638565b905082815260208101848484011115611ccd57611ccc612a4a565b5b611cd8848285612831565b509392505050565b600081359050611cef81612dd8565b92915050565b60008083601f840112611d0b57611d0a612a40565b5b8235905067ffffffffffffffff811115611d2857611d27612a3b565b5b602083019150836020820283011115611d4457611d43612a45565b5b9250929050565b600081359050611d5a81612def565b92915050565b600081359050611d6f81612e06565b92915050565b600081519050611d8481612e06565b92915050565b600082601f830112611d9f57611d9e612a40565b5b8135611daf848260208601611c5c565b91505092915050565b600082601f830112611dcd57611dcc612a40565b5b8135611ddd848260208601611c9e565b91505092915050565b600081359050611df581612e1d565b92915050565b600060208284031215611e1157611e10612a54565b5b6000611e1f84828501611ce0565b91505092915050565b60008060408385031215611e3f57611e3e612a54565b5b6000611e4d85828601611ce0565b9250506020611e5e85828601611ce0565b9150509250929050565b600080600060608486031215611e8157611e80612a54565b5b6000611e8f86828701611ce0565b9350506020611ea086828701611ce0565b9250506040611eb186828701611de6565b9150509250925092565b60008060008060808587031215611ed557611ed4612a54565b5b6000611ee387828801611ce0565b9450506020611ef487828801611ce0565b9350506040611f0587828801611de6565b925050606085013567ffffffffffffffff811115611f2657611f25612a4f565b5b611f3287828801611d8a565b91505092959194509250565b60008060408385031215611f5557611f54612a54565b5b6000611f6385828601611ce0565b9250506020611f7485828601611d4b565b9150509250929050565b60008060408385031215611f9557611f94612a54565b5b6000611fa385828601611ce0565b9250506020611fb485828601611de6565b9150509250929050565b60008060208385031215611fd557611fd4612a54565b5b600083013567ffffffffffffffff811115611ff357611ff2612a4f565b5b611fff85828601611cf5565b92509250509250929050565b60006020828403121561202157612020612a54565b5b600061202f84828501611d60565b91505092915050565b60006020828403121561204e5761204d612a54565b5b600061205c84828501611d75565b91505092915050565b60006020828403121561207b5761207a612a54565b5b600082013567ffffffffffffffff81111561209957612098612a4f565b5b6120a584828501611db8565b91505092915050565b6000602082840312156120c4576120c3612a54565b5b60006120d284828501611de6565b91505092915050565b6120e4816127bd565b82525050565b6120f3816127cf565b82525050565b6000612104826126bf565b61210e81856126d5565b935061211e818560208601612840565b61212781612a59565b840191505092915050565b600061213d826126ca565b61214781856126e6565b9350612157818560208601612840565b61216081612a59565b840191505092915050565b6000612176826126ca565b61218081856126f7565b9350612190818560208601612840565b80840191505092915050565b60006121a96032836126e6565b91506121b482612a6a565b604082019050919050565b60006121cc6026836126e6565b91506121d782612ab9565b604082019050919050565b60006121ef6025836126e6565b91506121fa82612b08565b604082019050919050565b6000612212601c836126e6565b915061221d82612b57565b602082019050919050565b60006122356024836126e6565b915061224082612b80565b604082019050919050565b60006122586019836126e6565b915061226382612bcf565b602082019050919050565b600061227b6029836126e6565b915061228682612bf8565b604082019050919050565b600061229e603e836126e6565b91506122a982612c47565b604082019050919050565b60006122c16020836126e6565b91506122cc82612c96565b602082019050919050565b60006122e46020836126e6565b91506122ef82612cbf565b602082019050919050565b60006123076018836126e6565b915061231282612ce8565b602082019050919050565b600061232a6021836126e6565b915061233582612d11565b604082019050919050565b600061234d6019836126e6565b915061235882612d60565b602082019050919050565b6000612370602e836126e6565b915061237b82612d89565b604082019050919050565b61238f81612827565b82525050565b60006123a1828561216b565b91506123ad828461216b565b91508190509392505050565b60006020820190506123ce60008301846120db565b92915050565b60006080820190506123e960008301876120db565b6123f660208301866120db565b6124036040830185612386565b818103606083015261241581846120f9565b905095945050505050565b600060208201905061243560008301846120ea565b92915050565b600060208201905081810360008301526124558184612132565b905092915050565b600060208201905081810360008301526124768161219c565b9050919050565b60006020820190508181036000830152612496816121bf565b9050919050565b600060208201905081810360008301526124b6816121e2565b9050919050565b600060208201905081810360008301526124d681612205565b9050919050565b600060208201905081810360008301526124f681612228565b9050919050565b600060208201905081810360008301526125168161224b565b9050919050565b600060208201905081810360008301526125368161226e565b9050919050565b6000602082019050818103600083015261255681612291565b9050919050565b60006020820190508181036000830152612576816122b4565b9050919050565b60006020820190508181036000830152612596816122d7565b9050919050565b600060208201905081810360008301526125b6816122fa565b9050919050565b600060208201905081810360008301526125d68161231d565b9050919050565b600060208201905081810360008301526125f681612340565b9050919050565b6000602082019050818103600083015261261681612363565b9050919050565b60006020820190506126326000830184612386565b92915050565b6000612642612653565b905061264e82826128a5565b919050565b6000604051905090565b600067ffffffffffffffff82111561267857612677612a0c565b5b61268182612a59565b9050602081019050919050565b600067ffffffffffffffff8211156126a9576126a8612a0c565b5b6126b282612a59565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061270d82612827565b915061271883612827565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561274d5761274c612950565b5b828201905092915050565b600061276382612827565b915061276e83612827565b92508261277e5761277d61297f565b5b828204905092915050565b600061279482612827565b915061279f83612827565b9250828210156127b2576127b1612950565b5b828203905092915050565b60006127c882612807565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561285e578082015181840152602081019050612843565b8381111561286d576000848401525b50505050565b6000600282049050600182168061288b57607f821691505b6020821081141561289f5761289e6129ae565b5b50919050565b6128ae82612a59565b810181811067ffffffffffffffff821117156128cd576128cc612a0c565b5b80604052505050565b60006128e182612827565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561291457612913612950565b5b600182019050919050565b600061292a82612827565b915061293583612827565b9250826129455761294461297f565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f416d6f756e742065786365656473206d617820737570706c7900000000000000600082015250565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b612de1816127bd565b8114612dec57600080fd5b50565b612df8816127cf565b8114612e0357600080fd5b50565b612e0f816127db565b8114612e1a57600080fd5b50565b612e2681612827565b8114612e3157600080fd5b5056fea2646970667358221220227bc4eb212a878e05ee8a8c2be1c322ff05324999330b7eba71139a057e70df64736f6c6343000807003368747470733a2f2f6d7572646572686561646465617468636c75622e636f6d2f6173736574732f6e66745f736f756c6d6174652f6d657461646174612f

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101415760003560e01c80636c0360eb116100b8578063a22cb4651161007c578063a22cb4651461034e578063b88d4fde1461036a578063c87b56dd14610386578063d5abeb01146103b6578063e985e9c5146103d4578063f2fde38b1461040457610141565b80636c0360eb146102ba57806370a08231146102d8578063715018a6146103085780638da5cb5b1461031257806395d89b411461033057610141565b806318160ddd1161010a57806318160ddd146101fc57806323b872dd1461021a57806340d097c31461023657806342842e0e146102525780634a44f3791461026e5780636352211e1461028a57610141565b8062b6849f1461014657806301ffc9a71461016257806306fdde0314610192578063081812fc146101b0578063095ea7b3146101e0575b600080fd5b610160600480360381019061015b9190611fbe565b610420565b005b61017c6004803603810190610177919061200b565b6104da565b6040516101899190612420565b60405180910390f35b61019a6105bc565b6040516101a7919061243b565b60405180910390f35b6101ca60048036038101906101c591906120ae565b61064e565b6040516101d791906123b9565b60405180910390f35b6101fa60048036038101906101f59190611f7e565b610694565b005b6102046107ac565b604051610211919061261d565b60405180910390f35b610234600480360381019061022f9190611e68565b6107bd565b005b610250600480360381019061024b9190611dfb565b61081d565b005b61026c60048036038101906102679190611e68565b610898565b005b61028860048036038101906102839190612065565b6108b8565b005b6102a4600480360381019061029f91906120ae565b6108da565b6040516102b191906123b9565b60405180910390f35b6102c261098c565b6040516102cf919061243b565b60405180910390f35b6102f260048036038101906102ed9190611dfb565b610a1a565b6040516102ff919061261d565b60405180910390f35b610310610ad2565b005b61031a610ae6565b60405161032791906123b9565b60405180910390f35b610338610b10565b604051610345919061243b565b60405180910390f35b61036860048036038101906103639190611f3e565b610ba2565b005b610384600480360381019061037f9190611ebb565b610bb8565b005b6103a0600480360381019061039b91906120ae565b610c1a565b6040516103ad919061243b565b60405180910390f35b6103be610c82565b6040516103cb919061261d565b60405180910390f35b6103ee60048036038101906103e99190611e28565b610c88565b6040516103fb9190612420565b60405180910390f35b61041e60048036038101906104199190611dfb565b610d1c565b005b610428610da0565b600954610435600a610e1e565b838390506104439190612702565b1115610484576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161047b906125dd565b60405180910390fd5b60005b828290508110156104d5576104c28383838181106104a8576104a76129dd565b5b90506020020160208101906104bd9190611dfb565b61081d565b80806104cd906128d6565b915050610487565b505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806105a557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806105b557506105b482610e2c565b5b9050919050565b6060600080546105cb90612873565b80601f01602080910402602001604051908101604052809291908181526020018280546105f790612873565b80156106445780601f1061061957610100808354040283529160200191610644565b820191906000526020600020905b81548152906001019060200180831161062757829003601f168201915b5050505050905090565b600061065982610e96565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061069f826108da565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610710576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610707906125bd565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661072f610ee1565b73ffffffffffffffffffffffffffffffffffffffff16148061075e575061075d81610758610ee1565b610c88565b5b61079d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107949061253d565b60405180910390fd5b6107a78383610ee9565b505050565b60006107b8600a610e1e565b905090565b6107ce6107c8610ee1565b82610fa2565b61080d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610804906125fd565b60405180910390fd5b610818838383611037565b505050565b610825610da0565b600954610832600a610e1e565b10610872576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610869906125dd565b60405180910390fd5b61087c600a61129e565b6000610888600a610e1e565b905061089482826112b4565b5050565b6108b383838360405180602001604052806000815250610bb8565b505050565b6108c0610da0565b80600890805190602001906108d6929190611bb9565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610983576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097a9061259d565b60405180910390fd5b80915050919050565b6008805461099990612873565b80601f01602080910402602001604051908101604052809291908181526020018280546109c590612873565b8015610a125780601f106109e757610100808354040283529160200191610a12565b820191906000526020600020905b8154815290600101906020018083116109f557829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610a8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a829061251d565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610ada610da0565b610ae460006112d2565b565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610b1f90612873565b80601f0160208091040260200160405190810160405280929190818152602001828054610b4b90612873565b8015610b985780601f10610b6d57610100808354040283529160200191610b98565b820191906000526020600020905b815481529060010190602001808311610b7b57829003601f168201915b5050505050905090565b610bb4610bad610ee1565b8383611398565b5050565b610bc9610bc3610ee1565b83610fa2565b610c08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bff906125fd565b60405180910390fd5b610c1484848484611505565b50505050565b6060610c2582610e96565b6000610c2f611561565b90506000815111610c4f5760405180602001604052806000815250610c7a565b80610c59846115f3565b604051602001610c6a929190612395565b6040516020818303038152906040525b915050919050565b60095481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610d24610da0565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610d94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8b9061247d565b60405180910390fd5b610d9d816112d2565b50565b610da8610ee1565b73ffffffffffffffffffffffffffffffffffffffff16610dc6610ae6565b73ffffffffffffffffffffffffffffffffffffffff1614610e1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e139061257d565b60405180910390fd5b565b600081600001549050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b610e9f81611754565b610ede576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed59061259d565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16610f5c836108da565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080610fae836108da565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480610ff05750610fef8185610c88565b5b8061102e57508373ffffffffffffffffffffffffffffffffffffffff166110168461064e565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611057826108da565b73ffffffffffffffffffffffffffffffffffffffff16146110ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a49061249d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561111d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611114906124dd565b60405180910390fd5b6111288383836117c0565b611133600082610ee9565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546111839190612789565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546111da9190612702565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46112998383836117c5565b505050565b6001816000016000828254019250508190555050565b6112ce8282604051806020016040528060008152506117ca565b5050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611407576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113fe906124fd565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516114f89190612420565b60405180910390a3505050565b611510848484611037565b61151c84848484611825565b61155b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115529061245d565b60405180910390fd5b50505050565b60606008805461157090612873565b80601f016020809104026020016040519081016040528092919081815260200182805461159c90612873565b80156115e95780601f106115be576101008083540402835291602001916115e9565b820191906000526020600020905b8154815290600101906020018083116115cc57829003601f168201915b5050505050905090565b6060600082141561163b576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061174f565b600082905060005b6000821461166d578080611656906128d6565b915050600a826116669190612758565b9150611643565b60008167ffffffffffffffff81111561168957611688612a0c565b5b6040519080825280601f01601f1916602001820160405280156116bb5781602001600182028036833780820191505090505b5090505b60008514611748576001826116d49190612789565b9150600a856116e3919061291f565b60306116ef9190612702565b60f81b818381518110611705576117046129dd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856117419190612758565b94506116bf565b8093505050505b919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b505050565b505050565b6117d483836119bc565b6117e16000848484611825565b611820576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118179061245d565b60405180910390fd5b505050565b60006118468473ffffffffffffffffffffffffffffffffffffffff16611b96565b156119af578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261186f610ee1565b8786866040518563ffffffff1660e01b815260040161189194939291906123d4565b602060405180830381600087803b1580156118ab57600080fd5b505af19250505080156118dc57506040513d601f19601f820116820180604052508101906118d99190612038565b60015b61195f573d806000811461190c576040519150601f19603f3d011682016040523d82523d6000602084013e611911565b606091505b50600081511415611957576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194e9061245d565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506119b4565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a239061255d565b60405180910390fd5b611a3581611754565b15611a75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6c906124bd565b60405180910390fd5b611a81600083836117c0565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ad19190612702565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611b92600083836117c5565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b828054611bc590612873565b90600052602060002090601f016020900481019282611be75760008555611c2e565b82601f10611c0057805160ff1916838001178555611c2e565b82800160010185558215611c2e579182015b82811115611c2d578251825591602001919060010190611c12565b5b509050611c3b9190611c3f565b5090565b5b80821115611c58576000816000905550600101611c40565b5090565b6000611c6f611c6a8461265d565b612638565b905082815260208101848484011115611c8b57611c8a612a4a565b5b611c96848285612831565b509392505050565b6000611cb1611cac8461268e565b612638565b905082815260208101848484011115611ccd57611ccc612a4a565b5b611cd8848285612831565b509392505050565b600081359050611cef81612dd8565b92915050565b60008083601f840112611d0b57611d0a612a40565b5b8235905067ffffffffffffffff811115611d2857611d27612a3b565b5b602083019150836020820283011115611d4457611d43612a45565b5b9250929050565b600081359050611d5a81612def565b92915050565b600081359050611d6f81612e06565b92915050565b600081519050611d8481612e06565b92915050565b600082601f830112611d9f57611d9e612a40565b5b8135611daf848260208601611c5c565b91505092915050565b600082601f830112611dcd57611dcc612a40565b5b8135611ddd848260208601611c9e565b91505092915050565b600081359050611df581612e1d565b92915050565b600060208284031215611e1157611e10612a54565b5b6000611e1f84828501611ce0565b91505092915050565b60008060408385031215611e3f57611e3e612a54565b5b6000611e4d85828601611ce0565b9250506020611e5e85828601611ce0565b9150509250929050565b600080600060608486031215611e8157611e80612a54565b5b6000611e8f86828701611ce0565b9350506020611ea086828701611ce0565b9250506040611eb186828701611de6565b9150509250925092565b60008060008060808587031215611ed557611ed4612a54565b5b6000611ee387828801611ce0565b9450506020611ef487828801611ce0565b9350506040611f0587828801611de6565b925050606085013567ffffffffffffffff811115611f2657611f25612a4f565b5b611f3287828801611d8a565b91505092959194509250565b60008060408385031215611f5557611f54612a54565b5b6000611f6385828601611ce0565b9250506020611f7485828601611d4b565b9150509250929050565b60008060408385031215611f9557611f94612a54565b5b6000611fa385828601611ce0565b9250506020611fb485828601611de6565b9150509250929050565b60008060208385031215611fd557611fd4612a54565b5b600083013567ffffffffffffffff811115611ff357611ff2612a4f565b5b611fff85828601611cf5565b92509250509250929050565b60006020828403121561202157612020612a54565b5b600061202f84828501611d60565b91505092915050565b60006020828403121561204e5761204d612a54565b5b600061205c84828501611d75565b91505092915050565b60006020828403121561207b5761207a612a54565b5b600082013567ffffffffffffffff81111561209957612098612a4f565b5b6120a584828501611db8565b91505092915050565b6000602082840312156120c4576120c3612a54565b5b60006120d284828501611de6565b91505092915050565b6120e4816127bd565b82525050565b6120f3816127cf565b82525050565b6000612104826126bf565b61210e81856126d5565b935061211e818560208601612840565b61212781612a59565b840191505092915050565b600061213d826126ca565b61214781856126e6565b9350612157818560208601612840565b61216081612a59565b840191505092915050565b6000612176826126ca565b61218081856126f7565b9350612190818560208601612840565b80840191505092915050565b60006121a96032836126e6565b91506121b482612a6a565b604082019050919050565b60006121cc6026836126e6565b91506121d782612ab9565b604082019050919050565b60006121ef6025836126e6565b91506121fa82612b08565b604082019050919050565b6000612212601c836126e6565b915061221d82612b57565b602082019050919050565b60006122356024836126e6565b915061224082612b80565b604082019050919050565b60006122586019836126e6565b915061226382612bcf565b602082019050919050565b600061227b6029836126e6565b915061228682612bf8565b604082019050919050565b600061229e603e836126e6565b91506122a982612c47565b604082019050919050565b60006122c16020836126e6565b91506122cc82612c96565b602082019050919050565b60006122e46020836126e6565b91506122ef82612cbf565b602082019050919050565b60006123076018836126e6565b915061231282612ce8565b602082019050919050565b600061232a6021836126e6565b915061233582612d11565b604082019050919050565b600061234d6019836126e6565b915061235882612d60565b602082019050919050565b6000612370602e836126e6565b915061237b82612d89565b604082019050919050565b61238f81612827565b82525050565b60006123a1828561216b565b91506123ad828461216b565b91508190509392505050565b60006020820190506123ce60008301846120db565b92915050565b60006080820190506123e960008301876120db565b6123f660208301866120db565b6124036040830185612386565b818103606083015261241581846120f9565b905095945050505050565b600060208201905061243560008301846120ea565b92915050565b600060208201905081810360008301526124558184612132565b905092915050565b600060208201905081810360008301526124768161219c565b9050919050565b60006020820190508181036000830152612496816121bf565b9050919050565b600060208201905081810360008301526124b6816121e2565b9050919050565b600060208201905081810360008301526124d681612205565b9050919050565b600060208201905081810360008301526124f681612228565b9050919050565b600060208201905081810360008301526125168161224b565b9050919050565b600060208201905081810360008301526125368161226e565b9050919050565b6000602082019050818103600083015261255681612291565b9050919050565b60006020820190508181036000830152612576816122b4565b9050919050565b60006020820190508181036000830152612596816122d7565b9050919050565b600060208201905081810360008301526125b6816122fa565b9050919050565b600060208201905081810360008301526125d68161231d565b9050919050565b600060208201905081810360008301526125f681612340565b9050919050565b6000602082019050818103600083015261261681612363565b9050919050565b60006020820190506126326000830184612386565b92915050565b6000612642612653565b905061264e82826128a5565b919050565b6000604051905090565b600067ffffffffffffffff82111561267857612677612a0c565b5b61268182612a59565b9050602081019050919050565b600067ffffffffffffffff8211156126a9576126a8612a0c565b5b6126b282612a59565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061270d82612827565b915061271883612827565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561274d5761274c612950565b5b828201905092915050565b600061276382612827565b915061276e83612827565b92508261277e5761277d61297f565b5b828204905092915050565b600061279482612827565b915061279f83612827565b9250828210156127b2576127b1612950565b5b828203905092915050565b60006127c882612807565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561285e578082015181840152602081019050612843565b8381111561286d576000848401525b50505050565b6000600282049050600182168061288b57607f821691505b6020821081141561289f5761289e6129ae565b5b50919050565b6128ae82612a59565b810181811067ffffffffffffffff821117156128cd576128cc612a0c565b5b80604052505050565b60006128e182612827565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561291457612913612950565b5b600182019050919050565b600061292a82612827565b915061293583612827565b9250826129455761294461297f565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f416d6f756e742065786365656473206d617820737570706c7900000000000000600082015250565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b612de1816127bd565b8114612dec57600080fd5b50565b612df8816127cf565b8114612e0357600080fd5b50565b612e0f816127db565b8114612e1a57600080fd5b50565b612e2681612827565b8114612e3157600080fd5b5056fea2646970667358221220227bc4eb212a878e05ee8a8c2be1c322ff05324999330b7eba71139a057e70df64736f6c63430008070033

Deployed Bytecode Sourcemap

42242:1294:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42767:282;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28998:305;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29925:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31438:171;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30955:417;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43333:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32138:336;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43057:268;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32545:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43445:88;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29636:222;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42381:21;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29367:207;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9534:103;;;:::i;:::-;;8886:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30094:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31681:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32801:323;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30269:281;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42409:24;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31907:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9792:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42767:282;8772:13;:11;:13::i;:::-;42898:9:::1;;42869:25;:15;:23;:25::i;:::-;42850:9;;:16;;:44;;;;:::i;:::-;:57;;42842:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;42955:9;42950:92;42970:9;;:16;;42966:1;:20;42950:92;;;43008:22;43017:9;;43027:1;43017:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;43008:8;:22::i;:::-;42988:3;;;;;:::i;:::-;;;;42950:92;;;;42767:282:::0;;:::o;28998:305::-;29100:4;29152:25;29137:40;;;:11;:40;;;;:105;;;;29209:33;29194:48;;;:11;:48;;;;29137:105;:158;;;;29259:36;29283:11;29259:23;:36::i;:::-;29137:158;29117:178;;28998:305;;;:::o;29925:100::-;29979:13;30012:5;30005:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29925:100;:::o;31438:171::-;31514:7;31534:23;31549:7;31534:14;:23::i;:::-;31577:15;:24;31593:7;31577:24;;;;;;;;;;;;;;;;;;;;;31570:31;;31438:171;;;:::o;30955:417::-;31036:13;31052:23;31067:7;31052:14;:23::i;:::-;31036:39;;31100:5;31094:11;;:2;:11;;;;31086:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;31194:5;31178:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;31203:37;31220:5;31227:12;:10;:12::i;:::-;31203:16;:37::i;:::-;31178:62;31156:174;;;;;;;;;;;;:::i;:::-;;;;;;;;;31343:21;31352:2;31356:7;31343:8;:21::i;:::-;31025:347;30955:417;;:::o;43333:104::-;43377:7;43404:25;:15;:23;:25::i;:::-;43397:32;;43333:104;:::o;32138:336::-;32333:41;32352:12;:10;:12::i;:::-;32366:7;32333:18;:41::i;:::-;32325:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;32438:28;32448:4;32454:2;32458:7;32438:9;:28::i;:::-;32138:336;;;:::o;43057:268::-;8772:13;:11;:13::i;:::-;43151:9:::1;;43123:25;:15;:23;:25::i;:::-;:37;43115:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;43203:27;:15;:25;:27::i;:::-;43241:15;43259:25;:15;:23;:25::i;:::-;43241:43;;43295:22;43305:2;43309:7;43295:9;:22::i;:::-;43104:221;43057:268:::0;:::o;32545:185::-;32683:39;32700:4;32706:2;32710:7;32683:39;;;;;;;;;;;;:16;:39::i;:::-;32545:185;;;:::o;43445:88::-;8772:13;:11;:13::i;:::-;43522:3:::1;43512:7;:13;;;;;;;;;;;;:::i;:::-;;43445:88:::0;:::o;29636:222::-;29708:7;29728:13;29744:7;:16;29752:7;29744:16;;;;;;;;;;;;;;;;;;;;;29728:32;;29796:1;29779:19;;:5;:19;;;;29771:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;29845:5;29838:12;;;29636:222;;;:::o;42381:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;29367:207::-;29439:7;29484:1;29467:19;;:5;:19;;;;29459:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;29550:9;:16;29560:5;29550:16;;;;;;;;;;;;;;;;29543:23;;29367:207;;;:::o;9534:103::-;8772:13;:11;:13::i;:::-;9599:30:::1;9626:1;9599:18;:30::i;:::-;9534:103::o:0;8886:87::-;8932:7;8959:6;;;;;;;;;;;8952:13;;8886:87;:::o;30094:104::-;30150:13;30183:7;30176:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30094:104;:::o;31681:155::-;31776:52;31795:12;:10;:12::i;:::-;31809:8;31819;31776:18;:52::i;:::-;31681:155;;:::o;32801:323::-;32975:41;32994:12;:10;:12::i;:::-;33008:7;32975:18;:41::i;:::-;32967:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;33078:38;33092:4;33098:2;33102:7;33111:4;33078:13;:38::i;:::-;32801:323;;;;:::o;30269:281::-;30342:13;30368:23;30383:7;30368:14;:23::i;:::-;30404:21;30428:10;:8;:10::i;:::-;30404:34;;30480:1;30462:7;30456:21;:25;:86;;;;;;;;;;;;;;;;;30508:7;30517:18;:7;:16;:18::i;:::-;30491:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;30456:86;30449:93;;;30269:281;;;:::o;42409:24::-;;;;:::o;31907:164::-;32004:4;32028:18;:25;32047:5;32028:25;;;;;;;;;;;;;;;:35;32054:8;32028:35;;;;;;;;;;;;;;;;;;;;;;;;;32021:42;;31907:164;;;;:::o;9792:201::-;8772:13;:11;:13::i;:::-;9901:1:::1;9881:22;;:8;:22;;;;9873:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;9957:28;9976:8;9957:18;:28::i;:::-;9792:201:::0;:::o;9051:132::-;9126:12;:10;:12::i;:::-;9115:23;;:7;:5;:7::i;:::-;:23;;;9107:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9051:132::o;3668:114::-;3733:7;3760;:14;;;3753:21;;3668:114;;;:::o;21740:157::-;21825:4;21864:25;21849:40;;;:11;:40;;;;21842:47;;21740:157;;;:::o;39413:135::-;39495:16;39503:7;39495;:16::i;:::-;39487:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;39413:135;:::o;7437:98::-;7490:7;7517:10;7510:17;;7437:98;:::o;38692:174::-;38794:2;38767:15;:24;38783:7;38767:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;38850:7;38846:2;38812:46;;38821:23;38836:7;38821:14;:23::i;:::-;38812:46;;;;;;;;;;;;38692:174;;:::o;34925:264::-;35018:4;35035:13;35051:23;35066:7;35051:14;:23::i;:::-;35035:39;;35104:5;35093:16;;:7;:16;;;:52;;;;35113:32;35130:5;35137:7;35113:16;:32::i;:::-;35093:52;:87;;;;35173:7;35149:31;;:20;35161:7;35149:11;:20::i;:::-;:31;;;35093:87;35085:96;;;34925:264;;;;:::o;37948:625::-;38107:4;38080:31;;:23;38095:7;38080:14;:23::i;:::-;:31;;;38072:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;38186:1;38172:16;;:2;:16;;;;38164:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;38242:39;38263:4;38269:2;38273:7;38242:20;:39::i;:::-;38346:29;38363:1;38367:7;38346:8;:29::i;:::-;38407:1;38388:9;:15;38398:4;38388:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;38436:1;38419:9;:13;38429:2;38419:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;38467:2;38448:7;:16;38456:7;38448:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;38506:7;38502:2;38487:27;;38496:4;38487:27;;;;;;;;;;;;38527:38;38547:4;38553:2;38557:7;38527:19;:38::i;:::-;37948:625;;;:::o;3790:127::-;3897:1;3879:7;:14;;;:19;;;;;;;;;;;3790:127;:::o;35531:110::-;35607:26;35617:2;35621:7;35607:26;;;;;;;;;;;;:9;:26::i;:::-;35531:110;;:::o;10153:191::-;10227:16;10246:6;;;;;;;;;;;10227:25;;10272:8;10263:6;;:17;;;;;;;;;;;;;;;;;;10327:8;10296:40;;10317:8;10296:40;;;;;;;;;;;;10216:128;10153:191;:::o;39009:315::-;39164:8;39155:17;;:5;:17;;;;39147:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;39251:8;39213:18;:25;39232:5;39213:25;;;;;;;;;;;;;;;:35;39239:8;39213:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;39297:8;39275:41;;39290:5;39275:41;;;39307:8;39275:41;;;;;;:::i;:::-;;;;;;;;39009:315;;;:::o;34005:313::-;34161:28;34171:4;34177:2;34181:7;34161:9;:28::i;:::-;34208:47;34231:4;34237:2;34241:7;34250:4;34208:22;:47::i;:::-;34200:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;34005:313;;;;:::o;42659:100::-;42711:13;42744:7;42737:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42659:100;:::o;4691:723::-;4747:13;4977:1;4968:5;:10;4964:53;;;4995:10;;;;;;;;;;;;;;;;;;;;;4964:53;5027:12;5042:5;5027:20;;5058:14;5083:78;5098:1;5090:4;:9;5083:78;;5116:8;;;;;:::i;:::-;;;;5147:2;5139:10;;;;;:::i;:::-;;;5083:78;;;5171:19;5203:6;5193:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5171:39;;5221:154;5237:1;5228:5;:10;5221:154;;5265:1;5255:11;;;;;:::i;:::-;;;5332:2;5324:5;:10;;;;:::i;:::-;5311:2;:24;;;;:::i;:::-;5298:39;;5281:6;5288;5281:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;5361:2;5352:11;;;;;:::i;:::-;;;5221:154;;;5399:6;5385:21;;;;;4691:723;;;;:::o;34631:127::-;34696:4;34748:1;34720:30;;:7;:16;34728:7;34720:16;;;;;;;;;;;;;;;;;;;;;:30;;;;34713:37;;34631:127;;;:::o;41537:126::-;;;;:::o;42048:125::-;;;;:::o;35868:319::-;35997:18;36003:2;36007:7;35997:5;:18::i;:::-;36048:53;36079:1;36083:2;36087:7;36096:4;36048:22;:53::i;:::-;36026:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;35868:319;;;:::o;40112:853::-;40266:4;40287:15;:2;:13;;;:15::i;:::-;40283:675;;;40339:2;40323:36;;;40360:12;:10;:12::i;:::-;40374:4;40380:7;40389:4;40323:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;40319:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40581:1;40564:6;:13;:18;40560:328;;;40607:60;;;;;;;;;;:::i;:::-;;;;;;;;40560:328;40838:6;40832:13;40823:6;40819:2;40815:15;40808:38;40319:584;40455:41;;;40445:51;;;:6;:51;;;;40438:58;;;;;40283:675;40942:4;40935:11;;40112:853;;;;;;;:::o;36523:439::-;36617:1;36603:16;;:2;:16;;;;36595:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;36676:16;36684:7;36676;:16::i;:::-;36675:17;36667:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;36738:45;36767:1;36771:2;36775:7;36738:20;:45::i;:::-;36813:1;36796:9;:13;36806:2;36796:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;36844:2;36825:7;:16;36833:7;36825:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;36889:7;36885:2;36864:33;;36881:1;36864:33;;;;;;;;;;;;36910:44;36938:1;36942:2;36946:7;36910:19;:44::i;:::-;36523:439;;:::o;11584:326::-;11644:4;11901:1;11879:7;:19;;;:23;11872:30;;11584:326;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;1003:568::-;1076:8;1086:6;1136:3;1129:4;1121:6;1117:17;1113:27;1103:122;;1144:79;;:::i;:::-;1103:122;1257:6;1244:20;1234:30;;1287:18;1279:6;1276:30;1273:117;;;1309:79;;:::i;:::-;1273:117;1423:4;1415:6;1411:17;1399:29;;1477:3;1469:4;1461:6;1457:17;1447:8;1443:32;1440:41;1437:128;;;1484:79;;:::i;:::-;1437:128;1003:568;;;;;:::o;1577:133::-;1620:5;1658:6;1645:20;1636:29;;1674:30;1698:5;1674:30;:::i;:::-;1577:133;;;;:::o;1716:137::-;1761:5;1799:6;1786:20;1777:29;;1815:32;1841:5;1815:32;:::i;:::-;1716:137;;;;:::o;1859:141::-;1915:5;1946:6;1940:13;1931:22;;1962:32;1988:5;1962:32;:::i;:::-;1859:141;;;;:::o;2019:338::-;2074:5;2123:3;2116:4;2108:6;2104:17;2100:27;2090:122;;2131:79;;:::i;:::-;2090:122;2248:6;2235:20;2273:78;2347:3;2339:6;2332:4;2324:6;2320:17;2273:78;:::i;:::-;2264:87;;2080:277;2019:338;;;;:::o;2377:340::-;2433:5;2482:3;2475:4;2467:6;2463:17;2459:27;2449:122;;2490:79;;:::i;:::-;2449:122;2607:6;2594:20;2632:79;2707:3;2699:6;2692:4;2684:6;2680:17;2632:79;:::i;:::-;2623:88;;2439:278;2377:340;;;;:::o;2723:139::-;2769:5;2807:6;2794:20;2785:29;;2823:33;2850:5;2823:33;:::i;:::-;2723:139;;;;:::o;2868:329::-;2927:6;2976:2;2964:9;2955:7;2951:23;2947:32;2944:119;;;2982:79;;:::i;:::-;2944:119;3102:1;3127:53;3172:7;3163:6;3152:9;3148:22;3127:53;:::i;:::-;3117:63;;3073:117;2868:329;;;;:::o;3203:474::-;3271:6;3279;3328:2;3316:9;3307:7;3303:23;3299:32;3296:119;;;3334:79;;:::i;:::-;3296:119;3454:1;3479:53;3524:7;3515:6;3504:9;3500:22;3479:53;:::i;:::-;3469:63;;3425:117;3581:2;3607:53;3652:7;3643:6;3632:9;3628:22;3607:53;:::i;:::-;3597:63;;3552:118;3203:474;;;;;:::o;3683:619::-;3760:6;3768;3776;3825:2;3813:9;3804:7;3800:23;3796:32;3793:119;;;3831:79;;:::i;:::-;3793:119;3951:1;3976:53;4021:7;4012:6;4001:9;3997:22;3976:53;:::i;:::-;3966:63;;3922:117;4078:2;4104:53;4149:7;4140:6;4129:9;4125:22;4104:53;:::i;:::-;4094:63;;4049:118;4206:2;4232:53;4277:7;4268:6;4257:9;4253:22;4232:53;:::i;:::-;4222:63;;4177:118;3683:619;;;;;:::o;4308:943::-;4403:6;4411;4419;4427;4476:3;4464:9;4455:7;4451:23;4447:33;4444:120;;;4483:79;;:::i;:::-;4444:120;4603:1;4628:53;4673:7;4664:6;4653:9;4649:22;4628:53;:::i;:::-;4618:63;;4574:117;4730:2;4756:53;4801:7;4792:6;4781:9;4777:22;4756:53;:::i;:::-;4746:63;;4701:118;4858:2;4884:53;4929:7;4920:6;4909:9;4905:22;4884:53;:::i;:::-;4874:63;;4829:118;5014:2;5003:9;4999:18;4986:32;5045:18;5037:6;5034:30;5031:117;;;5067:79;;:::i;:::-;5031:117;5172:62;5226:7;5217:6;5206:9;5202:22;5172:62;:::i;:::-;5162:72;;4957:287;4308:943;;;;;;;:::o;5257:468::-;5322:6;5330;5379:2;5367:9;5358:7;5354:23;5350:32;5347:119;;;5385:79;;:::i;:::-;5347:119;5505:1;5530:53;5575:7;5566:6;5555:9;5551:22;5530:53;:::i;:::-;5520:63;;5476:117;5632:2;5658:50;5700:7;5691:6;5680:9;5676:22;5658:50;:::i;:::-;5648:60;;5603:115;5257:468;;;;;:::o;5731:474::-;5799:6;5807;5856:2;5844:9;5835:7;5831:23;5827:32;5824:119;;;5862:79;;:::i;:::-;5824:119;5982:1;6007:53;6052:7;6043:6;6032:9;6028:22;6007:53;:::i;:::-;5997:63;;5953:117;6109:2;6135:53;6180:7;6171:6;6160:9;6156:22;6135:53;:::i;:::-;6125:63;;6080:118;5731:474;;;;;:::o;6211:559::-;6297:6;6305;6354:2;6342:9;6333:7;6329:23;6325:32;6322:119;;;6360:79;;:::i;:::-;6322:119;6508:1;6497:9;6493:17;6480:31;6538:18;6530:6;6527:30;6524:117;;;6560:79;;:::i;:::-;6524:117;6673:80;6745:7;6736:6;6725:9;6721:22;6673:80;:::i;:::-;6655:98;;;;6451:312;6211:559;;;;;:::o;6776:327::-;6834:6;6883:2;6871:9;6862:7;6858:23;6854:32;6851:119;;;6889:79;;:::i;:::-;6851:119;7009:1;7034:52;7078:7;7069:6;7058:9;7054:22;7034:52;:::i;:::-;7024:62;;6980:116;6776:327;;;;:::o;7109:349::-;7178:6;7227:2;7215:9;7206:7;7202:23;7198:32;7195:119;;;7233:79;;:::i;:::-;7195:119;7353:1;7378:63;7433:7;7424:6;7413:9;7409:22;7378:63;:::i;:::-;7368:73;;7324:127;7109:349;;;;:::o;7464:509::-;7533:6;7582:2;7570:9;7561:7;7557:23;7553:32;7550:119;;;7588:79;;:::i;:::-;7550:119;7736:1;7725:9;7721:17;7708:31;7766:18;7758:6;7755:30;7752:117;;;7788:79;;:::i;:::-;7752:117;7893:63;7948:7;7939:6;7928:9;7924:22;7893:63;:::i;:::-;7883:73;;7679:287;7464:509;;;;:::o;7979:329::-;8038:6;8087:2;8075:9;8066:7;8062:23;8058:32;8055:119;;;8093:79;;:::i;:::-;8055:119;8213:1;8238:53;8283:7;8274:6;8263:9;8259:22;8238:53;:::i;:::-;8228:63;;8184:117;7979:329;;;;:::o;8314:118::-;8401:24;8419:5;8401:24;:::i;:::-;8396:3;8389:37;8314:118;;:::o;8438:109::-;8519:21;8534:5;8519:21;:::i;:::-;8514:3;8507:34;8438:109;;:::o;8553:360::-;8639:3;8667:38;8699:5;8667:38;:::i;:::-;8721:70;8784:6;8779:3;8721:70;:::i;:::-;8714:77;;8800:52;8845:6;8840:3;8833:4;8826:5;8822:16;8800:52;:::i;:::-;8877:29;8899:6;8877:29;:::i;:::-;8872:3;8868:39;8861:46;;8643:270;8553:360;;;;:::o;8919:364::-;9007:3;9035:39;9068:5;9035:39;:::i;:::-;9090:71;9154:6;9149:3;9090:71;:::i;:::-;9083:78;;9170:52;9215:6;9210:3;9203:4;9196:5;9192:16;9170:52;:::i;:::-;9247:29;9269:6;9247:29;:::i;:::-;9242:3;9238:39;9231:46;;9011:272;8919:364;;;;:::o;9289:377::-;9395:3;9423:39;9456:5;9423:39;:::i;:::-;9478:89;9560:6;9555:3;9478:89;:::i;:::-;9471:96;;9576:52;9621:6;9616:3;9609:4;9602:5;9598:16;9576:52;:::i;:::-;9653:6;9648:3;9644:16;9637:23;;9399:267;9289:377;;;;:::o;9672:366::-;9814:3;9835:67;9899:2;9894:3;9835:67;:::i;:::-;9828:74;;9911:93;10000:3;9911:93;:::i;:::-;10029:2;10024:3;10020:12;10013:19;;9672:366;;;:::o;10044:::-;10186:3;10207:67;10271:2;10266:3;10207:67;:::i;:::-;10200:74;;10283:93;10372:3;10283:93;:::i;:::-;10401:2;10396:3;10392:12;10385:19;;10044:366;;;:::o;10416:::-;10558:3;10579:67;10643:2;10638:3;10579:67;:::i;:::-;10572:74;;10655:93;10744:3;10655:93;:::i;:::-;10773:2;10768:3;10764:12;10757:19;;10416:366;;;:::o;10788:::-;10930:3;10951:67;11015:2;11010:3;10951:67;:::i;:::-;10944:74;;11027:93;11116:3;11027:93;:::i;:::-;11145:2;11140:3;11136:12;11129:19;;10788:366;;;:::o;11160:::-;11302:3;11323:67;11387:2;11382:3;11323:67;:::i;:::-;11316:74;;11399:93;11488:3;11399:93;:::i;:::-;11517:2;11512:3;11508:12;11501:19;;11160:366;;;:::o;11532:::-;11674:3;11695:67;11759:2;11754:3;11695:67;:::i;:::-;11688:74;;11771:93;11860:3;11771:93;:::i;:::-;11889:2;11884:3;11880:12;11873:19;;11532:366;;;:::o;11904:::-;12046:3;12067:67;12131:2;12126:3;12067:67;:::i;:::-;12060:74;;12143:93;12232:3;12143:93;:::i;:::-;12261:2;12256:3;12252:12;12245:19;;11904:366;;;:::o;12276:::-;12418:3;12439:67;12503:2;12498:3;12439:67;:::i;:::-;12432:74;;12515:93;12604:3;12515:93;:::i;:::-;12633:2;12628:3;12624:12;12617:19;;12276:366;;;:::o;12648:::-;12790:3;12811:67;12875:2;12870:3;12811:67;:::i;:::-;12804:74;;12887:93;12976:3;12887:93;:::i;:::-;13005:2;13000:3;12996:12;12989:19;;12648:366;;;:::o;13020:::-;13162:3;13183:67;13247:2;13242:3;13183:67;:::i;:::-;13176:74;;13259:93;13348:3;13259:93;:::i;:::-;13377:2;13372:3;13368:12;13361:19;;13020:366;;;:::o;13392:::-;13534:3;13555:67;13619:2;13614:3;13555:67;:::i;:::-;13548:74;;13631:93;13720:3;13631:93;:::i;:::-;13749:2;13744:3;13740:12;13733:19;;13392:366;;;:::o;13764:::-;13906:3;13927:67;13991:2;13986:3;13927:67;:::i;:::-;13920:74;;14003:93;14092:3;14003:93;:::i;:::-;14121:2;14116:3;14112:12;14105:19;;13764:366;;;:::o;14136:::-;14278:3;14299:67;14363:2;14358:3;14299:67;:::i;:::-;14292:74;;14375:93;14464:3;14375:93;:::i;:::-;14493:2;14488:3;14484:12;14477:19;;14136:366;;;:::o;14508:::-;14650:3;14671:67;14735:2;14730:3;14671:67;:::i;:::-;14664:74;;14747:93;14836:3;14747:93;:::i;:::-;14865:2;14860:3;14856:12;14849:19;;14508:366;;;:::o;14880:118::-;14967:24;14985:5;14967:24;:::i;:::-;14962:3;14955:37;14880:118;;:::o;15004:435::-;15184:3;15206:95;15297:3;15288:6;15206:95;:::i;:::-;15199:102;;15318:95;15409:3;15400:6;15318:95;:::i;:::-;15311:102;;15430:3;15423:10;;15004:435;;;;;:::o;15445:222::-;15538:4;15576:2;15565:9;15561:18;15553:26;;15589:71;15657:1;15646:9;15642:17;15633:6;15589:71;:::i;:::-;15445:222;;;;:::o;15673:640::-;15868:4;15906:3;15895:9;15891:19;15883:27;;15920:71;15988:1;15977:9;15973:17;15964:6;15920:71;:::i;:::-;16001:72;16069:2;16058:9;16054:18;16045:6;16001:72;:::i;:::-;16083;16151:2;16140:9;16136:18;16127:6;16083:72;:::i;:::-;16202:9;16196:4;16192:20;16187:2;16176:9;16172:18;16165:48;16230:76;16301:4;16292:6;16230:76;:::i;:::-;16222:84;;15673:640;;;;;;;:::o;16319:210::-;16406:4;16444:2;16433:9;16429:18;16421:26;;16457:65;16519:1;16508:9;16504:17;16495:6;16457:65;:::i;:::-;16319:210;;;;:::o;16535:313::-;16648:4;16686:2;16675:9;16671:18;16663:26;;16735:9;16729:4;16725:20;16721:1;16710:9;16706:17;16699:47;16763:78;16836:4;16827:6;16763:78;:::i;:::-;16755:86;;16535:313;;;;:::o;16854:419::-;17020:4;17058:2;17047:9;17043:18;17035:26;;17107:9;17101:4;17097:20;17093:1;17082:9;17078:17;17071:47;17135:131;17261:4;17135:131;:::i;:::-;17127:139;;16854:419;;;:::o;17279:::-;17445:4;17483:2;17472:9;17468:18;17460:26;;17532:9;17526:4;17522:20;17518:1;17507:9;17503:17;17496:47;17560:131;17686:4;17560:131;:::i;:::-;17552:139;;17279:419;;;:::o;17704:::-;17870:4;17908:2;17897:9;17893:18;17885:26;;17957:9;17951:4;17947:20;17943:1;17932:9;17928:17;17921:47;17985:131;18111:4;17985:131;:::i;:::-;17977:139;;17704:419;;;:::o;18129:::-;18295:4;18333:2;18322:9;18318:18;18310:26;;18382:9;18376:4;18372:20;18368:1;18357:9;18353:17;18346:47;18410:131;18536:4;18410:131;:::i;:::-;18402:139;;18129:419;;;:::o;18554:::-;18720:4;18758:2;18747:9;18743:18;18735:26;;18807:9;18801:4;18797:20;18793:1;18782:9;18778:17;18771:47;18835:131;18961:4;18835:131;:::i;:::-;18827:139;;18554:419;;;:::o;18979:::-;19145:4;19183:2;19172:9;19168:18;19160:26;;19232:9;19226:4;19222:20;19218:1;19207:9;19203:17;19196:47;19260:131;19386:4;19260:131;:::i;:::-;19252:139;;18979:419;;;:::o;19404:::-;19570:4;19608:2;19597:9;19593:18;19585:26;;19657:9;19651:4;19647:20;19643:1;19632:9;19628:17;19621:47;19685:131;19811:4;19685:131;:::i;:::-;19677:139;;19404:419;;;:::o;19829:::-;19995:4;20033:2;20022:9;20018:18;20010:26;;20082:9;20076:4;20072:20;20068:1;20057:9;20053:17;20046:47;20110:131;20236:4;20110:131;:::i;:::-;20102:139;;19829:419;;;:::o;20254:::-;20420:4;20458:2;20447:9;20443:18;20435:26;;20507:9;20501:4;20497:20;20493:1;20482:9;20478:17;20471:47;20535:131;20661:4;20535:131;:::i;:::-;20527:139;;20254:419;;;:::o;20679:::-;20845:4;20883:2;20872:9;20868:18;20860:26;;20932:9;20926:4;20922:20;20918:1;20907:9;20903:17;20896:47;20960:131;21086:4;20960:131;:::i;:::-;20952:139;;20679:419;;;:::o;21104:::-;21270:4;21308:2;21297:9;21293:18;21285:26;;21357:9;21351:4;21347:20;21343:1;21332:9;21328:17;21321:47;21385:131;21511:4;21385:131;:::i;:::-;21377:139;;21104:419;;;:::o;21529:::-;21695:4;21733:2;21722:9;21718:18;21710:26;;21782:9;21776:4;21772:20;21768:1;21757:9;21753:17;21746:47;21810:131;21936:4;21810:131;:::i;:::-;21802:139;;21529:419;;;:::o;21954:::-;22120:4;22158:2;22147:9;22143:18;22135:26;;22207:9;22201:4;22197:20;22193:1;22182:9;22178:17;22171:47;22235:131;22361:4;22235:131;:::i;:::-;22227:139;;21954:419;;;:::o;22379:::-;22545:4;22583:2;22572:9;22568:18;22560:26;;22632:9;22626:4;22622:20;22618:1;22607:9;22603:17;22596:47;22660:131;22786:4;22660:131;:::i;:::-;22652:139;;22379:419;;;:::o;22804:222::-;22897:4;22935:2;22924:9;22920:18;22912:26;;22948:71;23016:1;23005:9;23001:17;22992:6;22948:71;:::i;:::-;22804:222;;;;:::o;23032:129::-;23066:6;23093:20;;:::i;:::-;23083:30;;23122:33;23150:4;23142:6;23122:33;:::i;:::-;23032:129;;;:::o;23167:75::-;23200:6;23233:2;23227:9;23217:19;;23167:75;:::o;23248:307::-;23309:4;23399:18;23391:6;23388:30;23385:56;;;23421:18;;:::i;:::-;23385:56;23459:29;23481:6;23459:29;:::i;:::-;23451:37;;23543:4;23537;23533:15;23525:23;;23248:307;;;:::o;23561:308::-;23623:4;23713:18;23705:6;23702:30;23699:56;;;23735:18;;:::i;:::-;23699:56;23773:29;23795:6;23773:29;:::i;:::-;23765:37;;23857:4;23851;23847:15;23839:23;;23561:308;;;:::o;23875:98::-;23926:6;23960:5;23954:12;23944:22;;23875:98;;;:::o;23979:99::-;24031:6;24065:5;24059:12;24049:22;;23979:99;;;:::o;24084:168::-;24167:11;24201:6;24196:3;24189:19;24241:4;24236:3;24232:14;24217:29;;24084:168;;;;:::o;24258:169::-;24342:11;24376:6;24371:3;24364:19;24416:4;24411:3;24407:14;24392:29;;24258:169;;;;:::o;24433:148::-;24535:11;24572:3;24557:18;;24433:148;;;;:::o;24587:305::-;24627:3;24646:20;24664:1;24646:20;:::i;:::-;24641:25;;24680:20;24698:1;24680:20;:::i;:::-;24675:25;;24834:1;24766:66;24762:74;24759:1;24756:81;24753:107;;;24840:18;;:::i;:::-;24753:107;24884:1;24881;24877:9;24870:16;;24587:305;;;;:::o;24898:185::-;24938:1;24955:20;24973:1;24955:20;:::i;:::-;24950:25;;24989:20;25007:1;24989:20;:::i;:::-;24984:25;;25028:1;25018:35;;25033:18;;:::i;:::-;25018:35;25075:1;25072;25068:9;25063:14;;24898:185;;;;:::o;25089:191::-;25129:4;25149:20;25167:1;25149:20;:::i;:::-;25144:25;;25183:20;25201:1;25183:20;:::i;:::-;25178:25;;25222:1;25219;25216:8;25213:34;;;25227:18;;:::i;:::-;25213:34;25272:1;25269;25265:9;25257:17;;25089:191;;;;:::o;25286:96::-;25323:7;25352:24;25370:5;25352:24;:::i;:::-;25341:35;;25286:96;;;:::o;25388:90::-;25422:7;25465:5;25458:13;25451:21;25440:32;;25388:90;;;:::o;25484:149::-;25520:7;25560:66;25553:5;25549:78;25538:89;;25484:149;;;:::o;25639:126::-;25676:7;25716:42;25709:5;25705:54;25694:65;;25639:126;;;:::o;25771:77::-;25808:7;25837:5;25826:16;;25771:77;;;:::o;25854:154::-;25938:6;25933:3;25928;25915:30;26000:1;25991:6;25986:3;25982:16;25975:27;25854:154;;;:::o;26014:307::-;26082:1;26092:113;26106:6;26103:1;26100:13;26092:113;;;26191:1;26186:3;26182:11;26176:18;26172:1;26167:3;26163:11;26156:39;26128:2;26125:1;26121:10;26116:15;;26092:113;;;26223:6;26220:1;26217:13;26214:101;;;26303:1;26294:6;26289:3;26285:16;26278:27;26214:101;26063:258;26014:307;;;:::o;26327:320::-;26371:6;26408:1;26402:4;26398:12;26388:22;;26455:1;26449:4;26445:12;26476:18;26466:81;;26532:4;26524:6;26520:17;26510:27;;26466:81;26594:2;26586:6;26583:14;26563:18;26560:38;26557:84;;;26613:18;;:::i;:::-;26557:84;26378:269;26327:320;;;:::o;26653:281::-;26736:27;26758:4;26736:27;:::i;:::-;26728:6;26724:40;26866:6;26854:10;26851:22;26830:18;26818:10;26815:34;26812:62;26809:88;;;26877:18;;:::i;:::-;26809:88;26917:10;26913:2;26906:22;26696:238;26653:281;;:::o;26940:233::-;26979:3;27002:24;27020:5;27002:24;:::i;:::-;26993:33;;27048:66;27041:5;27038:77;27035:103;;;27118:18;;:::i;:::-;27035:103;27165:1;27158:5;27154:13;27147:20;;26940:233;;;:::o;27179:176::-;27211:1;27228:20;27246:1;27228:20;:::i;:::-;27223:25;;27262:20;27280:1;27262:20;:::i;:::-;27257:25;;27301:1;27291:35;;27306:18;;:::i;:::-;27291:35;27347:1;27344;27340:9;27335:14;;27179:176;;;;:::o;27361:180::-;27409:77;27406:1;27399:88;27506:4;27503:1;27496:15;27530:4;27527:1;27520:15;27547:180;27595:77;27592:1;27585:88;27692:4;27689:1;27682:15;27716:4;27713:1;27706:15;27733:180;27781:77;27778:1;27771:88;27878:4;27875:1;27868:15;27902:4;27899:1;27892:15;27919:180;27967:77;27964:1;27957:88;28064:4;28061:1;28054:15;28088:4;28085:1;28078:15;28105:180;28153:77;28150:1;28143:88;28250:4;28247:1;28240:15;28274:4;28271:1;28264:15;28291:117;28400:1;28397;28390:12;28414:117;28523:1;28520;28513:12;28537:117;28646:1;28643;28636:12;28660:117;28769:1;28766;28759:12;28783:117;28892:1;28889;28882:12;28906:117;29015:1;29012;29005:12;29029:102;29070:6;29121:2;29117:7;29112:2;29105:5;29101:14;29097:28;29087:38;;29029:102;;;:::o;29137:237::-;29277:34;29273:1;29265:6;29261:14;29254:58;29346:20;29341:2;29333:6;29329:15;29322:45;29137:237;:::o;29380:225::-;29520:34;29516:1;29508:6;29504:14;29497:58;29589:8;29584:2;29576:6;29572:15;29565:33;29380:225;:::o;29611:224::-;29751:34;29747:1;29739:6;29735:14;29728:58;29820:7;29815:2;29807:6;29803:15;29796:32;29611:224;:::o;29841:178::-;29981:30;29977:1;29969:6;29965:14;29958:54;29841:178;:::o;30025:223::-;30165:34;30161:1;30153:6;30149:14;30142:58;30234:6;30229:2;30221:6;30217:15;30210:31;30025:223;:::o;30254:175::-;30394:27;30390:1;30382:6;30378:14;30371:51;30254:175;:::o;30435:228::-;30575:34;30571:1;30563:6;30559:14;30552:58;30644:11;30639:2;30631:6;30627:15;30620:36;30435:228;:::o;30669:249::-;30809:34;30805:1;30797:6;30793:14;30786:58;30878:32;30873:2;30865:6;30861:15;30854:57;30669:249;:::o;30924:182::-;31064:34;31060:1;31052:6;31048:14;31041:58;30924:182;:::o;31112:::-;31252:34;31248:1;31240:6;31236:14;31229:58;31112:182;:::o;31300:174::-;31440:26;31436:1;31428:6;31424:14;31417:50;31300:174;:::o;31480:220::-;31620:34;31616:1;31608:6;31604:14;31597:58;31689:3;31684:2;31676:6;31672:15;31665:28;31480:220;:::o;31706:175::-;31846:27;31842:1;31834:6;31830:14;31823:51;31706:175;:::o;31887:233::-;32027:34;32023:1;32015:6;32011:14;32004:58;32096:16;32091:2;32083:6;32079:15;32072:41;31887:233;:::o;32126:122::-;32199:24;32217:5;32199:24;:::i;:::-;32192:5;32189:35;32179:63;;32238:1;32235;32228:12;32179:63;32126:122;:::o;32254:116::-;32324:21;32339:5;32324:21;:::i;:::-;32317:5;32314:32;32304:60;;32360:1;32357;32350:12;32304:60;32254:116;:::o;32376:120::-;32448:23;32465:5;32448:23;:::i;:::-;32441:5;32438:34;32428:62;;32486:1;32483;32476:12;32428:62;32376:120;:::o;32502:122::-;32575:24;32593:5;32575:24;:::i;:::-;32568:5;32565:35;32555:63;;32614:1;32611;32604:12;32555:63;32502:122;:::o

Swarm Source

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