ETH Price: $2,385.88 (-1.17%)

Token

Charity Socks (SOCKS)
 

Overview

Max Total Supply

373 SOCKS

Holders

129

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
ydsa.eth
Balance
3 SOCKS
0x5c9ce53738967e4d422f0f6914d5be496f9edd2b
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

100% of Basic Needs: SOCKS! revenue goes directly to 503c charities, non-profits, and shelters across the US.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Socks

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-12-08
*/

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


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

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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


// OpenZeppelin Contracts v4.4.0 (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.0 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;


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

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


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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

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

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


// OpenZeppelin Contracts v4.4.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 Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

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

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

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

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

// File: contracts/Socks.sol

pragma solidity ^0.8.7;






// interfaces for ENS resolving
interface ENS {
    function resolver(bytes32 node) external view returns (Resolver);
}

interface Resolver {
    function addr(bytes32 node) external view returns (address);
}

contract Socks is ERC721, Ownable, ReentrancyGuard {

    using Strings for uint256;
    using Address for address;

    uint256 public constant PRICE = 0.01 ether; // price is 0.01 ether.
    uint256 public constant MAX_SUPPLY = 2500;
    uint256 public constant WHITELIST_SUPPLY = 1500;

    // this is the ENS name hash of "socks.basicneeds.eth"
    bytes32 public immutable namehash;

    // keeps track of the current total supply.
    uint256 public totalSupply;
    // the max supply - set after
    uint256 public maxSupply = MAX_SUPPLY;

    // the base uri for the token
    string public baseURI;

    // the citizen contract
    address private _citizenContract;

    uint private _whitelistMinted;

    bool public revealed = false;
       
    // the ens service
    ENS private ens = ENS(0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e);

    enum MintState {
        PUBLIC,
        WHITELIST,
        CLOSED
    }

    // the state of whether minting is allowed.
    MintState private mintingState = MintState.CLOSED;

    constructor(bytes32 _namehash) ERC721("Charity Socks", "SOCKS") {
        namehash = _namehash;
    }

    // owner can only reveal socks, they cannot
    function reveal() external onlyOwner {
        revealed = true;
    }

    function setCitizenContract(address addr) external onlyOwner {
        require(addr.isContract(), "address isn't a contract.");
        _citizenContract = addr;
    }

    function setBaseURI(string calldata _uri) external onlyOwner {
        baseURI = _uri;
    }

    function tokenURI(uint256 tokenId)
        public
        view
        override
        returns (string memory)
    {
        require(
            _exists(tokenId),
            "ERC721Metadata: URI query for nonexistent token"
        );

        // double ternary op because i like to watch the wolrd burn
        return revealed ? (bytes(baseURI).length > 0
                ? string(abi.encodePacked(baseURI, tokenId.toString(), ".json"))
                : "") : string(abi.encodePacked(baseURI));
    }

    modifier mintOpen() {
        require(mintingState != MintState.CLOSED, "minting not active.");
        _;
    }

    modifier whitelistOnly() {
        require(mintingState == MintState.WHITELIST);
        _;
    }

    function ownerMint(uint256 amount) external onlyOwner {
        // ensure minting the amount entered would not mint over the max supply
        require(
            totalSupply + amount < uint256(maxSupply),
            "mint amount would be out of range."
        );

        for (uint256 i = totalSupply; i < totalSupply + amount; ++i) {
            _safeMint(_msgSender(), i + 1);
        }

        totalSupply += amount;
    }

    function mint(uint256 amount) external payable nonReentrant mintOpen {
        if (mintingState == MintState.WHITELIST) {
            require(
                ERC721(_citizenContract).balanceOf(_msgSender()) >= 1,
                "not a citizen!"
            );
            require(_whitelistMinted < 1500, "whitelist sold out!");
        }
        // ensure minting the amount entered would not mint over the max supply
        require(
            totalSupply + amount < uint256(maxSupply),
            "mint amount would be out of range."
        );
        // ensure enough ether was sent - don't allow for overpayment
        require(msg.value == amount * PRICE, "not enough ether sent");
        _mint(amount, mintingState == MintState.WHITELIST);
    }

    function _mint(uint256 amount, bool whitelisted) private {
        Resolver resolver = ens.resolver(namehash);
        
        // send the ether received to the deposit address
        require(payable(resolver.addr(namehash)).send(msg.value), "transfer failed");

        for (uint256 i = totalSupply; i < totalSupply + amount; ++i) {
            _safeMint(_msgSender(), i + 1);
        }

        totalSupply += amount;

        if (whitelisted) {
            _whitelistMinted += amount;
        }
    }

    // toggles the state of mint
    function setMintingState(MintState state) external onlyOwner {
        mintingState = state;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"bytes32","name":"_namehash","type":"bytes32"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WHITELIST_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"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":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"namehash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"setCitizenContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum Socks.MintState","name":"state","type":"uint8"}],"name":"setMintingState","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"}]

60a06040526109c4600955600d80546001600160b01b031916750200000000000c2e074ec69a0dfb2997ba6c7d2e1e001790553480156200003f57600080fd5b5060405162002540380380620025408339810160408190526200006291620001f1565b604080518082018252600d81526c4368617269747920536f636b7360981b602080830191825283518085019094526005845264534f434b5360d81b908401528151919291620000b4916000916200014b565b508051620000ca9060019060208401906200014b565b505050620000e7620000e1620000f560201b60201c565b620000f9565b600160075560805262000248565b3390565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b82805462000159906200020b565b90600052602060002090601f0160209004810192826200017d5760008555620001c8565b82601f106200019857805160ff1916838001178555620001c8565b82800160010185558215620001c8579182015b82811115620001c8578251825591602001919060010190620001ab565b50620001d6929150620001da565b5090565b5b80821115620001d65760008155600101620001db565b6000602082840312156200020457600080fd5b5051919050565b600181811c908216806200022057607f821691505b602082108114156200024257634e487b7160e01b600052602260045260246000fd5b50919050565b6080516122ce62000272600039600081816104220152818161146e015261150c01526122ce6000f3fe6080604052600436106101cd5760003560e01c806382b1168d116100f7578063a475b5dd11610095578063e985e9c511610064578063e985e9c5146104f7578063f19e75d414610540578063f2fde38b14610560578063fd52bd761461058057600080fd5b8063a475b5dd1461048c578063b88d4fde146104a1578063c87b56dd146104c1578063d5abeb01146104e157600080fd5b806391a08a48116100d157806391a08a481461041057806395d89b4114610444578063a0712d6814610459578063a22cb4651461046c57600080fd5b806382b1168d146103b75780638d859f3e146103d75780638da5cb5b146103f257600080fd5b806342842e0e1161016f5780636c0360eb1161013e5780636c0360eb146103575780636e56539b1461036c57806370a0823114610382578063715018a6146103a257600080fd5b806342842e0e146102dd57806351830227146102fd57806355f804b3146103175780636352211e1461033757600080fd5b8063095ea7b3116101ab578063095ea7b31461026157806318160ddd1461028357806323b872dd146102a757806332cb6b0c146102c757600080fd5b806301ffc9a7146101d257806306fdde0314610207578063081812fc14610229575b600080fd5b3480156101de57600080fd5b506101f26101ed366004611d97565b6105a0565b60405190151581526020015b60405180910390f35b34801561021357600080fd5b5061021c6105f2565b6040516101fe9190611fda565b34801561023557600080fd5b50610249610244366004611e64565b610684565b6040516001600160a01b0390911681526020016101fe565b34801561026d57600080fd5b5061028161027c366004611d6b565b61071e565b005b34801561028f57600080fd5b5061029960085481565b6040519081526020016101fe565b3480156102b357600080fd5b506102816102c2366004611c17565b610834565b3480156102d357600080fd5b506102996109c481565b3480156102e957600080fd5b506102816102f8366004611c17565b610865565b34801561030957600080fd5b50600d546101f29060ff1681565b34801561032357600080fd5b50610281610332366004611df2565b610880565b34801561034357600080fd5b50610249610352366004611e64565b6108b6565b34801561036357600080fd5b5061021c61092d565b34801561037857600080fd5b506102996105dc81565b34801561038e57600080fd5b5061029961039d366004611b9d565b6109bb565b3480156103ae57600080fd5b50610281610a42565b3480156103c357600080fd5b506102816103d2366004611b9d565b610a78565b3480156103e357600080fd5b50610299662386f26fc1000081565b3480156103fe57600080fd5b506006546001600160a01b0316610249565b34801561041c57600080fd5b506102997f000000000000000000000000000000000000000000000000000000000000000081565b34801561045057600080fd5b5061021c610b1b565b610281610467366004611e64565b610b2a565b34801561047857600080fd5b50610281610487366004611d38565b610dd7565b34801561049857600080fd5b50610281610de6565b3480156104ad57600080fd5b506102816104bc366004611c58565b610e1f565b3480156104cd57600080fd5b5061021c6104dc366004611e64565b610e57565b3480156104ed57600080fd5b5061029960095481565b34801561050357600080fd5b506101f2610512366004611bde565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561054c57600080fd5b5061028161055b366004611e64565b610f62565b34801561056c57600080fd5b5061028161057b366004611b9d565b611013565b34801561058c57600080fd5b5061028161059b366004611dd1565b6110ae565b60006001600160e01b031982166380ac58cd60e01b14806105d157506001600160e01b03198216635b5e139f60e01b145b806105ec57506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606000805461060190612195565b80601f016020809104026020016040519081016040528092919081815260200182805461062d90612195565b801561067a5780601f1061064f5761010080835404028352916020019161067a565b820191906000526020600020905b81548152906001019060200180831161065d57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166107025760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610729826108b6565b9050806001600160a01b0316836001600160a01b031614156107975760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016106f9565b336001600160a01b03821614806107b357506107b38133610512565b6108255760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016106f9565b61082f8383611105565b505050565b61083e3382611173565b61085a5760405162461bcd60e51b81526004016106f9906120b6565b61082f83838361126a565b61082f83838360405180602001604052806000815250610e1f565b6006546001600160a01b031633146108aa5760405162461bcd60e51b81526004016106f990612081565b61082f600a8383611b04565b6000818152600260205260408120546001600160a01b0316806105ec5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016106f9565b600a805461093a90612195565b80601f016020809104026020016040519081016040528092919081815260200182805461096690612195565b80156109b35780601f10610988576101008083540402835291602001916109b3565b820191906000526020600020905b81548152906001019060200180831161099657829003601f168201915b505050505081565b60006001600160a01b038216610a265760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016106f9565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b03163314610a6c5760405162461bcd60e51b81526004016106f990612081565b610a76600061140a565b565b6006546001600160a01b03163314610aa25760405162461bcd60e51b81526004016106f990612081565b6001600160a01b0381163b610af95760405162461bcd60e51b815260206004820152601960248201527f616464726573732069736e2774206120636f6e74726163742e0000000000000060448201526064016106f9565b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b60606001805461060190612195565b60026007541415610b7d5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016106f9565b60026007819055600d54600160a81b900460ff166002811115610ba257610ba261222b565b1415610be65760405162461bcd60e51b815260206004820152601360248201527236b4b73a34b733903737ba1030b1ba34bb329760691b60448201526064016106f9565b6001600d54600160a81b900460ff166002811115610c0657610c0661222b565b1415610d2057600b546001906001600160a01b03166370a08231336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160206040518083038186803b158015610c6057600080fd5b505afa158015610c74573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c989190611e7d565b1015610cd75760405162461bcd60e51b815260206004820152600e60248201526d6e6f74206120636974697a656e2160901b60448201526064016106f9565b6105dc600c5410610d205760405162461bcd60e51b815260206004820152601360248201527277686974656c69737420736f6c64206f75742160681b60448201526064016106f9565b60095481600854610d319190612107565b10610d4e5760405162461bcd60e51b81526004016106f990611fed565b610d5f662386f26fc1000082612133565b3414610da55760405162461bcd60e51b81526020600482015260156024820152741b9bdd08195b9bdd59da08195d1a195c881cd95b9d605a1b60448201526064016106f9565b610dcf816001600d54600160a81b900460ff166002811115610dc957610dc961222b565b1461145c565b506001600755565b610de2338383611668565b5050565b6006546001600160a01b03163314610e105760405162461bcd60e51b81526004016106f990612081565b600d805460ff19166001179055565b610e293383611173565b610e455760405162461bcd60e51b81526004016106f9906120b6565b610e5184848484611737565b50505050565b6000818152600260205260409020546060906001600160a01b0316610ed65760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016106f9565b600d5460ff16610f0657600a604051602001610ef29190611f5c565b6040516020818303038152906040526105ec565b6000600a8054610f1590612195565b905011610f3157604051806020016040528060008152506105ec565b600a610f3c8361176a565b604051602001610f4d929190611f68565b60405160208183030381529060405292915050565b6006546001600160a01b03163314610f8c5760405162461bcd60e51b81526004016106f990612081565b60095481600854610f9d9190612107565b10610fba5760405162461bcd60e51b81526004016106f990611fed565b6008545b81600854610fcc9190612107565b811015610ff857610fe8335b610fe3836001612107565b611868565b610ff1816121d0565b9050610fbe565b50806008600082825461100b9190612107565b909155505050565b6006546001600160a01b0316331461103d5760405162461bcd60e51b81526004016106f990612081565b6001600160a01b0381166110a25760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106f9565b6110ab8161140a565b50565b6006546001600160a01b031633146110d85760405162461bcd60e51b81526004016106f990612081565b600d805482919060ff60a81b1916600160a81b8360028111156110fd576110fd61222b565b021790555050565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061113a826108b6565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166111ec5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016106f9565b60006111f7836108b6565b9050806001600160a01b0316846001600160a01b031614806112325750836001600160a01b031661122784610684565b6001600160a01b0316145b8061126257506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661127d826108b6565b6001600160a01b0316146112e55760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016106f9565b6001600160a01b0382166113475760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016106f9565b611352600082611105565b6001600160a01b038316600090815260036020526040812080546001929061137b908490612152565b90915550506001600160a01b03821660009081526003602052604081208054600192906113a9908490612107565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600d54604051630178b8bf60e01b81527f0000000000000000000000000000000000000000000000000000000000000000600482015260009161010090046001600160a01b031690630178b8bf9060240160206040518083038186803b1580156114c557600080fd5b505afa1580156114d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114fd9190611bc1565b604051631d9dabef60e11b81527f000000000000000000000000000000000000000000000000000000000000000060048201529091506001600160a01b03821690633b3b57de9060240160206040518083038186803b15801561155f57600080fd5b505afa158015611573573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115979190611bc1565b6001600160a01b03166108fc349081150290604051600060405180830381858888f193505050506115fc5760405162461bcd60e51b815260206004820152600f60248201526e1d1c985b9cd9995c8819985a5b1959608a1b60448201526064016106f9565b6008545b8360085461160e9190612107565b81101561162e5761161e33610fd8565b611627816121d0565b9050611600565b5082600860008282546116419190612107565b9091555050811561082f5782600c600082825461165e9190612107565b9091555050505050565b816001600160a01b0316836001600160a01b031614156116ca5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016106f9565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61174284848461126a565b61174e84848484611882565b610e515760405162461bcd60e51b81526004016106f99061202f565b60608161178e5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156117b857806117a2816121d0565b91506117b19050600a8361211f565b9150611792565b60008167ffffffffffffffff8111156117d3576117d3612257565b6040519080825280601f01601f1916602001820160405280156117fd576020820181803683370190505b5090505b841561126257611812600183612152565b915061181f600a866121eb565b61182a906030612107565b60f81b81838151811061183f5761183f612241565b60200101906001600160f81b031916908160001a905350611861600a8661211f565b9450611801565b610de282826040518060200160405280600081525061198f565b60006001600160a01b0384163b1561198457604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906118c6903390899088908890600401611f9d565b602060405180830381600087803b1580156118e057600080fd5b505af1925050508015611910575060408051601f3d908101601f1916820190925261190d91810190611db4565b60015b61196a573d80801561193e576040519150601f19603f3d011682016040523d82523d6000602084013e611943565b606091505b5080516119625760405162461bcd60e51b81526004016106f99061202f565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611262565b506001949350505050565b61199983836119c2565b6119a66000848484611882565b61082f5760405162461bcd60e51b81526004016106f99061202f565b6001600160a01b038216611a185760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016106f9565b6000818152600260205260409020546001600160a01b031615611a7d5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016106f9565b6001600160a01b0382166000908152600360205260408120805460019290611aa6908490612107565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b828054611b1090612195565b90600052602060002090601f016020900481019282611b325760008555611b78565b82601f10611b4b5782800160ff19823516178555611b78565b82800160010185558215611b78579182015b82811115611b78578235825591602001919060010190611b5d565b50611b84929150611b88565b5090565b5b80821115611b845760008155600101611b89565b600060208284031215611baf57600080fd5b8135611bba8161226d565b9392505050565b600060208284031215611bd357600080fd5b8151611bba8161226d565b60008060408385031215611bf157600080fd5b8235611bfc8161226d565b91506020830135611c0c8161226d565b809150509250929050565b600080600060608486031215611c2c57600080fd5b8335611c378161226d565b92506020840135611c478161226d565b929592945050506040919091013590565b60008060008060808587031215611c6e57600080fd5b8435611c798161226d565b93506020850135611c898161226d565b925060408501359150606085013567ffffffffffffffff80821115611cad57600080fd5b818701915087601f830112611cc157600080fd5b813581811115611cd357611cd3612257565b604051601f8201601f19908116603f01168101908382118183101715611cfb57611cfb612257565b816040528281528a6020848701011115611d1457600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b60008060408385031215611d4b57600080fd5b8235611d568161226d565b915060208301358015158114611c0c57600080fd5b60008060408385031215611d7e57600080fd5b8235611d898161226d565b946020939093013593505050565b600060208284031215611da957600080fd5b8135611bba81612282565b600060208284031215611dc657600080fd5b8151611bba81612282565b600060208284031215611de357600080fd5b813560038110611bba57600080fd5b60008060208385031215611e0557600080fd5b823567ffffffffffffffff80821115611e1d57600080fd5b818501915085601f830112611e3157600080fd5b813581811115611e4057600080fd5b866020828501011115611e5257600080fd5b60209290920196919550909350505050565b600060208284031215611e7657600080fd5b5035919050565b600060208284031215611e8f57600080fd5b5051919050565b60008151808452611eae816020860160208601612169565b601f01601f19169290920160200192915050565b8054600090600181811c9080831680611edc57607f831692505b6020808410821415611efe57634e487b7160e01b600052602260045260246000fd5b818015611f125760018114611f2357611f50565b60ff19861689528489019650611f50565b60008881526020902060005b86811015611f485781548b820152908501908301611f2f565b505084890196505b50505050505092915050565b6000611bba8284611ec2565b6000611f748285611ec2565b8351611f84818360208801612169565b64173539b7b760d91b9101908152600501949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611fd090830184611e96565b9695505050505050565b602081526000611bba6020830184611e96565b60208082526022908201527f6d696e7420616d6f756e7420776f756c64206265206f7574206f662072616e67604082015261329760f11b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6000821982111561211a5761211a6121ff565b500190565b60008261212e5761212e612215565b500490565b600081600019048311821515161561214d5761214d6121ff565b500290565b600082821015612164576121646121ff565b500390565b60005b8381101561218457818101518382015260200161216c565b83811115610e515750506000910152565b600181811c908216806121a957607f821691505b602082108114156121ca57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156121e4576121e46121ff565b5060010190565b6000826121fa576121fa612215565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146110ab57600080fd5b6001600160e01b0319811681146110ab57600080fdfea2646970667358221220457888f7745f956b659dc29cba288b9951da4f2cacbef244ac65788045b673b664736f6c63430008070033957ba7aed537afeb774262b453c7da782e4d721bd5f5caa3c022631eaf878a4c

Deployed Bytecode

0x6080604052600436106101cd5760003560e01c806382b1168d116100f7578063a475b5dd11610095578063e985e9c511610064578063e985e9c5146104f7578063f19e75d414610540578063f2fde38b14610560578063fd52bd761461058057600080fd5b8063a475b5dd1461048c578063b88d4fde146104a1578063c87b56dd146104c1578063d5abeb01146104e157600080fd5b806391a08a48116100d157806391a08a481461041057806395d89b4114610444578063a0712d6814610459578063a22cb4651461046c57600080fd5b806382b1168d146103b75780638d859f3e146103d75780638da5cb5b146103f257600080fd5b806342842e0e1161016f5780636c0360eb1161013e5780636c0360eb146103575780636e56539b1461036c57806370a0823114610382578063715018a6146103a257600080fd5b806342842e0e146102dd57806351830227146102fd57806355f804b3146103175780636352211e1461033757600080fd5b8063095ea7b3116101ab578063095ea7b31461026157806318160ddd1461028357806323b872dd146102a757806332cb6b0c146102c757600080fd5b806301ffc9a7146101d257806306fdde0314610207578063081812fc14610229575b600080fd5b3480156101de57600080fd5b506101f26101ed366004611d97565b6105a0565b60405190151581526020015b60405180910390f35b34801561021357600080fd5b5061021c6105f2565b6040516101fe9190611fda565b34801561023557600080fd5b50610249610244366004611e64565b610684565b6040516001600160a01b0390911681526020016101fe565b34801561026d57600080fd5b5061028161027c366004611d6b565b61071e565b005b34801561028f57600080fd5b5061029960085481565b6040519081526020016101fe565b3480156102b357600080fd5b506102816102c2366004611c17565b610834565b3480156102d357600080fd5b506102996109c481565b3480156102e957600080fd5b506102816102f8366004611c17565b610865565b34801561030957600080fd5b50600d546101f29060ff1681565b34801561032357600080fd5b50610281610332366004611df2565b610880565b34801561034357600080fd5b50610249610352366004611e64565b6108b6565b34801561036357600080fd5b5061021c61092d565b34801561037857600080fd5b506102996105dc81565b34801561038e57600080fd5b5061029961039d366004611b9d565b6109bb565b3480156103ae57600080fd5b50610281610a42565b3480156103c357600080fd5b506102816103d2366004611b9d565b610a78565b3480156103e357600080fd5b50610299662386f26fc1000081565b3480156103fe57600080fd5b506006546001600160a01b0316610249565b34801561041c57600080fd5b506102997f957ba7aed537afeb774262b453c7da782e4d721bd5f5caa3c022631eaf878a4c81565b34801561045057600080fd5b5061021c610b1b565b610281610467366004611e64565b610b2a565b34801561047857600080fd5b50610281610487366004611d38565b610dd7565b34801561049857600080fd5b50610281610de6565b3480156104ad57600080fd5b506102816104bc366004611c58565b610e1f565b3480156104cd57600080fd5b5061021c6104dc366004611e64565b610e57565b3480156104ed57600080fd5b5061029960095481565b34801561050357600080fd5b506101f2610512366004611bde565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561054c57600080fd5b5061028161055b366004611e64565b610f62565b34801561056c57600080fd5b5061028161057b366004611b9d565b611013565b34801561058c57600080fd5b5061028161059b366004611dd1565b6110ae565b60006001600160e01b031982166380ac58cd60e01b14806105d157506001600160e01b03198216635b5e139f60e01b145b806105ec57506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606000805461060190612195565b80601f016020809104026020016040519081016040528092919081815260200182805461062d90612195565b801561067a5780601f1061064f5761010080835404028352916020019161067a565b820191906000526020600020905b81548152906001019060200180831161065d57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166107025760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610729826108b6565b9050806001600160a01b0316836001600160a01b031614156107975760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016106f9565b336001600160a01b03821614806107b357506107b38133610512565b6108255760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016106f9565b61082f8383611105565b505050565b61083e3382611173565b61085a5760405162461bcd60e51b81526004016106f9906120b6565b61082f83838361126a565b61082f83838360405180602001604052806000815250610e1f565b6006546001600160a01b031633146108aa5760405162461bcd60e51b81526004016106f990612081565b61082f600a8383611b04565b6000818152600260205260408120546001600160a01b0316806105ec5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016106f9565b600a805461093a90612195565b80601f016020809104026020016040519081016040528092919081815260200182805461096690612195565b80156109b35780601f10610988576101008083540402835291602001916109b3565b820191906000526020600020905b81548152906001019060200180831161099657829003601f168201915b505050505081565b60006001600160a01b038216610a265760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016106f9565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b03163314610a6c5760405162461bcd60e51b81526004016106f990612081565b610a76600061140a565b565b6006546001600160a01b03163314610aa25760405162461bcd60e51b81526004016106f990612081565b6001600160a01b0381163b610af95760405162461bcd60e51b815260206004820152601960248201527f616464726573732069736e2774206120636f6e74726163742e0000000000000060448201526064016106f9565b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b60606001805461060190612195565b60026007541415610b7d5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016106f9565b60026007819055600d54600160a81b900460ff166002811115610ba257610ba261222b565b1415610be65760405162461bcd60e51b815260206004820152601360248201527236b4b73a34b733903737ba1030b1ba34bb329760691b60448201526064016106f9565b6001600d54600160a81b900460ff166002811115610c0657610c0661222b565b1415610d2057600b546001906001600160a01b03166370a08231336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160206040518083038186803b158015610c6057600080fd5b505afa158015610c74573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c989190611e7d565b1015610cd75760405162461bcd60e51b815260206004820152600e60248201526d6e6f74206120636974697a656e2160901b60448201526064016106f9565b6105dc600c5410610d205760405162461bcd60e51b815260206004820152601360248201527277686974656c69737420736f6c64206f75742160681b60448201526064016106f9565b60095481600854610d319190612107565b10610d4e5760405162461bcd60e51b81526004016106f990611fed565b610d5f662386f26fc1000082612133565b3414610da55760405162461bcd60e51b81526020600482015260156024820152741b9bdd08195b9bdd59da08195d1a195c881cd95b9d605a1b60448201526064016106f9565b610dcf816001600d54600160a81b900460ff166002811115610dc957610dc961222b565b1461145c565b506001600755565b610de2338383611668565b5050565b6006546001600160a01b03163314610e105760405162461bcd60e51b81526004016106f990612081565b600d805460ff19166001179055565b610e293383611173565b610e455760405162461bcd60e51b81526004016106f9906120b6565b610e5184848484611737565b50505050565b6000818152600260205260409020546060906001600160a01b0316610ed65760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016106f9565b600d5460ff16610f0657600a604051602001610ef29190611f5c565b6040516020818303038152906040526105ec565b6000600a8054610f1590612195565b905011610f3157604051806020016040528060008152506105ec565b600a610f3c8361176a565b604051602001610f4d929190611f68565b60405160208183030381529060405292915050565b6006546001600160a01b03163314610f8c5760405162461bcd60e51b81526004016106f990612081565b60095481600854610f9d9190612107565b10610fba5760405162461bcd60e51b81526004016106f990611fed565b6008545b81600854610fcc9190612107565b811015610ff857610fe8335b610fe3836001612107565b611868565b610ff1816121d0565b9050610fbe565b50806008600082825461100b9190612107565b909155505050565b6006546001600160a01b0316331461103d5760405162461bcd60e51b81526004016106f990612081565b6001600160a01b0381166110a25760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106f9565b6110ab8161140a565b50565b6006546001600160a01b031633146110d85760405162461bcd60e51b81526004016106f990612081565b600d805482919060ff60a81b1916600160a81b8360028111156110fd576110fd61222b565b021790555050565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061113a826108b6565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166111ec5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016106f9565b60006111f7836108b6565b9050806001600160a01b0316846001600160a01b031614806112325750836001600160a01b031661122784610684565b6001600160a01b0316145b8061126257506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661127d826108b6565b6001600160a01b0316146112e55760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016106f9565b6001600160a01b0382166113475760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016106f9565b611352600082611105565b6001600160a01b038316600090815260036020526040812080546001929061137b908490612152565b90915550506001600160a01b03821660009081526003602052604081208054600192906113a9908490612107565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600d54604051630178b8bf60e01b81527f957ba7aed537afeb774262b453c7da782e4d721bd5f5caa3c022631eaf878a4c600482015260009161010090046001600160a01b031690630178b8bf9060240160206040518083038186803b1580156114c557600080fd5b505afa1580156114d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114fd9190611bc1565b604051631d9dabef60e11b81527f957ba7aed537afeb774262b453c7da782e4d721bd5f5caa3c022631eaf878a4c60048201529091506001600160a01b03821690633b3b57de9060240160206040518083038186803b15801561155f57600080fd5b505afa158015611573573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115979190611bc1565b6001600160a01b03166108fc349081150290604051600060405180830381858888f193505050506115fc5760405162461bcd60e51b815260206004820152600f60248201526e1d1c985b9cd9995c8819985a5b1959608a1b60448201526064016106f9565b6008545b8360085461160e9190612107565b81101561162e5761161e33610fd8565b611627816121d0565b9050611600565b5082600860008282546116419190612107565b9091555050811561082f5782600c600082825461165e9190612107565b9091555050505050565b816001600160a01b0316836001600160a01b031614156116ca5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016106f9565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61174284848461126a565b61174e84848484611882565b610e515760405162461bcd60e51b81526004016106f99061202f565b60608161178e5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156117b857806117a2816121d0565b91506117b19050600a8361211f565b9150611792565b60008167ffffffffffffffff8111156117d3576117d3612257565b6040519080825280601f01601f1916602001820160405280156117fd576020820181803683370190505b5090505b841561126257611812600183612152565b915061181f600a866121eb565b61182a906030612107565b60f81b81838151811061183f5761183f612241565b60200101906001600160f81b031916908160001a905350611861600a8661211f565b9450611801565b610de282826040518060200160405280600081525061198f565b60006001600160a01b0384163b1561198457604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906118c6903390899088908890600401611f9d565b602060405180830381600087803b1580156118e057600080fd5b505af1925050508015611910575060408051601f3d908101601f1916820190925261190d91810190611db4565b60015b61196a573d80801561193e576040519150601f19603f3d011682016040523d82523d6000602084013e611943565b606091505b5080516119625760405162461bcd60e51b81526004016106f99061202f565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611262565b506001949350505050565b61199983836119c2565b6119a66000848484611882565b61082f5760405162461bcd60e51b81526004016106f99061202f565b6001600160a01b038216611a185760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016106f9565b6000818152600260205260409020546001600160a01b031615611a7d5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016106f9565b6001600160a01b0382166000908152600360205260408120805460019290611aa6908490612107565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b828054611b1090612195565b90600052602060002090601f016020900481019282611b325760008555611b78565b82601f10611b4b5782800160ff19823516178555611b78565b82800160010185558215611b78579182015b82811115611b78578235825591602001919060010190611b5d565b50611b84929150611b88565b5090565b5b80821115611b845760008155600101611b89565b600060208284031215611baf57600080fd5b8135611bba8161226d565b9392505050565b600060208284031215611bd357600080fd5b8151611bba8161226d565b60008060408385031215611bf157600080fd5b8235611bfc8161226d565b91506020830135611c0c8161226d565b809150509250929050565b600080600060608486031215611c2c57600080fd5b8335611c378161226d565b92506020840135611c478161226d565b929592945050506040919091013590565b60008060008060808587031215611c6e57600080fd5b8435611c798161226d565b93506020850135611c898161226d565b925060408501359150606085013567ffffffffffffffff80821115611cad57600080fd5b818701915087601f830112611cc157600080fd5b813581811115611cd357611cd3612257565b604051601f8201601f19908116603f01168101908382118183101715611cfb57611cfb612257565b816040528281528a6020848701011115611d1457600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b60008060408385031215611d4b57600080fd5b8235611d568161226d565b915060208301358015158114611c0c57600080fd5b60008060408385031215611d7e57600080fd5b8235611d898161226d565b946020939093013593505050565b600060208284031215611da957600080fd5b8135611bba81612282565b600060208284031215611dc657600080fd5b8151611bba81612282565b600060208284031215611de357600080fd5b813560038110611bba57600080fd5b60008060208385031215611e0557600080fd5b823567ffffffffffffffff80821115611e1d57600080fd5b818501915085601f830112611e3157600080fd5b813581811115611e4057600080fd5b866020828501011115611e5257600080fd5b60209290920196919550909350505050565b600060208284031215611e7657600080fd5b5035919050565b600060208284031215611e8f57600080fd5b5051919050565b60008151808452611eae816020860160208601612169565b601f01601f19169290920160200192915050565b8054600090600181811c9080831680611edc57607f831692505b6020808410821415611efe57634e487b7160e01b600052602260045260246000fd5b818015611f125760018114611f2357611f50565b60ff19861689528489019650611f50565b60008881526020902060005b86811015611f485781548b820152908501908301611f2f565b505084890196505b50505050505092915050565b6000611bba8284611ec2565b6000611f748285611ec2565b8351611f84818360208801612169565b64173539b7b760d91b9101908152600501949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611fd090830184611e96565b9695505050505050565b602081526000611bba6020830184611e96565b60208082526022908201527f6d696e7420616d6f756e7420776f756c64206265206f7574206f662072616e67604082015261329760f11b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6000821982111561211a5761211a6121ff565b500190565b60008261212e5761212e612215565b500490565b600081600019048311821515161561214d5761214d6121ff565b500290565b600082821015612164576121646121ff565b500390565b60005b8381101561218457818101518382015260200161216c565b83811115610e515750506000910152565b600181811c908216806121a957607f821691505b602082108114156121ca57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156121e4576121e46121ff565b5060010190565b6000826121fa576121fa612215565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146110ab57600080fd5b6001600160e01b0319811681146110ab57600080fdfea2646970667358221220457888f7745f956b659dc29cba288b9951da4f2cacbef244ac65788045b673b664736f6c63430008070033

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

957ba7aed537afeb774262b453c7da782e4d721bd5f5caa3c022631eaf878a4c

-----Decoded View---------------
Arg [0] : _namehash (bytes32): 0x957ba7aed537afeb774262b453c7da782e4d721bd5f5caa3c022631eaf878a4c

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 957ba7aed537afeb774262b453c7da782e4d721bd5f5caa3c022631eaf878a4c


Deployed Bytecode Sourcemap

39229:4250:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23971:305;;;;;;;;;;-1:-1:-1;23971:305:0;;;;;:::i;:::-;;:::i;:::-;;;8267:14:1;;8260:22;8242:41;;8230:2;8215:18;23971:305:0;;;;;;;;24916:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;26475:221::-;;;;;;;;;;-1:-1:-1;26475:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;7565:32:1;;;7547:51;;7535:2;7520:18;26475:221:0;7401:203:1;25998:411:0;;;;;;;;;;-1:-1:-1;25998:411:0;;;;;:::i;:::-;;:::i;:::-;;39683:26;;;;;;;;;;;;;;;;;;;8440:25:1;;;8428:2;8413:18;39683:26:0;8294:177:1;27225:339:0;;;;;;;;;;-1:-1:-1;27225:339:0;;;;;:::i;:::-;;:::i;39428:41::-;;;;;;;;;;;;39465:4;39428:41;;27635:185;;;;;;;;;;-1:-1:-1;27635:185:0;;;;;:::i;:::-;;:::i;39970:28::-;;;;;;;;;;-1:-1:-1;39970:28:0;;;;;;;;40719:94;;;;;;;;;;-1:-1:-1;40719:94:0;;;;;:::i;:::-;;:::i;24610:239::-;;;;;;;;;;-1:-1:-1;24610:239:0;;;;;:::i;:::-;;:::i;39832:21::-;;;;;;;;;;;;;:::i;39476:47::-;;;;;;;;;;;;39519:4;39476:47;;24340:208;;;;;;;;;;-1:-1:-1;24340:208:0;;;;;:::i;:::-;;:::i;38124:103::-;;;;;;;;;;;;;:::i;40542:169::-;;;;;;;;;;-1:-1:-1;40542:169:0;;;;;:::i;:::-;;:::i;39355:42::-;;;;;;;;;;;;39387:10;39355:42;;37473:87;;;;;;;;;;-1:-1:-1;37546:6:0;;-1:-1:-1;;;;;37546:6:0;37473:87;;39592:33;;;;;;;;;;;;;;;25085:104;;;;;;;;;;;;;:::i;42031:775::-;;;;;;:::i;:::-;;:::i;26768:155::-;;;;;;;;;;-1:-1:-1;26768:155:0;;;;;:::i;:::-;;:::i;40463:71::-;;;;;;;;;;;;;:::i;27891:328::-;;;;;;;;;;-1:-1:-1;27891:328:0;;;;;:::i;:::-;;:::i;40821:520::-;;;;;;;;;;-1:-1:-1;40821:520:0;;;;;:::i;:::-;;:::i;39751:37::-;;;;;;;;;;;;;;;;26994:164;;;;;;;;;;-1:-1:-1;26994:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;27115:25:0;;;27091:4;27115:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;26994:164;41580:443;;;;;;;;;;-1:-1:-1;41580:443:0;;;;;:::i;:::-;;:::i;38382:201::-;;;;;;;;;;-1:-1:-1;38382:201:0;;;;;:::i;:::-;;:::i;43376:100::-;;;;;;;;;;-1:-1:-1;43376:100:0;;;;;:::i;:::-;;:::i;23971:305::-;24073:4;-1:-1:-1;;;;;;24110:40:0;;-1:-1:-1;;;24110:40:0;;:105;;-1:-1:-1;;;;;;;24167:48:0;;-1:-1:-1;;;24167:48:0;24110:105;:158;;;-1:-1:-1;;;;;;;;;;15956:40:0;;;24232:36;24090:178;23971:305;-1:-1:-1;;23971:305:0:o;24916:100::-;24970:13;25003:5;24996:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24916:100;:::o;26475:221::-;26551:7;29818:16;;;:7;:16;;;;;;-1:-1:-1;;;;;29818:16:0;26571:73;;;;-1:-1:-1;;;26571:73:0;;14312:2:1;26571:73:0;;;14294:21:1;14351:2;14331:18;;;14324:30;14390:34;14370:18;;;14363:62;-1:-1:-1;;;14441:18:1;;;14434:42;14493:19;;26571:73:0;;;;;;;;;-1:-1:-1;26664:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;26664:24:0;;26475:221::o;25998:411::-;26079:13;26095:23;26110:7;26095:14;:23::i;:::-;26079:39;;26143:5;-1:-1:-1;;;;;26137:11:0;:2;-1:-1:-1;;;;;26137:11:0;;;26129:57;;;;-1:-1:-1;;;26129:57:0;;16262:2:1;26129:57:0;;;16244:21:1;16301:2;16281:18;;;16274:30;16340:34;16320:18;;;16313:62;-1:-1:-1;;;16391:18:1;;;16384:31;16432:19;;26129:57:0;16060:397:1;26129:57:0;22445:10;-1:-1:-1;;;;;26221:21:0;;;;:62;;-1:-1:-1;26246:37:0;26263:5;22445:10;26994:164;:::i;26246:37::-;26199:168;;;;-1:-1:-1;;;26199:168:0;;12351:2:1;26199:168:0;;;12333:21:1;12390:2;12370:18;;;12363:30;12429:34;12409:18;;;12402:62;12500:26;12480:18;;;12473:54;12544:19;;26199:168:0;12149:420:1;26199:168:0;26380:21;26389:2;26393:7;26380:8;:21::i;:::-;26068:341;25998:411;;:::o;27225:339::-;27420:41;22445:10;27453:7;27420:18;:41::i;:::-;27412:103;;;;-1:-1:-1;;;27412:103:0;;;;;;;:::i;:::-;27528:28;27538:4;27544:2;27548:7;27528:9;:28::i;27635:185::-;27773:39;27790:4;27796:2;27800:7;27773:39;;;;;;;;;;;;:16;:39::i;40719:94::-;37546:6;;-1:-1:-1;;;;;37546:6:0;22445:10;37693:23;37685:68;;;;-1:-1:-1;;;37685:68:0;;;;;;;:::i;:::-;40791:14:::1;:7;40801:4:::0;;40791:14:::1;:::i;24610:239::-:0;24682:7;24718:16;;;:7;:16;;;;;;-1:-1:-1;;;;;24718:16:0;24753:19;24745:73;;;;-1:-1:-1;;;24745:73:0;;13541:2:1;24745:73:0;;;13523:21:1;13580:2;13560:18;;;13553:30;13619:34;13599:18;;;13592:62;-1:-1:-1;;;13670:18:1;;;13663:39;13719:19;;24745:73:0;13339:405:1;39832:21:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;24340:208::-;24412:7;-1:-1:-1;;;;;24440:19:0;;24432:74;;;;-1:-1:-1;;;24432:74:0;;13130:2:1;24432:74:0;;;13112:21:1;13169:2;13149:18;;;13142:30;13208:34;13188:18;;;13181:62;-1:-1:-1;;;13259:18:1;;;13252:40;13309:19;;24432:74:0;12928:406:1;24432:74:0;-1:-1:-1;;;;;;24524:16:0;;;;;:9;:16;;;;;;;24340:208::o;38124:103::-;37546:6;;-1:-1:-1;;;;;37546:6:0;22445:10;37693:23;37685:68;;;;-1:-1:-1;;;37685:68:0;;;;;;;:::i;:::-;38189:30:::1;38216:1;38189:18;:30::i;:::-;38124:103::o:0;40542:169::-;37546:6;;-1:-1:-1;;;;;37546:6:0;22445:10;37693:23;37685:68;;;;-1:-1:-1;;;37685:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;40622:15:0;::::1;6026:20:::0;40614:55:::1;;;::::0;-1:-1:-1;;;40614:55:0;;12776:2:1;40614:55:0::1;::::0;::::1;12758:21:1::0;12815:2;12795:18;;;12788:30;12854:27;12834:18;;;12827:55;12899:18;;40614:55:0::1;12574:349:1::0;40614:55:0::1;40680:16;:23:::0;;-1:-1:-1;;;;;;40680:23:0::1;-1:-1:-1::0;;;;;40680:23:0;;;::::1;::::0;;;::::1;::::0;;40542:169::o;25085:104::-;25141:13;25174:7;25167:14;;;;;:::i;42031:775::-;1812:1;2410:7;;:19;;2402:63;;;;-1:-1:-1;;;2402:63:0;;17774:2:1;2402:63:0;;;17756:21:1;17813:2;17793:18;;;17786:30;17852:33;17832:18;;;17825:61;17903:18;;2402:63:0;17572:355:1;2402:63:0;1812:1;2543:7;:18;;;41388:12:::1;::::0;-1:-1:-1;;;41388:12:0;::::1;;;:32;::::0;::::1;;;;;;:::i;:::-;;;41380:64;;;::::0;-1:-1:-1;;;41380:64:0;;17082:2:1;41380:64:0::1;::::0;::::1;17064:21:1::0;17121:2;17101:18;;;17094:30;-1:-1:-1;;;17140:18:1;;;17133:49;17199:18;;41380:64:0::1;16880:343:1::0;41380:64:0::1;42131:19:::2;42115:12;::::0;-1:-1:-1;;;42115:12:0;::::2;;;:35;::::0;::::2;;;;;;:::i;:::-;;42111:267;;;42200:16;::::0;42245:1:::2;::::0;-1:-1:-1;;;;;42200:16:0::2;42193:34;22445:10:::0;42193:48:::2;::::0;-1:-1:-1;;;;;;42193:48:0::2;::::0;;;;;;-1:-1:-1;;;;;7565:32:1;;;42193:48:0::2;::::0;::::2;7547:51:1::0;7520:18;;42193:48:0::2;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:53;;42167:129;;;::::0;-1:-1:-1;;;42167:129:0;;10836:2:1;42167:129:0::2;::::0;::::2;10818:21:1::0;10875:2;10855:18;;;10848:30;-1:-1:-1;;;10894:18:1;;;10887:44;10948:18;;42167:129:0::2;10634:338:1::0;42167:129:0::2;42338:4;42319:16;;:23;42311:55;;;::::0;-1:-1:-1;;;42311:55:0;;9305:2:1;42311:55:0::2;::::0;::::2;9287:21:1::0;9344:2;9324:18;;;9317:30;-1:-1:-1;;;9363:18:1;;;9356:49;9422:18;;42311:55:0::2;9103:343:1::0;42311:55:0::2;42522:9;;42505:6;42491:11;;:20;;;;:::i;:::-;:41;42469:125;;;;-1:-1:-1::0;;;42469:125:0::2;;;;;;;:::i;:::-;42697:14;39387:10;42697:6:::0;:14:::2;:::i;:::-;42684:9;:27;42676:61;;;::::0;-1:-1:-1;;;42676:61:0;;15496:2:1;42676:61:0::2;::::0;::::2;15478:21:1::0;15535:2;15515:18;;;15508:30;-1:-1:-1;;;15554:18:1;;;15547:51;15615:18;;42676:61:0::2;15294:345:1::0;42676:61:0::2;42748:50;42754:6:::0;42778:19:::2;42762:12;::::0;-1:-1:-1;;;42762:12:0;::::2;;;:35;::::0;::::2;;;;;;:::i;:::-;;42748:5;:50::i;:::-;-1:-1:-1::0;1768:1:0;2722:7;:22;42031:775::o;26768:155::-;26863:52;22445:10;26896:8;26906;26863:18;:52::i;:::-;26768:155;;:::o;40463:71::-;37546:6;;-1:-1:-1;;;;;37546:6:0;22445:10;37693:23;37685:68;;;;-1:-1:-1;;;37685:68:0;;;;;;;:::i;:::-;40511:8:::1;:15:::0;;-1:-1:-1;;40511:15:0::1;40522:4;40511:15;::::0;;40463:71::o;27891:328::-;28066:41;22445:10;28099:7;28066:18;:41::i;:::-;28058:103;;;;-1:-1:-1;;;28058:103:0;;;;;;;:::i;:::-;28172:39;28186:4;28192:2;28196:7;28205:5;28172:13;:39::i;:::-;27891:328;;;;:::o;40821:520::-;29794:4;29818:16;;;:7;:16;;;;;;40922:13;;-1:-1:-1;;;;;29818:16:0;40953:113;;;;-1:-1:-1;;;40953:113:0;;15846:2:1;40953:113:0;;;15828:21:1;15885:2;15865:18;;;15858:30;15924:34;15904:18;;;15897:62;-1:-1:-1;;;15975:18:1;;;15968:45;16030:19;;40953:113:0;15644:411:1;40953:113:0;41155:8;;;;:178;;41324:7;41307:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;41155:178;;;41191:1;41173:7;41167:21;;;;;:::i;:::-;;;:25;:129;;;;;;;;;;;;;;;;;41236:7;41245:18;:7;:16;:18::i;:::-;41219:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;41148:185;40821:520;-1:-1:-1;;40821:520:0:o;41580:443::-;37546:6;;-1:-1:-1;;;;;37546:6:0;22445:10;37693:23;37685:68;;;;-1:-1:-1;;;37685:68:0;;;;;;;:::i;:::-;41779:9:::1;;41762:6;41748:11;;:20;;;;:::i;:::-;:41;41726:125;;;;-1:-1:-1::0;;;41726:125:0::1;;;;;;;:::i;:::-;41881:11;::::0;41864:118:::1;41912:6;41898:11;;:20;;;;:::i;:::-;41894:1;:24;41864:118;;;41940:30;22445:10:::0;41950:12:::1;41964:5;:1:::0;41968::::1;41964:5;:::i;:::-;41940:9;:30::i;:::-;41920:3;::::0;::::1;:::i;:::-;;;41864:118;;;;42009:6;41994:11;;:21;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;41580:443:0:o;38382:201::-;37546:6;;-1:-1:-1;;;;;37546:6:0;22445:10;37693:23;37685:68;;;;-1:-1:-1;;;37685:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;38471:22:0;::::1;38463:73;;;::::0;-1:-1:-1;;;38463:73:0;;10072:2:1;38463:73:0::1;::::0;::::1;10054:21:1::0;10111:2;10091:18;;;10084:30;10150:34;10130:18;;;10123:62;-1:-1:-1;;;10201:18:1;;;10194:36;10247:19;;38463:73:0::1;9870:402:1::0;38463:73:0::1;38547:28;38566:8;38547:18;:28::i;:::-;38382:201:::0;:::o;43376:100::-;37546:6;;-1:-1:-1;;;;;37546:6:0;22445:10;37693:23;37685:68;;;;-1:-1:-1;;;37685:68:0;;;;;;;:::i;:::-;43448:12:::1;:20:::0;;43463:5;;43448:12;-1:-1:-1;;;;43448:20:0::1;-1:-1:-1::0;;;43463:5:0;43448:20:::1;::::0;::::1;;;;;;:::i;:::-;;;;;;43376:100:::0;:::o;33711:174::-;33786:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;33786:29:0;-1:-1:-1;;;;;33786:29:0;;;;;;;;:24;;33840:23;33786:24;33840:14;:23::i;:::-;-1:-1:-1;;;;;33831:46:0;;;;;;;;;;;33711:174;;:::o;30023:348::-;30116:4;29818:16;;;:7;:16;;;;;;-1:-1:-1;;;;;29818:16:0;30133:73;;;;-1:-1:-1;;;30133:73:0;;11938:2:1;30133:73:0;;;11920:21:1;11977:2;11957:18;;;11950:30;12016:34;11996:18;;;11989:62;-1:-1:-1;;;12067:18:1;;;12060:42;12119:19;;30133:73:0;11736:408:1;30133:73:0;30217:13;30233:23;30248:7;30233:14;:23::i;:::-;30217:39;;30286:5;-1:-1:-1;;;;;30275:16:0;:7;-1:-1:-1;;;;;30275:16:0;;:51;;;;30319:7;-1:-1:-1;;;;;30295:31:0;:20;30307:7;30295:11;:20::i;:::-;-1:-1:-1;;;;;30295:31:0;;30275:51;:87;;;-1:-1:-1;;;;;;27115:25:0;;;27091:4;27115:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;30330:32;30267:96;30023:348;-1:-1:-1;;;;30023:348:0:o;33015:578::-;33174:4;-1:-1:-1;;;;;33147:31:0;:23;33162:7;33147:14;:23::i;:::-;-1:-1:-1;;;;;33147:31:0;;33139:85;;;;-1:-1:-1;;;33139:85:0;;15086:2:1;33139:85:0;;;15068:21:1;15125:2;15105:18;;;15098:30;15164:34;15144:18;;;15137:62;-1:-1:-1;;;15215:18:1;;;15208:39;15264:19;;33139:85:0;14884:405:1;33139:85:0;-1:-1:-1;;;;;33243:16:0;;33235:65;;;;-1:-1:-1;;;33235:65:0;;11179:2:1;33235:65:0;;;11161:21:1;11218:2;11198:18;;;11191:30;11257:34;11237:18;;;11230:62;-1:-1:-1;;;11308:18:1;;;11301:34;11352:19;;33235:65:0;10977:400:1;33235:65:0;33417:29;33434:1;33438:7;33417:8;:29::i;:::-;-1:-1:-1;;;;;33459:15:0;;;;;;:9;:15;;;;;:20;;33478:1;;33459:15;:20;;33478:1;;33459:20;:::i;:::-;;;;-1:-1:-1;;;;;;;33490:13:0;;;;;;:9;:13;;;;;:18;;33507:1;;33490:13;:18;;33507:1;;33490:18;:::i;:::-;;;;-1:-1:-1;;33519:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;33519:21:0;-1:-1:-1;;;;;33519:21:0;;;;;;;;;33558:27;;33519:16;;33558:27;;;;;;;33015:578;;;:::o;38743:191::-;38836:6;;;-1:-1:-1;;;;;38853:17:0;;;-1:-1:-1;;;;;;38853:17:0;;;;;;;38886:40;;38836:6;;;38853:17;38836:6;;38886:40;;38817:16;;38886:40;38806:128;38743:191;:::o;42814:520::-;42902:3;;:22;;-1:-1:-1;;;42902:22:0;;42915:8;42902:22;;;8440:25:1;42882:17:0;;42902:3;;;-1:-1:-1;;;;;42902:3:0;;:12;;8413:18:1;;42902:22:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43020:23;;-1:-1:-1;;;43020:23:0;;43034:8;43020:23;;;8440:25:1;42882:42:0;;-1:-1:-1;;;;;;43020:13:0;;;;;8413:18:1;;43020:23:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;43012:37:0;:48;43050:9;43012:48;;;;;;;;;;;;;;;;;;;;;;;43004:76;;;;-1:-1:-1;;;43004:76:0;;17430:2:1;43004:76:0;;;17412:21:1;17469:2;17449:18;;;17442:30;-1:-1:-1;;;17488:18:1;;;17481:45;17543:18;;43004:76:0;17228:339:1;43004:76:0;43110:11;;43093:118;43141:6;43127:11;;:20;;;;:::i;:::-;43123:1;:24;43093:118;;;43169:30;22445:10;43179:12;22365:98;43169:30;43149:3;;;:::i;:::-;;;43093:118;;;;43238:6;43223:11;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;;43257:70:0;;;;43309:6;43289:16;;:26;;;;;;;:::i;:::-;;;;-1:-1:-1;;42871:463:0;42814:520;;:::o;34027:315::-;34182:8;-1:-1:-1;;;;;34173:17:0;:5;-1:-1:-1;;;;;34173:17:0;;;34165:55;;;;-1:-1:-1;;;34165:55:0;;11584:2:1;34165:55:0;;;11566:21:1;11623:2;11603:18;;;11596:30;11662:27;11642:18;;;11635:55;11707:18;;34165:55:0;11382:349:1;34165:55:0;-1:-1:-1;;;;;34231:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;34231:46:0;;;;;;;;;;34293:41;;8242::1;;;34293::0;;8215:18:1;34293:41:0;;;;;;;34027:315;;;:::o;29101:::-;29258:28;29268:4;29274:2;29278:7;29258:9;:28::i;:::-;29305:48;29328:4;29334:2;29338:7;29347:5;29305:22;:48::i;:::-;29297:111;;;;-1:-1:-1;;;29297:111:0;;;;;;;:::i;3124:723::-;3180:13;3401:10;3397:53;;-1:-1:-1;;3428:10:0;;;;;;;;;;;;-1:-1:-1;;;3428:10:0;;;;;3124:723::o;3397:53::-;3475:5;3460:12;3516:78;3523:9;;3516:78;;3549:8;;;;:::i;:::-;;-1:-1:-1;3572:10:0;;-1:-1:-1;3580:2:0;3572:10;;:::i;:::-;;;3516:78;;;3604:19;3636:6;3626:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3626:17:0;;3604:39;;3654:154;3661:10;;3654:154;;3688:11;3698:1;3688:11;;:::i;:::-;;-1:-1:-1;3757:10:0;3765:2;3757:5;:10;:::i;:::-;3744:24;;:2;:24;:::i;:::-;3731:39;;3714:6;3721;3714:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;3714:56:0;;;;;;;;-1:-1:-1;3785:11:0;3794:2;3785:11;;:::i;:::-;;;3654:154;;30713:110;30789:26;30799:2;30803:7;30789:26;;;;;;;;;;;;:9;:26::i;34907:799::-;35062:4;-1:-1:-1;;;;;35083:13:0;;6026:20;6074:8;35079:620;;35119:72;;-1:-1:-1;;;35119:72:0;;-1:-1:-1;;;;;35119:36:0;;;;;:72;;22445:10;;35170:4;;35176:7;;35185:5;;35119:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35119:72:0;;;;;;;;-1:-1:-1;;35119:72:0;;;;;;;;;;;;:::i;:::-;;;35115:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35361:13:0;;35357:272;;35404:60;;-1:-1:-1;;;35404:60:0;;;;;;;:::i;35357:272::-;35579:6;35573:13;35564:6;35560:2;35556:15;35549:38;35115:529;-1:-1:-1;;;;;;35242:51:0;-1:-1:-1;;;35242:51:0;;-1:-1:-1;35235:58:0;;35079:620;-1:-1:-1;35683:4:0;34907:799;;;;;;:::o;31050:321::-;31180:18;31186:2;31190:7;31180:5;:18::i;:::-;31231:54;31262:1;31266:2;31270:7;31279:5;31231:22;:54::i;:::-;31209:154;;;;-1:-1:-1;;;31209:154:0;;;;;;;:::i;31707:382::-;-1:-1:-1;;;;;31787:16:0;;31779:61;;;;-1:-1:-1;;;31779:61:0;;13951:2:1;31779:61:0;;;13933:21:1;;;13970:18;;;13963:30;14029:34;14009:18;;;14002:62;14081:18;;31779:61:0;13749:356:1;31779:61:0;29794:4;29818:16;;;:7;:16;;;;;;-1:-1:-1;;;;;29818:16:0;:30;31851:58;;;;-1:-1:-1;;;31851:58:0;;10479:2:1;31851:58:0;;;10461:21:1;10518:2;10498:18;;;10491:30;10557;10537:18;;;10530:58;10605:18;;31851:58:0;10277:352:1;31851:58:0;-1:-1:-1;;;;;31980:13:0;;;;;;:9;:13;;;;;:18;;31997:1;;31980:13;:18;;31997:1;;31980:18;:::i;:::-;;;;-1:-1:-1;;32009:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;32009:21:0;-1:-1:-1;;;;;32009:21:0;;;;;;;;32048:33;;32009:16;;;32048:33;;32009:16;;32048:33;31707:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:247:1;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;181:9;168:23;200:31;225:5;200:31;:::i;:::-;250:5;14:247;-1:-1:-1;;;14:247:1:o;266:251::-;336:6;389:2;377:9;368:7;364:23;360:32;357:52;;;405:1;402;395:12;357:52;437:9;431:16;456:31;481:5;456:31;:::i;522:388::-;590:6;598;651:2;639:9;630:7;626:23;622:32;619:52;;;667:1;664;657:12;619:52;706:9;693:23;725:31;750:5;725:31;:::i;:::-;775:5;-1:-1:-1;832:2:1;817:18;;804:32;845:33;804:32;845:33;:::i;:::-;897:7;887:17;;;522:388;;;;;:::o;915:456::-;992:6;1000;1008;1061:2;1049:9;1040:7;1036:23;1032:32;1029:52;;;1077:1;1074;1067:12;1029:52;1116:9;1103:23;1135:31;1160:5;1135:31;:::i;:::-;1185:5;-1:-1:-1;1242:2:1;1227:18;;1214:32;1255:33;1214:32;1255:33;:::i;:::-;915:456;;1307:7;;-1:-1:-1;;;1361:2:1;1346:18;;;;1333:32;;915:456::o;1376:1266::-;1471:6;1479;1487;1495;1548:3;1536:9;1527:7;1523:23;1519:33;1516:53;;;1565:1;1562;1555:12;1516:53;1604:9;1591:23;1623:31;1648:5;1623:31;:::i;:::-;1673:5;-1:-1:-1;1730:2:1;1715:18;;1702:32;1743:33;1702:32;1743:33;:::i;:::-;1795:7;-1:-1:-1;1849:2:1;1834:18;;1821:32;;-1:-1:-1;1904:2:1;1889:18;;1876:32;1927:18;1957:14;;;1954:34;;;1984:1;1981;1974:12;1954:34;2022:6;2011:9;2007:22;1997:32;;2067:7;2060:4;2056:2;2052:13;2048:27;2038:55;;2089:1;2086;2079:12;2038:55;2125:2;2112:16;2147:2;2143;2140:10;2137:36;;;2153:18;;:::i;:::-;2228:2;2222:9;2196:2;2282:13;;-1:-1:-1;;2278:22:1;;;2302:2;2274:31;2270:40;2258:53;;;2326:18;;;2346:22;;;2323:46;2320:72;;;2372:18;;:::i;:::-;2412:10;2408:2;2401:22;2447:2;2439:6;2432:18;2487:7;2482:2;2477;2473;2469:11;2465:20;2462:33;2459:53;;;2508:1;2505;2498:12;2459:53;2564:2;2559;2555;2551:11;2546:2;2538:6;2534:15;2521:46;2609:1;2604:2;2599;2591:6;2587:15;2583:24;2576:35;2630:6;2620:16;;;;;;;1376:1266;;;;;;;:::o;2647:416::-;2712:6;2720;2773:2;2761:9;2752:7;2748:23;2744:32;2741:52;;;2789:1;2786;2779:12;2741:52;2828:9;2815:23;2847:31;2872:5;2847:31;:::i;:::-;2897:5;-1:-1:-1;2954:2:1;2939:18;;2926:32;2996:15;;2989:23;2977:36;;2967:64;;3027:1;3024;3017:12;3068:315;3136:6;3144;3197:2;3185:9;3176:7;3172:23;3168:32;3165:52;;;3213:1;3210;3203:12;3165:52;3252:9;3239:23;3271:31;3296:5;3271:31;:::i;:::-;3321:5;3373:2;3358:18;;;;3345:32;;-1:-1:-1;;;3068:315:1:o;3388:245::-;3446:6;3499:2;3487:9;3478:7;3474:23;3470:32;3467:52;;;3515:1;3512;3505:12;3467:52;3554:9;3541:23;3573:30;3597:5;3573:30;:::i;3638:249::-;3707:6;3760:2;3748:9;3739:7;3735:23;3731:32;3728:52;;;3776:1;3773;3766:12;3728:52;3808:9;3802:16;3827:30;3851:5;3827:30;:::i;4165:270::-;4238:6;4291:2;4279:9;4270:7;4266:23;4262:32;4259:52;;;4307:1;4304;4297:12;4259:52;4346:9;4333:23;4385:1;4378:5;4375:12;4365:40;;4401:1;4398;4391:12;4440:592;4511:6;4519;4572:2;4560:9;4551:7;4547:23;4543:32;4540:52;;;4588:1;4585;4578:12;4540:52;4628:9;4615:23;4657:18;4698:2;4690:6;4687:14;4684:34;;;4714:1;4711;4704:12;4684:34;4752:6;4741:9;4737:22;4727:32;;4797:7;4790:4;4786:2;4782:13;4778:27;4768:55;;4819:1;4816;4809:12;4768:55;4859:2;4846:16;4885:2;4877:6;4874:14;4871:34;;;4901:1;4898;4891:12;4871:34;4946:7;4941:2;4932:6;4928:2;4924:15;4920:24;4917:37;4914:57;;;4967:1;4964;4957:12;4914:57;4998:2;4990:11;;;;;5020:6;;-1:-1:-1;4440:592:1;;-1:-1:-1;;;;4440:592:1:o;5037:180::-;5096:6;5149:2;5137:9;5128:7;5124:23;5120:32;5117:52;;;5165:1;5162;5155:12;5117:52;-1:-1:-1;5188:23:1;;5037:180;-1:-1:-1;5037:180:1:o;5222:184::-;5292:6;5345:2;5333:9;5324:7;5320:23;5316:32;5313:52;;;5361:1;5358;5351:12;5313:52;-1:-1:-1;5384:16:1;;5222:184;-1:-1:-1;5222:184:1:o;5411:257::-;5452:3;5490:5;5484:12;5517:6;5512:3;5505:19;5533:63;5589:6;5582:4;5577:3;5573:14;5566:4;5559:5;5555:16;5533:63;:::i;:::-;5650:2;5629:15;-1:-1:-1;;5625:29:1;5616:39;;;;5657:4;5612:50;;5411:257;-1:-1:-1;;5411:257:1:o;5673:973::-;5758:12;;5723:3;;5813:1;5833:18;;;;5886;;;;5913:61;;5967:4;5959:6;5955:17;5945:27;;5913:61;5993:2;6041;6033:6;6030:14;6010:18;6007:38;6004:161;;;6087:10;6082:3;6078:20;6075:1;6068:31;6122:4;6119:1;6112:15;6150:4;6147:1;6140:15;6004:161;6181:18;6208:104;;;;6326:1;6321:319;;;;6174:466;;6208:104;-1:-1:-1;;6241:24:1;;6229:37;;6286:16;;;;-1:-1:-1;6208:104:1;;6321:319;18187:1;18180:14;;;18224:4;18211:18;;6415:1;6429:165;6443:6;6440:1;6437:13;6429:165;;;6521:14;;6508:11;;;6501:35;6564:16;;;;6458:10;;6429:165;;;6433:3;;6623:6;6618:3;6614:16;6607:23;;6174:466;;;;;;;5673:973;;;;:::o;6651:197::-;6779:3;6804:38;6838:3;6830:6;6804:38;:::i;6853:543::-;7130:3;7158:38;7192:3;7184:6;7158:38;:::i;:::-;7225:6;7219:13;7241:52;7286:6;7282:2;7275:4;7267:6;7263:17;7241:52;:::i;:::-;-1:-1:-1;;;7315:15:1;;7339:22;;;7388:1;7377:13;;6853:543;-1:-1:-1;;;;6853:543:1:o;7609:488::-;-1:-1:-1;;;;;7878:15:1;;;7860:34;;7930:15;;7925:2;7910:18;;7903:43;7977:2;7962:18;;7955:34;;;8025:3;8020:2;8005:18;;7998:31;;;7803:4;;8046:45;;8071:19;;8063:6;8046:45;:::i;:::-;8038:53;7609:488;-1:-1:-1;;;;;;7609:488:1:o;8476:219::-;8625:2;8614:9;8607:21;8588:4;8645:44;8685:2;8674:9;8670:18;8662:6;8645:44;:::i;8700:398::-;8902:2;8884:21;;;8941:2;8921:18;;;8914:30;8980:34;8975:2;8960:18;;8953:62;-1:-1:-1;;;9046:2:1;9031:18;;9024:32;9088:3;9073:19;;8700:398::o;9451:414::-;9653:2;9635:21;;;9692:2;9672:18;;;9665:30;9731:34;9726:2;9711:18;;9704:62;-1:-1:-1;;;9797:2:1;9782:18;;9775:48;9855:3;9840:19;;9451:414::o;14523:356::-;14725:2;14707:21;;;14744:18;;;14737:30;14803:34;14798:2;14783:18;;14776:62;14870:2;14855:18;;14523:356::o;16462:413::-;16664:2;16646:21;;;16703:2;16683:18;;;16676:30;16742:34;16737:2;16722:18;;16715:62;-1:-1:-1;;;16808:2:1;16793:18;;16786:47;16865:3;16850:19;;16462:413::o;18240:128::-;18280:3;18311:1;18307:6;18304:1;18301:13;18298:39;;;18317:18;;:::i;:::-;-1:-1:-1;18353:9:1;;18240:128::o;18373:120::-;18413:1;18439;18429:35;;18444:18;;:::i;:::-;-1:-1:-1;18478:9:1;;18373:120::o;18498:168::-;18538:7;18604:1;18600;18596:6;18592:14;18589:1;18586:21;18581:1;18574:9;18567:17;18563:45;18560:71;;;18611:18;;:::i;:::-;-1:-1:-1;18651:9:1;;18498:168::o;18671:125::-;18711:4;18739:1;18736;18733:8;18730:34;;;18744:18;;:::i;:::-;-1:-1:-1;18781:9:1;;18671:125::o;18801:258::-;18873:1;18883:113;18897:6;18894:1;18891:13;18883:113;;;18973:11;;;18967:18;18954:11;;;18947:39;18919:2;18912:10;18883:113;;;19014:6;19011:1;19008:13;19005:48;;;-1:-1:-1;;19049:1:1;19031:16;;19024:27;18801:258::o;19064:380::-;19143:1;19139:12;;;;19186;;;19207:61;;19261:4;19253:6;19249:17;19239:27;;19207:61;19314:2;19306:6;19303:14;19283:18;19280:38;19277:161;;;19360:10;19355:3;19351:20;19348:1;19341:31;19395:4;19392:1;19385:15;19423:4;19420:1;19413:15;19277:161;;19064:380;;;:::o;19449:135::-;19488:3;-1:-1:-1;;19509:17:1;;19506:43;;;19529:18;;:::i;:::-;-1:-1:-1;19576:1:1;19565:13;;19449:135::o;19589:112::-;19621:1;19647;19637:35;;19652:18;;:::i;:::-;-1:-1:-1;19686:9:1;;19589:112::o;19706:127::-;19767:10;19762:3;19758:20;19755:1;19748:31;19798:4;19795:1;19788:15;19822:4;19819:1;19812:15;19838:127;19899:10;19894:3;19890:20;19887:1;19880:31;19930:4;19927:1;19920:15;19954:4;19951:1;19944:15;19970:127;20031:10;20026:3;20022:20;20019:1;20012:31;20062:4;20059:1;20052:15;20086:4;20083:1;20076:15;20102:127;20163:10;20158:3;20154:20;20151:1;20144:31;20194:4;20191:1;20184:15;20218:4;20215:1;20208:15;20234:127;20295:10;20290:3;20286:20;20283:1;20276:31;20326:4;20323:1;20316:15;20350:4;20347:1;20340:15;20366:131;-1:-1:-1;;;;;20441:31:1;;20431:42;;20421:70;;20487:1;20484;20477:12;20502:131;-1:-1:-1;;;;;;20576:32:1;;20566:43;;20556:71;;20623:1;20620;20613:12

Swarm Source

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