ETH Price: $3,373.47 (+0.70%)
Gas: 9 Gwei

Token

FacelessNFT (FNFT)
 

Overview

Max Total Supply

155 FNFT

Holders

66

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
voronkov.eth
Balance
1 FNFT
0x01e7f16E17c50D070eb66787f25Ce3BE405d6038
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
FacelessNFT

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-09-14
*/

// SPDX-License-Identifier: MIT
pragma solidity 0.8.7;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler
 * now has built in overflow checking.
 */
library SafeMath {
  /**
   * @dev Returns the addition of two unsigned integers, with an overflow flag.
   *
   * _Available since v3.4._
   */
  function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
    unchecked {
      uint256 c = a + b;
      if (c < a) return (false, 0);
      return (true, c);
    }
  }

  /**
   * @dev Returns the substraction of two unsigned integers, with an overflow flag.
   *
   * _Available since v3.4._
   */
  function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
    unchecked {
      if (b > a) return (false, 0);
      return (true, a - b);
    }
  }

  /**
   * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
   *
   * _Available since v3.4._
   */
  function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
    unchecked {
      // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
      // benefit is lost if 'b' is also tested.
      // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
      if (a == 0) return (true, 0);
      uint256 c = a * b;
      if (c / a != b) return (false, 0);
      return (true, c);
    }
  }

  /**
   * @dev Returns the division of two unsigned integers, with a division by zero flag.
   *
   * _Available since v3.4._
   */
  function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
    unchecked {
      if (b == 0) return (false, 0);
      return (true, a / b);
    }
  }

  /**
   * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
   *
   * _Available since v3.4._
   */
  function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
    unchecked {
      if (b == 0) return (false, 0);
      return (true, a % b);
    }
  }

  /**
   * @dev Returns the addition of two unsigned integers, reverting on
   * overflow.
   *
   * Counterpart to Solidity's `+` operator.
   *
   * Requirements:
   *
   * - Addition cannot overflow.
   */
  function add(uint256 a, uint256 b) internal pure returns (uint256) {
    return a + b;
  }

  /**
   * @dev Returns the subtraction of two unsigned integers, reverting on
   * overflow (when the result is negative).
   *
   * Counterpart to Solidity's `-` operator.
   *
   * Requirements:
   *
   * - Subtraction cannot overflow.
   */
  function sub(uint256 a, uint256 b) internal pure returns (uint256) {
    return a - b;
  }

  /**
   * @dev Returns the multiplication of two unsigned integers, reverting on
   * overflow.
   *
   * Counterpart to Solidity's `*` operator.
   *
   * Requirements:
   *
   * - Multiplication cannot overflow.
   */
  function mul(uint256 a, uint256 b) internal pure returns (uint256) {
    return a * b;
  }

  /**
   * @dev Returns the integer division of two unsigned integers, reverting on
   * division by zero. The result is rounded towards zero.
   *
   * Counterpart to Solidity's `/` operator.
   *
   * Requirements:
   *
   * - The divisor cannot be zero.
   */
  function div(uint256 a, uint256 b) internal pure returns (uint256) {
    return a / b;
  }

  /**
   * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
   * reverting when dividing by zero.
   *
   * Counterpart to Solidity's `%` operator. This function uses a `revert`
   * opcode (which leaves remaining gas untouched) while Solidity uses an
   * invalid opcode to revert (consuming all remaining gas).
   *
   * Requirements:
   *
   * - The divisor cannot be zero.
   */
  function mod(uint256 a, uint256 b) internal pure returns (uint256) {
    return a % b;
  }

  /**
   * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
   * overflow (when the result is negative).
   *
   * CAUTION: This function is deprecated because it requires allocating memory for the error
   * message unnecessarily. For custom revert reasons use {trySub}.
   *
   * Counterpart to Solidity's `-` operator.
   *
   * Requirements:
   *
   * - Subtraction cannot overflow.
   */
  function sub(
    uint256 a,
    uint256 b,
    string memory errorMessage
  ) internal pure returns (uint256) {
    unchecked {
      require(b <= a, errorMessage);
      return a - b;
    }
  }

  /**
   * @dev Returns the integer division of two unsigned integers, reverting with custom message on
   * division by zero. The result is rounded towards zero.
   *
   * Counterpart to Solidity's `/` operator. Note: this function uses a
   * `revert` opcode (which leaves remaining gas untouched) while Solidity
   * uses an invalid opcode to revert (consuming all remaining gas).
   *
   * Requirements:
   *
   * - The divisor cannot be zero.
   */
  function div(
    uint256 a,
    uint256 b,
    string memory errorMessage
  ) internal pure returns (uint256) {
    unchecked {
      require(b > 0, errorMessage);
      return a / b;
    }
  }

  /**
   * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
   * reverting with custom message when dividing by zero.
   *
   * CAUTION: This function is deprecated because it requires allocating memory for the error
   * message unnecessarily. For custom revert reasons use {tryMod}.
   *
   * Counterpart to Solidity's `%` operator. This function uses a `revert`
   * opcode (which leaves remaining gas untouched) while Solidity uses an
   * invalid opcode to revert (consuming all remaining gas).
   *
   * Requirements:
   *
   * - The divisor cannot be zero.
   */
  function mod(
    uint256 a,
    uint256 b,
    string memory errorMessage
  ) internal pure returns (uint256) {
    unchecked {
      require(b > 0, errorMessage);
      return a % b;
    }
  }
}

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

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

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

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

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

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

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

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

/**
 * @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
  {
    require(operator != _msgSender(), "ERC721: approve to caller");

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

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

  /**
   * @dev See {IERC721-transferFrom}.
   */
  function transferFrom(
    address from,
    address to,
    uint256 tokenId
  ) public virtual override {
    //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 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 {}
}

contract ERC721Metadata is ERC721 {
  using Strings for uint256;

  // Base URI
  string private baseURI;

  constructor(
    string memory name_,
    string memory symbol_,
    string memory baseURI_
  ) ERC721(name_, symbol_) {
    baseURI = baseURI_;
  }

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

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

interface IFacelessNFT {
  function totalSupply() external view returns (uint256);

  function mint(address to, uint256 tokenId) external;
}

/**
 * Faceless NFT
 *
 * Only EOS avatars are allowed to change the name.
 */

contract FacelessNFT is ERC721Metadata, IFacelessNFT {
  using SafeMath for uint256;

  // The inital seller
  address public initialSeller;

  // Max supply of NFTs
  uint256 public constant MAX_NFT_SUPPLY = 1001;

  // Total supply of NFTs
  uint256 private _totalSupply;

  constructor(string memory baseURI_)
    ERC721Metadata("FacelessNFT", "FNFT", baseURI_)
  {}

  function setInitialSeller(address sellerAddress) external {
    require(initialSeller == address(0), "FacelessNFT: already authorized");
    initialSeller = sellerAddress;
  }

  function totalSupply() public view override returns (uint256) {
    return _totalSupply;
  }

  function mint(address to, uint256 tokenId) external override {
    require(msg.sender == initialSeller, "FacelessNFT: not authorized");
    require(totalSupply() < MAX_NFT_SUPPLY, "FacelessNFT: max supply reached");

    _totalSupply += 1;
    _mint(to, tokenId);
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"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":"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_NFT_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":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initialSeller","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":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"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":"address","name":"sellerAddress","type":"address"}],"name":"setInitialSeller","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"}]

60806040523480156200001157600080fd5b5060405162002f8238038062002f8283398181016040528101906200003791906200022b565b6040518060400160405280600b81526020017f466163656c6573734e46540000000000000000000000000000000000000000008152506040518060400160405280600481526020017f464e4654000000000000000000000000000000000000000000000000000000008152508282828160009080519060200190620000be929190620000fd565b508060019080519060200190620000d7929190620000fd565b5050508060069080519060200190620000f2929190620000fd565b505050505062000400565b8280546200010b9062000311565b90600052602060002090601f0160209004810192826200012f57600085556200017b565b82601f106200014a57805160ff19168380011785556200017b565b828001600101855582156200017b579182015b828111156200017a5782518255916020019190600101906200015d565b5b5090506200018a91906200018e565b5090565b5b80821115620001a95760008160009055506001016200018f565b5090565b6000620001c4620001be84620002a5565b6200027c565b905082815260208101848484011115620001e357620001e2620003e0565b5b620001f0848285620002db565b509392505050565b600082601f83011262000210576200020f620003db565b5b815162000222848260208601620001ad565b91505092915050565b600060208284031215620002445762000243620003ea565b5b600082015167ffffffffffffffff811115620002655762000264620003e5565b5b6200027384828501620001f8565b91505092915050565b6000620002886200029b565b905062000296828262000347565b919050565b6000604051905090565b600067ffffffffffffffff821115620002c357620002c2620003ac565b5b620002ce82620003ef565b9050602081019050919050565b60005b83811015620002fb578082015181840152602081019050620002de565b838111156200030b576000848401525b50505050565b600060028204905060018216806200032a57607f821691505b602082108114156200034157620003406200037d565b5b50919050565b6200035282620003ef565b810181811067ffffffffffffffff82111715620003745762000373620003ac565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b612b7280620004106000396000f3fe608060405234801561001057600080fd5b50600436106101165760003560e01c80636352211e116100a2578063a22cb46511610071578063a22cb465146102df578063b5077f44146102fb578063b88d4fde14610319578063c87b56dd14610335578063e985e9c51461036557610116565b80636352211e1461024557806369963f6e1461027557806370a082311461029157806395d89b41146102c157610116565b806318160ddd116100e957806318160ddd146101b557806323b872dd146101d357806328a5d337146101ef57806340c10f191461020d57806342842e0e1461022957610116565b806301ffc9a71461011b57806306fdde031461014b578063081812fc14610169578063095ea7b314610199575b600080fd5b61013560048036038101906101309190611af6565b610395565b6040516101429190611fd8565b60405180910390f35b610153610477565b6040516101609190611ff3565b60405180910390f35b610183600480360381019061017e9190611b50565b610509565b6040516101909190611f71565b60405180910390f35b6101b360048036038101906101ae9190611ab6565b61058e565b005b6101bd6106a6565b6040516101ca9190612235565b60405180910390f35b6101ed60048036038101906101e891906119a0565b6106b0565b005b6101f7610710565b6040516102049190611f71565b60405180910390f35b61022760048036038101906102229190611ab6565b610736565b005b610243600480360381019061023e91906119a0565b610839565b005b61025f600480360381019061025a9190611b50565b610859565b60405161026c9190611f71565b60405180910390f35b61028f600480360381019061028a9190611933565b61090b565b005b6102ab60048036038101906102a69190611933565b6109e0565b6040516102b89190612235565b60405180910390f35b6102c9610a98565b6040516102d69190611ff3565b60405180910390f35b6102f960048036038101906102f49190611a76565b610b2a565b005b610303610cab565b6040516103109190612235565b60405180910390f35b610333600480360381019061032e91906119f3565b610cb1565b005b61034f600480360381019061034a9190611b50565b610d13565b60405161035c9190611ff3565b60405180910390f35b61037f600480360381019061037a9190611960565b610dbb565b60405161038c9190611fd8565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061046057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610470575061046f82610e4f565b5b9050919050565b6060600080546104869061246f565b80601f01602080910402602001604051908101604052809291908181526020018280546104b29061246f565b80156104ff5780601f106104d4576101008083540402835291602001916104ff565b820191906000526020600020905b8154815290600101906020018083116104e257829003601f168201915b5050505050905090565b600061051482610eb9565b610553576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161054a90612135565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061059982610859565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561060a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610601906121b5565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610629610f25565b73ffffffffffffffffffffffffffffffffffffffff161480610658575061065781610652610f25565b610dbb565b5b610697576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068e906120b5565b60405180910390fd5b6106a18383610f2d565b505050565b6000600854905090565b6106c16106bb610f25565b82610fe6565b610700576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106f7906121f5565b60405180910390fd5b61070b8383836110c4565b505050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146107c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107bd90612195565b60405180910390fd5b6103e96107d16106a6565b10610811576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610808906121d5565b60405180910390fd5b60016008600082825461082491906122fe565b925050819055506108358282611320565b5050565b61085483838360405180602001604052806000815250610cb1565b505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610902576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108f9906120f5565b60405180910390fd5b80915050919050565b600073ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461099c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099390612215565b60405180910390fd5b80600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610a51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a48906120d5565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b606060018054610aa79061246f565b80601f0160208091040260200160405190810160405280929190818152602001828054610ad39061246f565b8015610b205780601f10610af557610100808354040283529160200191610b20565b820191906000526020600020905b815481529060010190602001808311610b0357829003601f168201915b5050505050905090565b610b32610f25565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610ba0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9790612075565b60405180910390fd5b8060056000610bad610f25565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610c5a610f25565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610c9f9190611fd8565b60405180910390a35050565b6103e981565b610cc2610cbc610f25565b83610fe6565b610d01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf8906121f5565b60405180910390fd5b610d0d848484846114ee565b50505050565b6060610d1e82610eb9565b610d5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5490612175565b60405180910390fd5b600060068054610d6c9061246f565b905011610d885760405180602001604052806000815250610db4565b6006610d938361154a565b604051602001610da4929190611f42565b6040516020818303038152906040525b9050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16610fa083610859565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000610ff182610eb9565b611030576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102790612095565b60405180910390fd5b600061103b83610859565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806110aa57508373ffffffffffffffffffffffffffffffffffffffff1661109284610509565b73ffffffffffffffffffffffffffffffffffffffff16145b806110bb57506110ba8185610dbb565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166110e482610859565b73ffffffffffffffffffffffffffffffffffffffff161461113a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113190612155565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a190612055565b60405180910390fd5b6111b58383836116ab565b6111c0600082610f2d565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546112109190612385565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461126791906122fe565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611390576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138790612115565b60405180910390fd5b61139981610eb9565b156113d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d090612035565b60405180910390fd5b6113e5600083836116ab565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461143591906122fe565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6114f98484846110c4565b611505848484846116b0565b611544576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153b90612015565b60405180910390fd5b50505050565b60606000821415611592576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506116a6565b600082905060005b600082146115c45780806115ad906124d2565b915050600a826115bd9190612354565b915061159a565b60008167ffffffffffffffff8111156115e0576115df612608565b5b6040519080825280601f01601f1916602001820160405280156116125781602001600182028036833780820191505090505b5090505b6000851461169f5760018261162b9190612385565b9150600a8561163a919061251b565b603061164691906122fe565b60f81b81838151811061165c5761165b6125d9565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856116989190612354565b9450611616565b8093505050505b919050565b505050565b60006116d18473ffffffffffffffffffffffffffffffffffffffff16611847565b1561183a578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026116fa610f25565b8786866040518563ffffffff1660e01b815260040161171c9493929190611f8c565b602060405180830381600087803b15801561173657600080fd5b505af192505050801561176757506040513d601f19601f820116820180604052508101906117649190611b23565b60015b6117ea573d8060008114611797576040519150601f19603f3d011682016040523d82523d6000602084013e61179c565b606091505b506000815114156117e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d990612015565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061183f565b600190505b949350505050565b600080823b905060008111915050919050565b600061186d61186884612275565b612250565b9050828152602081018484840111156118895761188861263c565b5b61189484828561242d565b509392505050565b6000813590506118ab81612ae0565b92915050565b6000813590506118c081612af7565b92915050565b6000813590506118d581612b0e565b92915050565b6000815190506118ea81612b0e565b92915050565b600082601f83011261190557611904612637565b5b813561191584826020860161185a565b91505092915050565b60008135905061192d81612b25565b92915050565b60006020828403121561194957611948612646565b5b60006119578482850161189c565b91505092915050565b6000806040838503121561197757611976612646565b5b60006119858582860161189c565b92505060206119968582860161189c565b9150509250929050565b6000806000606084860312156119b9576119b8612646565b5b60006119c78682870161189c565b93505060206119d88682870161189c565b92505060406119e98682870161191e565b9150509250925092565b60008060008060808587031215611a0d57611a0c612646565b5b6000611a1b8782880161189c565b9450506020611a2c8782880161189c565b9350506040611a3d8782880161191e565b925050606085013567ffffffffffffffff811115611a5e57611a5d612641565b5b611a6a878288016118f0565b91505092959194509250565b60008060408385031215611a8d57611a8c612646565b5b6000611a9b8582860161189c565b9250506020611aac858286016118b1565b9150509250929050565b60008060408385031215611acd57611acc612646565b5b6000611adb8582860161189c565b9250506020611aec8582860161191e565b9150509250929050565b600060208284031215611b0c57611b0b612646565b5b6000611b1a848285016118c6565b91505092915050565b600060208284031215611b3957611b38612646565b5b6000611b47848285016118db565b91505092915050565b600060208284031215611b6657611b65612646565b5b6000611b748482850161191e565b91505092915050565b611b86816123b9565b82525050565b611b95816123cb565b82525050565b6000611ba6826122bb565b611bb081856122d1565b9350611bc081856020860161243c565b611bc98161264b565b840191505092915050565b6000611bdf826122c6565b611be981856122e2565b9350611bf981856020860161243c565b611c028161264b565b840191505092915050565b6000611c18826122c6565b611c2281856122f3565b9350611c3281856020860161243c565b80840191505092915050565b60008154611c4b8161246f565b611c5581866122f3565b94506001821660008114611c705760018114611c8157611cb4565b60ff19831686528186019350611cb4565b611c8a856122a6565b60005b83811015611cac57815481890152600182019150602081019050611c8d565b838801955050505b50505092915050565b6000611cca6032836122e2565b9150611cd58261265c565b604082019050919050565b6000611ced601c836122e2565b9150611cf8826126ab565b602082019050919050565b6000611d106024836122e2565b9150611d1b826126d4565b604082019050919050565b6000611d336019836122e2565b9150611d3e82612723565b602082019050919050565b6000611d56602c836122e2565b9150611d618261274c565b604082019050919050565b6000611d796038836122e2565b9150611d848261279b565b604082019050919050565b6000611d9c602a836122e2565b9150611da7826127ea565b604082019050919050565b6000611dbf6029836122e2565b9150611dca82612839565b604082019050919050565b6000611de26020836122e2565b9150611ded82612888565b602082019050919050565b6000611e05602c836122e2565b9150611e10826128b1565b604082019050919050565b6000611e286005836122f3565b9150611e3382612900565b600582019050919050565b6000611e4b6029836122e2565b9150611e5682612929565b604082019050919050565b6000611e6e602f836122e2565b9150611e7982612978565b604082019050919050565b6000611e91601b836122e2565b9150611e9c826129c7565b602082019050919050565b6000611eb46021836122e2565b9150611ebf826129f0565b604082019050919050565b6000611ed7601f836122e2565b9150611ee282612a3f565b602082019050919050565b6000611efa6031836122e2565b9150611f0582612a68565b604082019050919050565b6000611f1d601f836122e2565b9150611f2882612ab7565b602082019050919050565b611f3c81612423565b82525050565b6000611f4e8285611c3e565b9150611f5a8284611c0d565b9150611f6582611e1b565b91508190509392505050565b6000602082019050611f866000830184611b7d565b92915050565b6000608082019050611fa16000830187611b7d565b611fae6020830186611b7d565b611fbb6040830185611f33565b8181036060830152611fcd8184611b9b565b905095945050505050565b6000602082019050611fed6000830184611b8c565b92915050565b6000602082019050818103600083015261200d8184611bd4565b905092915050565b6000602082019050818103600083015261202e81611cbd565b9050919050565b6000602082019050818103600083015261204e81611ce0565b9050919050565b6000602082019050818103600083015261206e81611d03565b9050919050565b6000602082019050818103600083015261208e81611d26565b9050919050565b600060208201905081810360008301526120ae81611d49565b9050919050565b600060208201905081810360008301526120ce81611d6c565b9050919050565b600060208201905081810360008301526120ee81611d8f565b9050919050565b6000602082019050818103600083015261210e81611db2565b9050919050565b6000602082019050818103600083015261212e81611dd5565b9050919050565b6000602082019050818103600083015261214e81611df8565b9050919050565b6000602082019050818103600083015261216e81611e3e565b9050919050565b6000602082019050818103600083015261218e81611e61565b9050919050565b600060208201905081810360008301526121ae81611e84565b9050919050565b600060208201905081810360008301526121ce81611ea7565b9050919050565b600060208201905081810360008301526121ee81611eca565b9050919050565b6000602082019050818103600083015261220e81611eed565b9050919050565b6000602082019050818103600083015261222e81611f10565b9050919050565b600060208201905061224a6000830184611f33565b92915050565b600061225a61226b565b905061226682826124a1565b919050565b6000604051905090565b600067ffffffffffffffff8211156122905761228f612608565b5b6122998261264b565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061230982612423565b915061231483612423565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156123495761234861254c565b5b828201905092915050565b600061235f82612423565b915061236a83612423565b92508261237a5761237961257b565b5b828204905092915050565b600061239082612423565b915061239b83612423565b9250828210156123ae576123ad61254c565b5b828203905092915050565b60006123c482612403565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561245a57808201518184015260208101905061243f565b83811115612469576000848401525b50505050565b6000600282049050600182168061248757607f821691505b6020821081141561249b5761249a6125aa565b5b50919050565b6124aa8261264b565b810181811067ffffffffffffffff821117156124c9576124c8612608565b5b80604052505050565b60006124dd82612423565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156125105761250f61254c565b5b600182019050919050565b600061252682612423565b915061253183612423565b9250826125415761254061257b565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f466163656c6573734e46543a206e6f7420617574686f72697a65640000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f466163656c6573734e46543a206d617820737570706c79207265616368656400600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f466163656c6573734e46543a20616c726561647920617574686f72697a656400600082015250565b612ae9816123b9565b8114612af457600080fd5b50565b612b00816123cb565b8114612b0b57600080fd5b50565b612b17816123d7565b8114612b2257600080fd5b50565b612b2e81612423565b8114612b3957600080fd5b5056fea2646970667358221220b83d2aafd8e5694350df08dbf5f12c3e1a4ff6df9db0464e6e93f18e4048318f64736f6c634300080700330000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004568747470733a2f2f73746f726167656170692e666c65656b2e636f2f73616d757261692d7465616d2d6275636b65742f466163656c6573734e46542f6d657461646174612f000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101165760003560e01c80636352211e116100a2578063a22cb46511610071578063a22cb465146102df578063b5077f44146102fb578063b88d4fde14610319578063c87b56dd14610335578063e985e9c51461036557610116565b80636352211e1461024557806369963f6e1461027557806370a082311461029157806395d89b41146102c157610116565b806318160ddd116100e957806318160ddd146101b557806323b872dd146101d357806328a5d337146101ef57806340c10f191461020d57806342842e0e1461022957610116565b806301ffc9a71461011b57806306fdde031461014b578063081812fc14610169578063095ea7b314610199575b600080fd5b61013560048036038101906101309190611af6565b610395565b6040516101429190611fd8565b60405180910390f35b610153610477565b6040516101609190611ff3565b60405180910390f35b610183600480360381019061017e9190611b50565b610509565b6040516101909190611f71565b60405180910390f35b6101b360048036038101906101ae9190611ab6565b61058e565b005b6101bd6106a6565b6040516101ca9190612235565b60405180910390f35b6101ed60048036038101906101e891906119a0565b6106b0565b005b6101f7610710565b6040516102049190611f71565b60405180910390f35b61022760048036038101906102229190611ab6565b610736565b005b610243600480360381019061023e91906119a0565b610839565b005b61025f600480360381019061025a9190611b50565b610859565b60405161026c9190611f71565b60405180910390f35b61028f600480360381019061028a9190611933565b61090b565b005b6102ab60048036038101906102a69190611933565b6109e0565b6040516102b89190612235565b60405180910390f35b6102c9610a98565b6040516102d69190611ff3565b60405180910390f35b6102f960048036038101906102f49190611a76565b610b2a565b005b610303610cab565b6040516103109190612235565b60405180910390f35b610333600480360381019061032e91906119f3565b610cb1565b005b61034f600480360381019061034a9190611b50565b610d13565b60405161035c9190611ff3565b60405180910390f35b61037f600480360381019061037a9190611960565b610dbb565b60405161038c9190611fd8565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061046057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610470575061046f82610e4f565b5b9050919050565b6060600080546104869061246f565b80601f01602080910402602001604051908101604052809291908181526020018280546104b29061246f565b80156104ff5780601f106104d4576101008083540402835291602001916104ff565b820191906000526020600020905b8154815290600101906020018083116104e257829003601f168201915b5050505050905090565b600061051482610eb9565b610553576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161054a90612135565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061059982610859565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561060a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610601906121b5565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610629610f25565b73ffffffffffffffffffffffffffffffffffffffff161480610658575061065781610652610f25565b610dbb565b5b610697576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068e906120b5565b60405180910390fd5b6106a18383610f2d565b505050565b6000600854905090565b6106c16106bb610f25565b82610fe6565b610700576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106f7906121f5565b60405180910390fd5b61070b8383836110c4565b505050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146107c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107bd90612195565b60405180910390fd5b6103e96107d16106a6565b10610811576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610808906121d5565b60405180910390fd5b60016008600082825461082491906122fe565b925050819055506108358282611320565b5050565b61085483838360405180602001604052806000815250610cb1565b505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610902576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108f9906120f5565b60405180910390fd5b80915050919050565b600073ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461099c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099390612215565b60405180910390fd5b80600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610a51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a48906120d5565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b606060018054610aa79061246f565b80601f0160208091040260200160405190810160405280929190818152602001828054610ad39061246f565b8015610b205780601f10610af557610100808354040283529160200191610b20565b820191906000526020600020905b815481529060010190602001808311610b0357829003601f168201915b5050505050905090565b610b32610f25565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610ba0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9790612075565b60405180910390fd5b8060056000610bad610f25565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610c5a610f25565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610c9f9190611fd8565b60405180910390a35050565b6103e981565b610cc2610cbc610f25565b83610fe6565b610d01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf8906121f5565b60405180910390fd5b610d0d848484846114ee565b50505050565b6060610d1e82610eb9565b610d5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5490612175565b60405180910390fd5b600060068054610d6c9061246f565b905011610d885760405180602001604052806000815250610db4565b6006610d938361154a565b604051602001610da4929190611f42565b6040516020818303038152906040525b9050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16610fa083610859565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000610ff182610eb9565b611030576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102790612095565b60405180910390fd5b600061103b83610859565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806110aa57508373ffffffffffffffffffffffffffffffffffffffff1661109284610509565b73ffffffffffffffffffffffffffffffffffffffff16145b806110bb57506110ba8185610dbb565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166110e482610859565b73ffffffffffffffffffffffffffffffffffffffff161461113a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113190612155565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a190612055565b60405180910390fd5b6111b58383836116ab565b6111c0600082610f2d565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546112109190612385565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461126791906122fe565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611390576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138790612115565b60405180910390fd5b61139981610eb9565b156113d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d090612035565b60405180910390fd5b6113e5600083836116ab565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461143591906122fe565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6114f98484846110c4565b611505848484846116b0565b611544576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153b90612015565b60405180910390fd5b50505050565b60606000821415611592576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506116a6565b600082905060005b600082146115c45780806115ad906124d2565b915050600a826115bd9190612354565b915061159a565b60008167ffffffffffffffff8111156115e0576115df612608565b5b6040519080825280601f01601f1916602001820160405280156116125781602001600182028036833780820191505090505b5090505b6000851461169f5760018261162b9190612385565b9150600a8561163a919061251b565b603061164691906122fe565b60f81b81838151811061165c5761165b6125d9565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856116989190612354565b9450611616565b8093505050505b919050565b505050565b60006116d18473ffffffffffffffffffffffffffffffffffffffff16611847565b1561183a578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026116fa610f25565b8786866040518563ffffffff1660e01b815260040161171c9493929190611f8c565b602060405180830381600087803b15801561173657600080fd5b505af192505050801561176757506040513d601f19601f820116820180604052508101906117649190611b23565b60015b6117ea573d8060008114611797576040519150601f19603f3d011682016040523d82523d6000602084013e61179c565b606091505b506000815114156117e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d990612015565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061183f565b600190505b949350505050565b600080823b905060008111915050919050565b600061186d61186884612275565b612250565b9050828152602081018484840111156118895761188861263c565b5b61189484828561242d565b509392505050565b6000813590506118ab81612ae0565b92915050565b6000813590506118c081612af7565b92915050565b6000813590506118d581612b0e565b92915050565b6000815190506118ea81612b0e565b92915050565b600082601f83011261190557611904612637565b5b813561191584826020860161185a565b91505092915050565b60008135905061192d81612b25565b92915050565b60006020828403121561194957611948612646565b5b60006119578482850161189c565b91505092915050565b6000806040838503121561197757611976612646565b5b60006119858582860161189c565b92505060206119968582860161189c565b9150509250929050565b6000806000606084860312156119b9576119b8612646565b5b60006119c78682870161189c565b93505060206119d88682870161189c565b92505060406119e98682870161191e565b9150509250925092565b60008060008060808587031215611a0d57611a0c612646565b5b6000611a1b8782880161189c565b9450506020611a2c8782880161189c565b9350506040611a3d8782880161191e565b925050606085013567ffffffffffffffff811115611a5e57611a5d612641565b5b611a6a878288016118f0565b91505092959194509250565b60008060408385031215611a8d57611a8c612646565b5b6000611a9b8582860161189c565b9250506020611aac858286016118b1565b9150509250929050565b60008060408385031215611acd57611acc612646565b5b6000611adb8582860161189c565b9250506020611aec8582860161191e565b9150509250929050565b600060208284031215611b0c57611b0b612646565b5b6000611b1a848285016118c6565b91505092915050565b600060208284031215611b3957611b38612646565b5b6000611b47848285016118db565b91505092915050565b600060208284031215611b6657611b65612646565b5b6000611b748482850161191e565b91505092915050565b611b86816123b9565b82525050565b611b95816123cb565b82525050565b6000611ba6826122bb565b611bb081856122d1565b9350611bc081856020860161243c565b611bc98161264b565b840191505092915050565b6000611bdf826122c6565b611be981856122e2565b9350611bf981856020860161243c565b611c028161264b565b840191505092915050565b6000611c18826122c6565b611c2281856122f3565b9350611c3281856020860161243c565b80840191505092915050565b60008154611c4b8161246f565b611c5581866122f3565b94506001821660008114611c705760018114611c8157611cb4565b60ff19831686528186019350611cb4565b611c8a856122a6565b60005b83811015611cac57815481890152600182019150602081019050611c8d565b838801955050505b50505092915050565b6000611cca6032836122e2565b9150611cd58261265c565b604082019050919050565b6000611ced601c836122e2565b9150611cf8826126ab565b602082019050919050565b6000611d106024836122e2565b9150611d1b826126d4565b604082019050919050565b6000611d336019836122e2565b9150611d3e82612723565b602082019050919050565b6000611d56602c836122e2565b9150611d618261274c565b604082019050919050565b6000611d796038836122e2565b9150611d848261279b565b604082019050919050565b6000611d9c602a836122e2565b9150611da7826127ea565b604082019050919050565b6000611dbf6029836122e2565b9150611dca82612839565b604082019050919050565b6000611de26020836122e2565b9150611ded82612888565b602082019050919050565b6000611e05602c836122e2565b9150611e10826128b1565b604082019050919050565b6000611e286005836122f3565b9150611e3382612900565b600582019050919050565b6000611e4b6029836122e2565b9150611e5682612929565b604082019050919050565b6000611e6e602f836122e2565b9150611e7982612978565b604082019050919050565b6000611e91601b836122e2565b9150611e9c826129c7565b602082019050919050565b6000611eb46021836122e2565b9150611ebf826129f0565b604082019050919050565b6000611ed7601f836122e2565b9150611ee282612a3f565b602082019050919050565b6000611efa6031836122e2565b9150611f0582612a68565b604082019050919050565b6000611f1d601f836122e2565b9150611f2882612ab7565b602082019050919050565b611f3c81612423565b82525050565b6000611f4e8285611c3e565b9150611f5a8284611c0d565b9150611f6582611e1b565b91508190509392505050565b6000602082019050611f866000830184611b7d565b92915050565b6000608082019050611fa16000830187611b7d565b611fae6020830186611b7d565b611fbb6040830185611f33565b8181036060830152611fcd8184611b9b565b905095945050505050565b6000602082019050611fed6000830184611b8c565b92915050565b6000602082019050818103600083015261200d8184611bd4565b905092915050565b6000602082019050818103600083015261202e81611cbd565b9050919050565b6000602082019050818103600083015261204e81611ce0565b9050919050565b6000602082019050818103600083015261206e81611d03565b9050919050565b6000602082019050818103600083015261208e81611d26565b9050919050565b600060208201905081810360008301526120ae81611d49565b9050919050565b600060208201905081810360008301526120ce81611d6c565b9050919050565b600060208201905081810360008301526120ee81611d8f565b9050919050565b6000602082019050818103600083015261210e81611db2565b9050919050565b6000602082019050818103600083015261212e81611dd5565b9050919050565b6000602082019050818103600083015261214e81611df8565b9050919050565b6000602082019050818103600083015261216e81611e3e565b9050919050565b6000602082019050818103600083015261218e81611e61565b9050919050565b600060208201905081810360008301526121ae81611e84565b9050919050565b600060208201905081810360008301526121ce81611ea7565b9050919050565b600060208201905081810360008301526121ee81611eca565b9050919050565b6000602082019050818103600083015261220e81611eed565b9050919050565b6000602082019050818103600083015261222e81611f10565b9050919050565b600060208201905061224a6000830184611f33565b92915050565b600061225a61226b565b905061226682826124a1565b919050565b6000604051905090565b600067ffffffffffffffff8211156122905761228f612608565b5b6122998261264b565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061230982612423565b915061231483612423565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156123495761234861254c565b5b828201905092915050565b600061235f82612423565b915061236a83612423565b92508261237a5761237961257b565b5b828204905092915050565b600061239082612423565b915061239b83612423565b9250828210156123ae576123ad61254c565b5b828203905092915050565b60006123c482612403565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561245a57808201518184015260208101905061243f565b83811115612469576000848401525b50505050565b6000600282049050600182168061248757607f821691505b6020821081141561249b5761249a6125aa565b5b50919050565b6124aa8261264b565b810181811067ffffffffffffffff821117156124c9576124c8612608565b5b80604052505050565b60006124dd82612423565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156125105761250f61254c565b5b600182019050919050565b600061252682612423565b915061253183612423565b9250826125415761254061257b565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f466163656c6573734e46543a206e6f7420617574686f72697a65640000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f466163656c6573734e46543a206d617820737570706c79207265616368656400600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f466163656c6573734e46543a20616c726561647920617574686f72697a656400600082015250565b612ae9816123b9565b8114612af457600080fd5b50565b612b00816123cb565b8114612b0b57600080fd5b50565b612b17816123d7565b8114612b2257600080fd5b50565b612b2e81612423565b8114612b3957600080fd5b5056fea2646970667358221220b83d2aafd8e5694350df08dbf5f12c3e1a4ff6df9db0464e6e93f18e4048318f64736f6c63430008070033

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

0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004568747470733a2f2f73746f726167656170692e666c65656b2e636f2f73616d757261692d7465616d2d6275636b65742f466163656c6573734e46542f6d657461646174612f000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : baseURI_ (string): https://storageapi.fleek.co/samurai-team-bucket/FacelessNFT/metadata/

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000045
Arg [2] : 68747470733a2f2f73746f726167656170692e666c65656b2e636f2f73616d75
Arg [3] : 7261692d7465616d2d6275636b65742f466163656c6573734e46542f6d657461
Arg [4] : 646174612f000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

37751:949:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25318:309;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26275:94;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27798:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27363:377;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38324:94;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28708:332;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37866:28;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38424:273;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29103:165;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25963:253;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38140:178;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25683:226;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26430:98;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28101:299;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37926:45;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29331:321;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37161:349;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28463:186;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25318:309;25445:4;25490:25;25475:40;;;:11;:40;;;;:99;;;;25541:33;25526:48;;;:11;:48;;;;25475:99;:146;;;;25585:36;25609:11;25585:23;:36::i;:::-;25475:146;25461:160;;25318:309;;;:::o;26275:94::-;26329:13;26358:5;26351:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26275:94;:::o;27798:239::-;27899:7;27926:16;27934:7;27926;:16::i;:::-;27918:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;28007:15;:24;28023:7;28007:24;;;;;;;;;;;;;;;;;;;;;28000:31;;27798:239;;;:::o;27363:377::-;27440:13;27456:23;27471:7;27456:14;:23::i;:::-;27440:39;;27500:5;27494:11;;:2;:11;;;;27486:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;27584:5;27568:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;27593:37;27610:5;27617:12;:10;:12::i;:::-;27593:16;:37::i;:::-;27568:62;27552:152;;;;;;;;;;;;:::i;:::-;;;;;;;;;27713:21;27722:2;27726:7;27713:8;:21::i;:::-;27433:307;27363:377;;:::o;38324:94::-;38377:7;38400:12;;38393:19;;38324:94;:::o;28708:332::-;28889:41;28908:12;:10;:12::i;:::-;28922:7;28889:18;:41::i;:::-;28873:124;;;;;;;;;;;;:::i;:::-;;;;;;;;;29006:28;29016:4;29022:2;29026:7;29006:9;:28::i;:::-;28708:332;;;:::o;37866:28::-;;;;;;;;;;;;;:::o;38424:273::-;38514:13;;;;;;;;;;;38500:27;;:10;:27;;;38492:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;37967:4;38574:13;:11;:13::i;:::-;:30;38566:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;38665:1;38649:12;;:17;;;;;;;:::i;:::-;;;;;;;;38673:18;38679:2;38683:7;38673:5;:18::i;:::-;38424:273;;:::o;29103:165::-;29223:39;29240:4;29246:2;29250:7;29223:39;;;;;;;;;;;;:16;:39::i;:::-;29103:165;;;:::o;25963:253::-;26060:7;26079:13;26095:7;:16;26103:7;26095:16;;;;;;;;;;;;;;;;;;;;;26079:32;;26143:1;26126:19;;:5;:19;;;;26118:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26205:5;26198:12;;;25963:253;;;:::o;38140:178::-;38238:1;38213:27;;:13;;;;;;;;;;;:27;;;38205:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;38299:13;38283;;:29;;;;;;;;;;;;;;;;;;38140:178;:::o;25683:226::-;25780:7;25824:1;25807:19;;:5;:19;;;;25799:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;25887:9;:16;25897:5;25887:16;;;;;;;;;;;;;;;;25880:23;;25683:226;;;:::o;26430:98::-;26486:13;26515:7;26508:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26430:98;:::o;28101:299::-;28230:12;:10;:12::i;:::-;28218:24;;:8;:24;;;;28210:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;28326:8;28281:18;:32;28300:12;:10;:12::i;:::-;28281:32;;;;;;;;;;;;;;;:42;28314:8;28281:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;28375:8;28346:48;;28361:12;:10;:12::i;:::-;28346:48;;;28385:8;28346:48;;;;;;:::i;:::-;;;;;;;;28101:299;;:::o;37926:45::-;37967:4;37926:45;:::o;29331:321::-;29492:41;29511:12;:10;:12::i;:::-;29525:7;29492:18;:41::i;:::-;29476:124;;;;;;;;;;;;:::i;:::-;;;;;;;;;29607:39;29621:4;29627:2;29631:7;29640:5;29607:13;:39::i;:::-;29331:321;;;;:::o;37161:349::-;37246:13;37287:16;37295:7;37287;:16::i;:::-;37271:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;37415:1;37397:7;37391:21;;;;;:::i;:::-;;;:25;:113;;;;;;;;;;;;;;;;;37452:7;37461:18;:7;:16;:18::i;:::-;37435:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;37391:113;37377:127;;37161:349;;;:::o;28463:186::-;28585:4;28608:18;:25;28627:5;28608:25;;;;;;;;;;;;;;;:35;28634:8;28608:35;;;;;;;;;;;;;;;;;;;;;;;;;28601:42;;28463:186;;;;:::o;23959:179::-;24069:4;24107:25;24092:40;;;:11;:40;;;;24085:47;;23959:179;;;:::o;31099:121::-;31164:4;31212:1;31184:30;;:7;:16;31192:7;31184:16;;;;;;;;;;;;;;;;;;;;;:30;;;;31177:37;;31099:121;;;:::o;21268:92::-;21321:7;21344:10;21337:17;;21268:92;:::o;34833:164::-;34931:2;34904:15;:24;34920:7;34904:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;34983:7;34979:2;34945:46;;34954:23;34969:7;34954:14;:23::i;:::-;34945:46;;;;;;;;;;;;34833:164;;:::o;31371:371::-;31484:4;31508:16;31516:7;31508;:16::i;:::-;31500:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;31580:13;31596:23;31611:7;31596:14;:23::i;:::-;31580:39;;31645:5;31634:16;;:7;:16;;;:58;;;;31685:7;31661:31;;:20;31673:7;31661:11;:20::i;:::-;:31;;;31634:58;:101;;;;31703:32;31720:5;31727:7;31703:16;:32::i;:::-;31634:101;31626:110;;;31371:371;;;;:::o;34180:547::-;34329:4;34302:31;;:23;34317:7;34302:14;:23::i;:::-;:31;;;34286:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;34421:1;34407:16;;:2;:16;;;;34399:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;34473:39;34494:4;34500:2;34504:7;34473:20;:39::i;:::-;34569:29;34586:1;34590:7;34569:8;:29::i;:::-;34626:1;34607:9;:15;34617:4;34607:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;34651:1;34634:9;:13;34644:2;34634:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;34678:2;34659:7;:16;34667:7;34659:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;34713:7;34709:2;34694:27;;34703:4;34694:27;;;;;;;;;;;;34180:547;;;:::o;32974:356::-;33064:1;33050:16;;:2;:16;;;;33042:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;33119:16;33127:7;33119;:16::i;:::-;33118:17;33110:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;33177:45;33206:1;33210:2;33214:7;33177:20;:45::i;:::-;33248:1;33231:9;:13;33241:2;33231:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;33275:2;33256:7;:16;33264:7;33256:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;33316:7;33312:2;33291:33;;33308:1;33291:33;;;;;;;;;;;;32974:356;;:::o;30496:308::-;30631:28;30641:4;30647:2;30651:7;30631:9;:28::i;:::-;30682:48;30705:4;30711:2;30715:7;30724:5;30682:22;:48::i;:::-;30666:132;;;;;;;;;;;;:::i;:::-;;;;;;;;;30496:308;;;;:::o;21684:637::-;21740:13;21958:1;21949:5;:10;21945:43;;;21970:10;;;;;;;;;;;;;;;;;;;;;21945:43;21994:12;22009:5;21994:20;;22021:14;22042:62;22057:1;22049:4;:9;22042:62;;22069:8;;;;;:::i;:::-;;;;22094:2;22086:10;;;;;:::i;:::-;;;22042:62;;;22110:19;22142:6;22132:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22110:39;;22156:132;22172:1;22163:5;:10;22156:132;;22194:1;22184:11;;;;;:::i;:::-;;;22255:2;22247:5;:10;;;;:::i;:::-;22234:2;:24;;;;:::i;:::-;22221:39;;22204:6;22211;22204:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;22278:2;22269:11;;;;;:::i;:::-;;;22156:132;;;22308:6;22294:21;;;;;21684:637;;;;:::o;36767:112::-;;;;:::o;35540:685::-;35677:4;35694:15;:2;:13;;;:15::i;:::-;35690:530;;;35749:2;35733:36;;;35770:12;:10;:12::i;:::-;35784:4;35790:7;35799:5;35733:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;35720:459;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35977:1;35960:6;:13;:18;35956:214;;;35993:60;;;;;;;;;;:::i;:::-;;;;;;;;35956:214;36138:6;36132:13;36123:6;36119:2;36115:15;36108:38;35720:459;35865:41;;;35855:51;;;:6;:51;;;;35848:58;;;;;35690:530;36208:4;36201:11;;35540:685;;;;;;;:::o;13715:351::-;13775:4;13967:12;14024:7;14012:20;14004:28;;14059:1;14052:4;:8;14045:15;;;13715:351;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:139::-;469:5;507:6;494:20;485:29;;523:33;550:5;523:33;:::i;:::-;423:139;;;;:::o;568:133::-;611:5;649:6;636:20;627:29;;665:30;689:5;665:30;:::i;:::-;568:133;;;;:::o;707:137::-;752:5;790:6;777:20;768:29;;806:32;832:5;806:32;:::i;:::-;707:137;;;;:::o;850:141::-;906:5;937:6;931:13;922:22;;953:32;979:5;953:32;:::i;:::-;850:141;;;;:::o;1010:338::-;1065:5;1114:3;1107:4;1099:6;1095:17;1091:27;1081:122;;1122:79;;:::i;:::-;1081:122;1239:6;1226:20;1264:78;1338:3;1330:6;1323:4;1315:6;1311:17;1264:78;:::i;:::-;1255:87;;1071:277;1010:338;;;;:::o;1354:139::-;1400:5;1438:6;1425:20;1416:29;;1454:33;1481:5;1454:33;:::i;:::-;1354:139;;;;:::o;1499:329::-;1558:6;1607:2;1595:9;1586:7;1582:23;1578:32;1575:119;;;1613:79;;:::i;:::-;1575:119;1733:1;1758:53;1803:7;1794:6;1783:9;1779:22;1758:53;:::i;:::-;1748:63;;1704:117;1499:329;;;;:::o;1834:474::-;1902:6;1910;1959:2;1947:9;1938:7;1934:23;1930:32;1927:119;;;1965:79;;:::i;:::-;1927:119;2085:1;2110:53;2155:7;2146:6;2135:9;2131:22;2110:53;:::i;:::-;2100:63;;2056:117;2212:2;2238:53;2283:7;2274:6;2263:9;2259:22;2238:53;:::i;:::-;2228:63;;2183:118;1834:474;;;;;:::o;2314:619::-;2391:6;2399;2407;2456:2;2444:9;2435:7;2431:23;2427:32;2424:119;;;2462:79;;:::i;:::-;2424:119;2582:1;2607:53;2652:7;2643:6;2632:9;2628:22;2607:53;:::i;:::-;2597:63;;2553:117;2709:2;2735:53;2780:7;2771:6;2760:9;2756:22;2735:53;:::i;:::-;2725:63;;2680:118;2837:2;2863:53;2908:7;2899:6;2888:9;2884:22;2863:53;:::i;:::-;2853:63;;2808:118;2314:619;;;;;:::o;2939:943::-;3034:6;3042;3050;3058;3107:3;3095:9;3086:7;3082:23;3078:33;3075:120;;;3114:79;;:::i;:::-;3075:120;3234:1;3259:53;3304:7;3295:6;3284:9;3280:22;3259:53;:::i;:::-;3249:63;;3205:117;3361:2;3387:53;3432:7;3423:6;3412:9;3408:22;3387:53;:::i;:::-;3377:63;;3332:118;3489:2;3515:53;3560:7;3551:6;3540:9;3536:22;3515:53;:::i;:::-;3505:63;;3460:118;3645:2;3634:9;3630:18;3617:32;3676:18;3668:6;3665:30;3662:117;;;3698:79;;:::i;:::-;3662:117;3803:62;3857:7;3848:6;3837:9;3833:22;3803:62;:::i;:::-;3793:72;;3588:287;2939:943;;;;;;;:::o;3888:468::-;3953:6;3961;4010:2;3998:9;3989:7;3985:23;3981:32;3978:119;;;4016:79;;:::i;:::-;3978:119;4136:1;4161:53;4206:7;4197:6;4186:9;4182:22;4161:53;:::i;:::-;4151:63;;4107:117;4263:2;4289:50;4331:7;4322:6;4311:9;4307:22;4289:50;:::i;:::-;4279:60;;4234:115;3888:468;;;;;:::o;4362:474::-;4430:6;4438;4487:2;4475:9;4466:7;4462:23;4458:32;4455:119;;;4493:79;;:::i;:::-;4455:119;4613:1;4638:53;4683:7;4674:6;4663:9;4659:22;4638:53;:::i;:::-;4628:63;;4584:117;4740:2;4766:53;4811:7;4802:6;4791:9;4787:22;4766:53;:::i;:::-;4756:63;;4711:118;4362:474;;;;;:::o;4842:327::-;4900:6;4949:2;4937:9;4928:7;4924:23;4920:32;4917:119;;;4955:79;;:::i;:::-;4917:119;5075:1;5100:52;5144:7;5135:6;5124:9;5120:22;5100:52;:::i;:::-;5090:62;;5046:116;4842:327;;;;:::o;5175:349::-;5244:6;5293:2;5281:9;5272:7;5268:23;5264:32;5261:119;;;5299:79;;:::i;:::-;5261:119;5419:1;5444:63;5499:7;5490:6;5479:9;5475:22;5444:63;:::i;:::-;5434:73;;5390:127;5175:349;;;;:::o;5530:329::-;5589:6;5638:2;5626:9;5617:7;5613:23;5609:32;5606:119;;;5644:79;;:::i;:::-;5606:119;5764:1;5789:53;5834:7;5825:6;5814:9;5810:22;5789:53;:::i;:::-;5779:63;;5735:117;5530:329;;;;:::o;5865:118::-;5952:24;5970:5;5952:24;:::i;:::-;5947:3;5940:37;5865:118;;:::o;5989:109::-;6070:21;6085:5;6070:21;:::i;:::-;6065:3;6058:34;5989:109;;:::o;6104:360::-;6190:3;6218:38;6250:5;6218:38;:::i;:::-;6272:70;6335:6;6330:3;6272:70;:::i;:::-;6265:77;;6351:52;6396:6;6391:3;6384:4;6377:5;6373:16;6351:52;:::i;:::-;6428:29;6450:6;6428:29;:::i;:::-;6423:3;6419:39;6412:46;;6194:270;6104:360;;;;:::o;6470:364::-;6558:3;6586:39;6619:5;6586:39;:::i;:::-;6641:71;6705:6;6700:3;6641:71;:::i;:::-;6634:78;;6721:52;6766:6;6761:3;6754:4;6747:5;6743:16;6721:52;:::i;:::-;6798:29;6820:6;6798:29;:::i;:::-;6793:3;6789:39;6782:46;;6562:272;6470:364;;;;:::o;6840:377::-;6946:3;6974:39;7007:5;6974:39;:::i;:::-;7029:89;7111:6;7106:3;7029:89;:::i;:::-;7022:96;;7127:52;7172:6;7167:3;7160:4;7153:5;7149:16;7127:52;:::i;:::-;7204:6;7199:3;7195:16;7188:23;;6950:267;6840:377;;;;:::o;7247:845::-;7350:3;7387:5;7381:12;7416:36;7442:9;7416:36;:::i;:::-;7468:89;7550:6;7545:3;7468:89;:::i;:::-;7461:96;;7588:1;7577:9;7573:17;7604:1;7599:137;;;;7750:1;7745:341;;;;7566:520;;7599:137;7683:4;7679:9;7668;7664:25;7659:3;7652:38;7719:6;7714:3;7710:16;7703:23;;7599:137;;7745:341;7812:38;7844:5;7812:38;:::i;:::-;7872:1;7886:154;7900:6;7897:1;7894:13;7886:154;;;7974:7;7968:14;7964:1;7959:3;7955:11;7948:35;8024:1;8015:7;8011:15;8000:26;;7922:4;7919:1;7915:12;7910:17;;7886:154;;;8069:6;8064:3;8060:16;8053:23;;7752:334;;7566:520;;7354:738;;7247:845;;;;:::o;8098:366::-;8240:3;8261:67;8325:2;8320:3;8261:67;:::i;:::-;8254:74;;8337:93;8426:3;8337:93;:::i;:::-;8455:2;8450:3;8446:12;8439:19;;8098:366;;;:::o;8470:::-;8612:3;8633:67;8697:2;8692:3;8633:67;:::i;:::-;8626:74;;8709:93;8798:3;8709:93;:::i;:::-;8827:2;8822:3;8818:12;8811:19;;8470:366;;;:::o;8842:::-;8984:3;9005:67;9069:2;9064:3;9005:67;:::i;:::-;8998:74;;9081:93;9170:3;9081:93;:::i;:::-;9199:2;9194:3;9190:12;9183:19;;8842:366;;;:::o;9214:::-;9356:3;9377:67;9441:2;9436:3;9377:67;:::i;:::-;9370:74;;9453:93;9542:3;9453:93;:::i;:::-;9571:2;9566:3;9562:12;9555:19;;9214:366;;;:::o;9586:::-;9728:3;9749:67;9813:2;9808:3;9749:67;:::i;:::-;9742:74;;9825:93;9914:3;9825:93;:::i;:::-;9943:2;9938:3;9934:12;9927:19;;9586:366;;;:::o;9958:::-;10100:3;10121:67;10185:2;10180:3;10121:67;:::i;:::-;10114:74;;10197:93;10286:3;10197:93;:::i;:::-;10315:2;10310:3;10306:12;10299:19;;9958:366;;;:::o;10330:::-;10472:3;10493:67;10557:2;10552:3;10493:67;:::i;:::-;10486:74;;10569:93;10658:3;10569:93;:::i;:::-;10687:2;10682:3;10678:12;10671:19;;10330:366;;;:::o;10702:::-;10844:3;10865:67;10929:2;10924:3;10865:67;:::i;:::-;10858:74;;10941:93;11030:3;10941:93;:::i;:::-;11059:2;11054:3;11050:12;11043:19;;10702:366;;;:::o;11074:::-;11216:3;11237:67;11301:2;11296:3;11237:67;:::i;:::-;11230:74;;11313:93;11402:3;11313:93;:::i;:::-;11431:2;11426:3;11422:12;11415:19;;11074:366;;;:::o;11446:::-;11588:3;11609:67;11673:2;11668:3;11609:67;:::i;:::-;11602:74;;11685:93;11774:3;11685:93;:::i;:::-;11803:2;11798:3;11794:12;11787:19;;11446:366;;;:::o;11818:400::-;11978:3;11999:84;12081:1;12076:3;11999:84;:::i;:::-;11992:91;;12092:93;12181:3;12092:93;:::i;:::-;12210:1;12205:3;12201:11;12194:18;;11818:400;;;:::o;12224:366::-;12366:3;12387:67;12451:2;12446:3;12387:67;:::i;:::-;12380:74;;12463:93;12552:3;12463:93;:::i;:::-;12581:2;12576:3;12572:12;12565:19;;12224:366;;;:::o;12596:::-;12738:3;12759:67;12823:2;12818:3;12759:67;:::i;:::-;12752:74;;12835:93;12924:3;12835:93;:::i;:::-;12953:2;12948:3;12944:12;12937:19;;12596:366;;;:::o;12968:::-;13110:3;13131:67;13195:2;13190:3;13131:67;:::i;:::-;13124:74;;13207:93;13296:3;13207:93;:::i;:::-;13325:2;13320:3;13316:12;13309:19;;12968:366;;;:::o;13340:::-;13482:3;13503:67;13567:2;13562:3;13503:67;:::i;:::-;13496:74;;13579:93;13668:3;13579:93;:::i;:::-;13697:2;13692:3;13688:12;13681:19;;13340:366;;;:::o;13712:::-;13854:3;13875:67;13939:2;13934:3;13875:67;:::i;:::-;13868:74;;13951:93;14040:3;13951:93;:::i;:::-;14069:2;14064:3;14060:12;14053:19;;13712:366;;;:::o;14084:::-;14226:3;14247:67;14311:2;14306:3;14247:67;:::i;:::-;14240:74;;14323:93;14412:3;14323:93;:::i;:::-;14441:2;14436:3;14432:12;14425:19;;14084:366;;;:::o;14456:::-;14598:3;14619:67;14683:2;14678:3;14619:67;:::i;:::-;14612:74;;14695:93;14784:3;14695:93;:::i;:::-;14813:2;14808:3;14804:12;14797:19;;14456:366;;;:::o;14828:118::-;14915:24;14933:5;14915:24;:::i;:::-;14910:3;14903:37;14828:118;;:::o;14952:695::-;15230:3;15252:92;15340:3;15331:6;15252:92;:::i;:::-;15245:99;;15361:95;15452:3;15443:6;15361:95;:::i;:::-;15354:102;;15473:148;15617:3;15473:148;:::i;:::-;15466:155;;15638:3;15631:10;;14952:695;;;;;:::o;15653:222::-;15746:4;15784:2;15773:9;15769:18;15761:26;;15797:71;15865:1;15854:9;15850:17;15841:6;15797:71;:::i;:::-;15653:222;;;;:::o;15881:640::-;16076:4;16114:3;16103:9;16099:19;16091:27;;16128:71;16196:1;16185:9;16181:17;16172:6;16128:71;:::i;:::-;16209:72;16277:2;16266:9;16262:18;16253:6;16209:72;:::i;:::-;16291;16359:2;16348:9;16344:18;16335:6;16291:72;:::i;:::-;16410:9;16404:4;16400:20;16395:2;16384:9;16380:18;16373:48;16438:76;16509:4;16500:6;16438:76;:::i;:::-;16430:84;;15881:640;;;;;;;:::o;16527:210::-;16614:4;16652:2;16641:9;16637:18;16629:26;;16665:65;16727:1;16716:9;16712:17;16703:6;16665:65;:::i;:::-;16527:210;;;;:::o;16743:313::-;16856:4;16894:2;16883:9;16879:18;16871:26;;16943:9;16937:4;16933:20;16929:1;16918:9;16914:17;16907:47;16971:78;17044:4;17035:6;16971:78;:::i;:::-;16963:86;;16743:313;;;;:::o;17062:419::-;17228:4;17266:2;17255:9;17251:18;17243:26;;17315:9;17309:4;17305:20;17301:1;17290:9;17286:17;17279:47;17343:131;17469:4;17343:131;:::i;:::-;17335:139;;17062:419;;;:::o;17487:::-;17653:4;17691:2;17680:9;17676:18;17668:26;;17740:9;17734:4;17730:20;17726:1;17715:9;17711:17;17704:47;17768:131;17894:4;17768:131;:::i;:::-;17760:139;;17487:419;;;:::o;17912:::-;18078:4;18116:2;18105:9;18101:18;18093:26;;18165:9;18159:4;18155:20;18151:1;18140:9;18136:17;18129:47;18193:131;18319:4;18193:131;:::i;:::-;18185:139;;17912:419;;;:::o;18337:::-;18503:4;18541:2;18530:9;18526:18;18518:26;;18590:9;18584:4;18580:20;18576:1;18565:9;18561:17;18554:47;18618:131;18744:4;18618:131;:::i;:::-;18610:139;;18337:419;;;:::o;18762:::-;18928:4;18966:2;18955:9;18951:18;18943:26;;19015:9;19009:4;19005:20;19001:1;18990:9;18986:17;18979:47;19043:131;19169:4;19043:131;:::i;:::-;19035:139;;18762:419;;;:::o;19187:::-;19353:4;19391:2;19380:9;19376:18;19368:26;;19440:9;19434:4;19430:20;19426:1;19415:9;19411:17;19404:47;19468:131;19594:4;19468:131;:::i;:::-;19460:139;;19187:419;;;:::o;19612:::-;19778:4;19816:2;19805:9;19801:18;19793:26;;19865:9;19859:4;19855:20;19851:1;19840:9;19836:17;19829:47;19893:131;20019:4;19893:131;:::i;:::-;19885:139;;19612:419;;;:::o;20037:::-;20203:4;20241:2;20230:9;20226:18;20218:26;;20290:9;20284:4;20280:20;20276:1;20265:9;20261:17;20254:47;20318:131;20444:4;20318:131;:::i;:::-;20310:139;;20037:419;;;:::o;20462:::-;20628:4;20666:2;20655:9;20651:18;20643:26;;20715:9;20709:4;20705:20;20701:1;20690:9;20686:17;20679:47;20743:131;20869:4;20743:131;:::i;:::-;20735:139;;20462:419;;;:::o;20887:::-;21053:4;21091:2;21080:9;21076:18;21068:26;;21140:9;21134:4;21130:20;21126:1;21115:9;21111:17;21104:47;21168:131;21294:4;21168:131;:::i;:::-;21160:139;;20887:419;;;:::o;21312:::-;21478:4;21516:2;21505:9;21501:18;21493:26;;21565:9;21559:4;21555:20;21551:1;21540:9;21536:17;21529:47;21593:131;21719:4;21593:131;:::i;:::-;21585:139;;21312:419;;;:::o;21737:::-;21903:4;21941:2;21930:9;21926:18;21918:26;;21990:9;21984:4;21980:20;21976:1;21965:9;21961:17;21954:47;22018:131;22144:4;22018:131;:::i;:::-;22010:139;;21737:419;;;:::o;22162:::-;22328:4;22366:2;22355:9;22351:18;22343:26;;22415:9;22409:4;22405:20;22401:1;22390:9;22386:17;22379:47;22443:131;22569:4;22443:131;:::i;:::-;22435:139;;22162:419;;;:::o;22587:::-;22753:4;22791:2;22780:9;22776:18;22768:26;;22840:9;22834:4;22830:20;22826:1;22815:9;22811:17;22804:47;22868:131;22994:4;22868:131;:::i;:::-;22860:139;;22587:419;;;:::o;23012:::-;23178:4;23216:2;23205:9;23201:18;23193:26;;23265:9;23259:4;23255:20;23251:1;23240:9;23236:17;23229:47;23293:131;23419:4;23293:131;:::i;:::-;23285:139;;23012:419;;;:::o;23437:::-;23603:4;23641:2;23630:9;23626:18;23618:26;;23690:9;23684:4;23680:20;23676:1;23665:9;23661:17;23654:47;23718:131;23844:4;23718:131;:::i;:::-;23710:139;;23437:419;;;:::o;23862:::-;24028:4;24066:2;24055:9;24051:18;24043:26;;24115:9;24109:4;24105:20;24101:1;24090:9;24086:17;24079:47;24143:131;24269:4;24143:131;:::i;:::-;24135:139;;23862:419;;;:::o;24287:222::-;24380:4;24418:2;24407:9;24403:18;24395:26;;24431:71;24499:1;24488:9;24484:17;24475:6;24431:71;:::i;:::-;24287:222;;;;:::o;24515:129::-;24549:6;24576:20;;:::i;:::-;24566:30;;24605:33;24633:4;24625:6;24605:33;:::i;:::-;24515:129;;;:::o;24650:75::-;24683:6;24716:2;24710:9;24700:19;;24650:75;:::o;24731:307::-;24792:4;24882:18;24874:6;24871:30;24868:56;;;24904:18;;:::i;:::-;24868:56;24942:29;24964:6;24942:29;:::i;:::-;24934:37;;25026:4;25020;25016:15;25008:23;;24731:307;;;:::o;25044:141::-;25093:4;25116:3;25108:11;;25139:3;25136:1;25129:14;25173:4;25170:1;25160:18;25152:26;;25044:141;;;:::o;25191:98::-;25242:6;25276:5;25270:12;25260:22;;25191:98;;;:::o;25295:99::-;25347:6;25381:5;25375:12;25365:22;;25295:99;;;:::o;25400:168::-;25483:11;25517:6;25512:3;25505:19;25557:4;25552:3;25548:14;25533:29;;25400:168;;;;:::o;25574:169::-;25658:11;25692:6;25687:3;25680:19;25732:4;25727:3;25723:14;25708:29;;25574:169;;;;:::o;25749:148::-;25851:11;25888:3;25873:18;;25749:148;;;;:::o;25903:305::-;25943:3;25962:20;25980:1;25962:20;:::i;:::-;25957:25;;25996:20;26014:1;25996:20;:::i;:::-;25991:25;;26150:1;26082:66;26078:74;26075:1;26072:81;26069:107;;;26156:18;;:::i;:::-;26069:107;26200:1;26197;26193:9;26186:16;;25903:305;;;;:::o;26214:185::-;26254:1;26271:20;26289:1;26271:20;:::i;:::-;26266:25;;26305:20;26323:1;26305:20;:::i;:::-;26300:25;;26344:1;26334:35;;26349:18;;:::i;:::-;26334:35;26391:1;26388;26384:9;26379:14;;26214:185;;;;:::o;26405:191::-;26445:4;26465:20;26483:1;26465:20;:::i;:::-;26460:25;;26499:20;26517:1;26499:20;:::i;:::-;26494:25;;26538:1;26535;26532:8;26529:34;;;26543:18;;:::i;:::-;26529:34;26588:1;26585;26581:9;26573:17;;26405:191;;;;:::o;26602:96::-;26639:7;26668:24;26686:5;26668:24;:::i;:::-;26657:35;;26602:96;;;:::o;26704:90::-;26738:7;26781:5;26774:13;26767:21;26756:32;;26704:90;;;:::o;26800:149::-;26836:7;26876:66;26869:5;26865:78;26854:89;;26800:149;;;:::o;26955:126::-;26992:7;27032:42;27025:5;27021:54;27010:65;;26955:126;;;:::o;27087:77::-;27124:7;27153:5;27142:16;;27087:77;;;:::o;27170:154::-;27254:6;27249:3;27244;27231:30;27316:1;27307:6;27302:3;27298:16;27291:27;27170:154;;;:::o;27330:307::-;27398:1;27408:113;27422:6;27419:1;27416:13;27408:113;;;27507:1;27502:3;27498:11;27492:18;27488:1;27483:3;27479:11;27472:39;27444:2;27441:1;27437:10;27432:15;;27408:113;;;27539:6;27536:1;27533:13;27530:101;;;27619:1;27610:6;27605:3;27601:16;27594:27;27530:101;27379:258;27330:307;;;:::o;27643:320::-;27687:6;27724:1;27718:4;27714:12;27704:22;;27771:1;27765:4;27761:12;27792:18;27782:81;;27848:4;27840:6;27836:17;27826:27;;27782:81;27910:2;27902:6;27899:14;27879:18;27876:38;27873:84;;;27929:18;;:::i;:::-;27873:84;27694:269;27643:320;;;:::o;27969:281::-;28052:27;28074:4;28052:27;:::i;:::-;28044:6;28040:40;28182:6;28170:10;28167:22;28146:18;28134:10;28131:34;28128:62;28125:88;;;28193:18;;:::i;:::-;28125:88;28233:10;28229:2;28222:22;28012:238;27969:281;;:::o;28256:233::-;28295:3;28318:24;28336:5;28318:24;:::i;:::-;28309:33;;28364:66;28357:5;28354:77;28351:103;;;28434:18;;:::i;:::-;28351:103;28481:1;28474:5;28470:13;28463:20;;28256:233;;;:::o;28495:176::-;28527:1;28544:20;28562:1;28544:20;:::i;:::-;28539:25;;28578:20;28596:1;28578:20;:::i;:::-;28573:25;;28617:1;28607:35;;28622:18;;:::i;:::-;28607:35;28663:1;28660;28656:9;28651:14;;28495:176;;;;:::o;28677:180::-;28725:77;28722:1;28715:88;28822:4;28819:1;28812:15;28846:4;28843:1;28836:15;28863:180;28911:77;28908:1;28901:88;29008:4;29005:1;28998:15;29032:4;29029:1;29022:15;29049:180;29097:77;29094:1;29087:88;29194:4;29191:1;29184:15;29218:4;29215:1;29208:15;29235:180;29283:77;29280:1;29273:88;29380:4;29377:1;29370:15;29404:4;29401:1;29394:15;29421:180;29469:77;29466:1;29459:88;29566:4;29563:1;29556:15;29590:4;29587:1;29580:15;29607:117;29716:1;29713;29706:12;29730:117;29839:1;29836;29829:12;29853:117;29962:1;29959;29952:12;29976:117;30085:1;30082;30075:12;30099:102;30140:6;30191:2;30187:7;30182:2;30175:5;30171:14;30167:28;30157:38;;30099:102;;;:::o;30207:237::-;30347:34;30343:1;30335:6;30331:14;30324:58;30416:20;30411:2;30403:6;30399:15;30392:45;30207:237;:::o;30450:178::-;30590:30;30586:1;30578:6;30574:14;30567:54;30450:178;:::o;30634:223::-;30774:34;30770:1;30762:6;30758:14;30751:58;30843:6;30838:2;30830:6;30826:15;30819:31;30634:223;:::o;30863:175::-;31003:27;30999:1;30991:6;30987:14;30980:51;30863:175;:::o;31044:231::-;31184:34;31180:1;31172:6;31168:14;31161:58;31253:14;31248:2;31240:6;31236:15;31229:39;31044:231;:::o;31281:243::-;31421:34;31417:1;31409:6;31405:14;31398:58;31490:26;31485:2;31477:6;31473:15;31466:51;31281:243;:::o;31530:229::-;31670:34;31666:1;31658:6;31654:14;31647:58;31739:12;31734:2;31726:6;31722:15;31715:37;31530:229;:::o;31765:228::-;31905:34;31901:1;31893:6;31889:14;31882:58;31974:11;31969:2;31961:6;31957:15;31950:36;31765:228;:::o;31999:182::-;32139:34;32135:1;32127:6;32123:14;32116:58;31999:182;:::o;32187:231::-;32327:34;32323:1;32315:6;32311:14;32304:58;32396:14;32391:2;32383:6;32379:15;32372:39;32187:231;:::o;32424:155::-;32564:7;32560:1;32552:6;32548:14;32541:31;32424:155;:::o;32585:228::-;32725:34;32721:1;32713:6;32709:14;32702:58;32794:11;32789:2;32781:6;32777:15;32770:36;32585:228;:::o;32819:234::-;32959:34;32955:1;32947:6;32943:14;32936:58;33028:17;33023:2;33015:6;33011:15;33004:42;32819:234;:::o;33059:177::-;33199:29;33195:1;33187:6;33183:14;33176:53;33059:177;:::o;33242:220::-;33382:34;33378:1;33370:6;33366:14;33359:58;33451:3;33446:2;33438:6;33434:15;33427:28;33242:220;:::o;33468:181::-;33608:33;33604:1;33596:6;33592:14;33585:57;33468:181;:::o;33655:236::-;33795:34;33791:1;33783:6;33779:14;33772:58;33864:19;33859:2;33851:6;33847:15;33840:44;33655:236;:::o;33897:181::-;34037:33;34033:1;34025:6;34021:14;34014:57;33897:181;:::o;34084:122::-;34157:24;34175:5;34157:24;:::i;:::-;34150:5;34147:35;34137:63;;34196:1;34193;34186:12;34137:63;34084:122;:::o;34212:116::-;34282:21;34297:5;34282:21;:::i;:::-;34275:5;34272:32;34262:60;;34318:1;34315;34308:12;34262:60;34212:116;:::o;34334:120::-;34406:23;34423:5;34406:23;:::i;:::-;34399:5;34396:34;34386:62;;34444:1;34441;34434:12;34386:62;34334:120;:::o;34460:122::-;34533:24;34551:5;34533:24;:::i;:::-;34526:5;34523:35;34513:63;;34572:1;34569;34562:12;34513:63;34460:122;:::o

Swarm Source

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