ETH Price: $3,133.70 (-8.41%)
Gas: 6 Gwei

Token

CryptoGunz (GUNZ)
 

Overview

Max Total Supply

731 GUNZ

Holders

150

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
1 GUNZ
0x42fea9564b1ba9132db64dc09bccb1f4c1a062b9
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:
CryptoGunz

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-03-30
*/

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

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

pragma solidity ^0.8.0;

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

pragma solidity ^0.8.0;

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

    uint256 size;
    // solhint-disable-next-line no-inline-assembly
    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");

    // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
    (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");

    // solhint-disable-next-line avoid-low-level-calls
    (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");

    // solhint-disable-next-line avoid-low-level-calls
    (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");

    // solhint-disable-next-line avoid-low-level-calls
    (bool success, bytes memory returndata) = target.delegatecall(data);
    return _verifyCallResult(success, returndata, errorMessage);
  }

  function _verifyCallResult(
    bool success,
    bytes memory returndata,
    string memory errorMessage
  ) private 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

        // solhint-disable-next-line no-inline-assembly
        assembly {
          let returndata_size := mload(returndata)
          revert(add(32, returndata), returndata_size)
        }
      } else {
        revert(errorMessage);
      }
    }
  }
}

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

pragma solidity ^0.8.0;

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

  function _msgData() internal view virtual returns (bytes calldata) {
    this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
    return msg.data;
  }
}

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

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
  bytes16 private constant alphabet = "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] = alphabet[value & 0xf];
      value >>= 4;
    }
    require(value == 0, "Strings: hex length insufficient");
    return string(buffer);
  }
}

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

pragma solidity ^0.8.0;

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

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

pragma solidity ^0.8.0;

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

  // Token name
  string private _name;

  // Token symbol
  string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

  /**
   * @dev Base URI for computing {tokenURI}. 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 || ERC721.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 ||
      ERC721.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(to).onERC721Received.selector;
      } catch (bytes memory reason) {
        if (reason.length == 0) {
          revert("ERC721: transfer to non ERC721Receiver implementer");
        } else {
          // solhint-disable-next-line no-inline-assembly
          assembly {
            revert(add(32, reason), mload(reason))
          }
        }
      }
    } else {
      return true;
    }
  }

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
  address private _owner;

  event OwnershipTransferred(
    address indexed previousOwner,
    address indexed newOwner
  );

  /**
   * @dev Initializes the contract setting the deployer as the initial owner.
   */
  constructor() {
    address msgSender = _msgSender();
    _owner = msgSender;
    emit OwnershipTransferred(address(0), msgSender);
  }

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

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

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

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

// File: contracts/CryptoGunz.sol

pragma solidity ^0.8.0;

contract CryptoGunz is ERC721Enumerable, Ownable {
  uint256 public constant MAX_NFT_SUPPLY = 7500;
  bool public saleStarted = false;

  constructor() ERC721("CryptoGunz", "GUNZ") {
    transferOwnership(0xec83dED4578FB8C5e14851D9F942A9871E295ad6);
  }

  function _baseURI() internal view virtual override returns (string memory) {
    return "https://api.cryptogunz.io/";
  }

  function getCryptogunzPrice() public view returns (uint256) {
    require(saleStarted == true, "Sale has not started.");
    require(totalSupply() < MAX_NFT_SUPPLY, "Sale has ended.");

    uint256 currentSupply = totalSupply();

    if (currentSupply == 7499) {
      return 3800000000000000000; // 7499 3.8 ETH
    } else if (currentSupply >= 7496) {
      return 2200000000000000000; // 7496 - 7498 2.2 ETH
    } else if (currentSupply >= 7475) {
      return 1400000000000000000; // 7475 - 7495 1.4 ETH
    } else if (currentSupply >= 7400) {
      return 1000000000000000000; // 7400 - 7474 1 ETH
    } else if (currentSupply >= 7300) {
      return 800000000000000000; // 7300 - 7399 0.8 ETH
    } else if (currentSupply >= 7200) {
      return 700000000000000000; // 7200 - 7299 0.7 ETH
    } else if (currentSupply >= 7100) {
      return 600000000000000000; // 7100 - 7199 0.6 ETH
    } else if (currentSupply >= 6650) {
      return 500000000000000000; // 6650 - 7099 0.5 ETH
    } else if (currentSupply >= 6200) {
      return 400000000000000000; // 6200 - 6649 0.4 ETH
    } else if (currentSupply >= 5600) {
      return 300000000000000000; // 5600 - 6199 0.3 ETH
    } else if (currentSupply >= 5000) {
      return 250000000000000000; // 5000 - 5599 0.25 ETH
    } else if (currentSupply >= 4500) {
      return 200000000000000000; // 4500 - 4999 0.2 ETH
    } else if (currentSupply >= 4000) {
      return 175000000000000000; // 4000 - 4999 0.175 ETH
    } else if (currentSupply >= 3500) {
      return 150000000000000000; // 3500 - 3999 0.15 ETH
    } else if (currentSupply >= 3000) {
      return 125000000000000000; // 3000 - 3499 0.125 ETH
    } else if (currentSupply >= 2500) {
      return 100000000000000000; // 2500 - 2999 0.1 ETH
    } else if (currentSupply >= 2000) {
      return 90000000000000000; // 2000 - 2499 0.09 ETH
    } else if (currentSupply >= 1500) {
      return 80000000000000000; // 1500 - 1999 0.08 ETH
    } else if (currentSupply >= 1000) {
      return 70000000000000000; // 1000 - 1499 0.07 ETH
    } else if (currentSupply >= 500) {
      return 60000000000000000; // 500 - 999 0.06 ETH
    } else {
      return 50000000000000000; // 0 - 499 0.05 ETH
    }
  }

  function purchaseCryptogun(uint256 amountToMint) public payable {
    require(totalSupply() < MAX_NFT_SUPPLY, "Sale has ended.");
    require(amountToMint > 0, "You must purchase at least one Cryptogun.");
    require(
      amountToMint <= 100,
      "You can only purchase max 100 Cryptogunz at a time."
    );
    require(
      totalSupply() + amountToMint <= MAX_NFT_SUPPLY,
      "The amount you are trying to purchase exceeds MAX_NFT_SUPPLY."
    );
    require(
      getCryptogunzPrice() * amountToMint == msg.value,
      "Incorrect Ether value."
    );

    for (uint256 i = 0; i < amountToMint; i++) {
      uint256 mintIndex = totalSupply();
      _safeMint(msg.sender, mintIndex);
    }
  }

  function withdraw() public payable onlyOwner {
    require(payable(msg.sender).send(address(this).balance));
  }

  function startDrop() public onlyOwner {
    saleStarted = true;
  }

  function pauseDrop() public onlyOwner {
    saleStarted = false;
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"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":"getCryptogunzPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pauseDrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountToMint","type":"uint256"}],"name":"purchaseCryptogun","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startDrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

60806040526000600a60146101000a81548160ff0219169083151502179055503480156200002c57600080fd5b506040518060400160405280600a81526020017f43727970746f47756e7a000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f47554e5a000000000000000000000000000000000000000000000000000000008152508160009080519060200190620000b19291906200039d565b508060019080519060200190620000ca9291906200039d565b5050506000620000df620001a960201b60201c565b905080600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350620001a373ec83ded4578fb8c5e14851d9f942a9871e295ad6620001b160201b60201c565b620005b1565b600033905090565b620001c1620001a960201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620001e76200037360201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000240576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002379062000519565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415620002b3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002aa90620004f7565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620003ab906200054c565b90600052602060002090601f016020900481019282620003cf57600085556200041b565b82601f10620003ea57805160ff19168380011785556200041b565b828001600101855582156200041b579182015b828111156200041a578251825591602001919060010190620003fd565b5b5090506200042a91906200042e565b5090565b5b80821115620004495760008160009055506001016200042f565b5090565b60006200045c6026836200053b565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000620004c46020836200053b565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000602082019050818103600083015262000512816200044d565b9050919050565b600060208201905081810360008301526200053481620004b5565b9050919050565b600082825260208201905092915050565b600060028204905060018216806200056557607f821691505b602082108114156200057c576200057b62000582565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b613e3e80620005c16000396000f3fe6080604052600436106101815760003560e01c806356ebe4e9116100d157806395d89b411161008a578063b88d4fde11610064578063b88d4fde14610530578063c87b56dd14610559578063e985e9c514610596578063f2fde38b146105d357610181565b806395d89b41146104b1578063a22cb465146104dc578063b5077f441461050557610181565b806356ebe4e9146103ae5780635c474f9e146103ca5780636352211e146103f557806370a0823114610432578063715018a61461046f5780638da5cb5b1461048657610181565b80632808c92c1161013e5780633ccfd60b116101185780633ccfd60b1461031357806342842e0e1461031d578063499bba97146103465780634f6ccce71461037157610181565b80632808c92c146102a85780632f745c59146102bf57806334d84c7b146102fc57610181565b806301ffc9a71461018657806306fdde03146101c3578063081812fc146101ee578063095ea7b31461022b57806318160ddd1461025457806323b872dd1461027f575b600080fd5b34801561019257600080fd5b506101ad60048036038101906101a89190612c10565b6105fc565b6040516101ba919061366c565b60405180910390f35b3480156101cf57600080fd5b506101d8610676565b6040516101e59190613687565b60405180910390f35b3480156101fa57600080fd5b5061021560048036038101906102109190612c62565b610708565b6040516102229190613605565b60405180910390f35b34801561023757600080fd5b50610252600480360381019061024d9190612bd4565b61078d565b005b34801561026057600080fd5b506102696108a5565b60405161027691906139a9565b60405180910390f35b34801561028b57600080fd5b506102a660048036038101906102a19190612ace565b6108b2565b005b3480156102b457600080fd5b506102bd610912565b005b3480156102cb57600080fd5b506102e660048036038101906102e19190612bd4565b6109ab565b6040516102f391906139a9565b60405180910390f35b34801561030857600080fd5b50610311610a50565b005b61031b610ae9565b005b34801561032957600080fd5b50610344600480360381019061033f9190612ace565b610ba5565b005b34801561035257600080fd5b5061035b610bc5565b60405161036891906139a9565b60405180910390f35b34801561037d57600080fd5b5061039860048036038101906103939190612c62565b610e8a565b6040516103a591906139a9565b60405180910390f35b6103c860048036038101906103c39190612c62565b610f21565b005b3480156103d657600080fd5b506103df6110d7565b6040516103ec919061366c565b60405180910390f35b34801561040157600080fd5b5061041c60048036038101906104179190612c62565b6110ea565b6040516104299190613605565b60405180910390f35b34801561043e57600080fd5b5061045960048036038101906104549190612a69565b61119c565b60405161046691906139a9565b60405180910390f35b34801561047b57600080fd5b50610484611254565b005b34801561049257600080fd5b5061049b611391565b6040516104a89190613605565b60405180910390f35b3480156104bd57600080fd5b506104c66113bb565b6040516104d39190613687565b60405180910390f35b3480156104e857600080fd5b5061050360048036038101906104fe9190612b98565b61144d565b005b34801561051157600080fd5b5061051a6115ce565b60405161052791906139a9565b60405180910390f35b34801561053c57600080fd5b5061055760048036038101906105529190612b1d565b6115d4565b005b34801561056557600080fd5b50610580600480360381019061057b9190612c62565b611636565b60405161058d9190613687565b60405180910390f35b3480156105a257600080fd5b506105bd60048036038101906105b89190612a92565b6116dd565b6040516105ca919061366c565b60405180910390f35b3480156105df57600080fd5b506105fa60048036038101906105f59190612a69565b611771565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061066f575061066e8261191d565b5b9050919050565b60606000805461068590613c33565b80601f01602080910402602001604051908101604052809291908181526020018280546106b190613c33565b80156106fe5780601f106106d3576101008083540402835291602001916106fe565b820191906000526020600020905b8154815290600101906020018083116106e157829003601f168201915b5050505050905090565b6000610713826119ff565b610752576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610749906138c9565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610798826110ea565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610809576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161080090613949565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610828611a6b565b73ffffffffffffffffffffffffffffffffffffffff161480610857575061085681610851611a6b565b6116dd565b5b610896576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161088d90613829565b60405180910390fd5b6108a08383611a73565b505050565b6000600880549050905090565b6108c36108bd611a6b565b82611b2c565b610902576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108f990613969565b60405180910390fd5b61090d838383611c0a565b505050565b61091a611a6b565b73ffffffffffffffffffffffffffffffffffffffff16610938611391565b73ffffffffffffffffffffffffffffffffffffffff161461098e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610985906138e9565b60405180910390fd5b6000600a60146101000a81548160ff021916908315150217905550565b60006109b68361119c565b82106109f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109ee906136e9565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610a58611a6b565b73ffffffffffffffffffffffffffffffffffffffff16610a76611391565b73ffffffffffffffffffffffffffffffffffffffff1614610acc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac3906138e9565b60405180910390fd5b6001600a60146101000a81548160ff021916908315150217905550565b610af1611a6b565b73ffffffffffffffffffffffffffffffffffffffff16610b0f611391565b73ffffffffffffffffffffffffffffffffffffffff1614610b65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5c906138e9565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050610ba357600080fd5b565b610bc0838383604051806020016040528060008152506115d4565b505050565b600060011515600a60149054906101000a900460ff16151514610c1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c14906136c9565b60405180910390fd5b611d4c610c286108a5565b10610c68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5f90613789565b60405180910390fd5b6000610c726108a5565b9050611d4b811415610c8f576734bc4fdde27c0000915050610e87565b611d488110610ca957671e87f85809dc0000915050610e87565b611d338110610cc35767136dcc951d8c0000915050610e87565b611ce88110610cdd57670de0b6b3a7640000915050610e87565b611c848110610cf757670b1a2bc2ec500000915050610e87565b611c208110610d11576709b6e64a8ec60000915050610e87565b611bbc8110610d2b57670853a0d2313c0000915050610e87565b6119fa8110610d45576706f05b59d3b20000915050610e87565b6118388110610d5f5767058d15e176280000915050610e87565b6115e08110610d7957670429d069189e0000915050610e87565b6113888110610d93576703782dace9d90000915050610e87565b6111948110610dad576702c68af0bb140000915050610e87565b610fa08110610dc75767026db992a3b18000915050610e87565b610dac8110610de157670214e8348c4f0000915050610e87565b610bb88110610dfb576701bc16d674ec8000915050610e87565b6109c48110610e155767016345785d8a0000915050610e87565b6107d08110610e2f5767013fbe85edc90000915050610e87565b6105dc8110610e495767011c37937e080000915050610e87565b6103e88110610e625766f8b0a10e470000915050610e87565b6101f48110610e7b5766d529ae9e860000915050610e87565b66b1a2bc2ec500009150505b90565b6000610e946108a5565b8210610ed5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ecc90613989565b60405180910390fd5b60088281548110610f0f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b611d4c610f2c6108a5565b10610f6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6390613789565b60405180910390fd5b60008111610faf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa6906136a9565b60405180910390fd5b6064811115610ff3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fea90613809565b60405180910390fd5b611d4c81610fff6108a5565b6110099190613a68565b111561104a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104190613749565b60405180910390fd5b3481611054610bc5565b61105e9190613aef565b1461109e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109590613889565b60405180910390fd5b60005b818110156110d35760006110b36108a5565b90506110bf3382611e66565b5080806110cb90613c65565b9150506110a1565b5050565b600a60149054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118a90613869565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561120d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120490613849565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61125c611a6b565b73ffffffffffffffffffffffffffffffffffffffff1661127a611391565b73ffffffffffffffffffffffffffffffffffffffff16146112d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c7906138e9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546113ca90613c33565b80601f01602080910402602001604051908101604052809291908181526020018280546113f690613c33565b80156114435780601f1061141857610100808354040283529160200191611443565b820191906000526020600020905b81548152906001019060200180831161142657829003601f168201915b5050505050905090565b611455611a6b565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ba906137c9565b60405180910390fd5b80600560006114d0611a6b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661157d611a6b565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516115c2919061366c565b60405180910390a35050565b611d4c81565b6115e56115df611a6b565b83611b2c565b611624576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161b90613969565b60405180910390fd5b61163084848484611e84565b50505050565b6060611641826119ff565b611680576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167790613929565b60405180910390fd5b600061168a611ee0565b905060008151116116aa57604051806020016040528060008152506116d5565b806116b484611f1d565b6040516020016116c59291906135e1565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611779611a6b565b73ffffffffffffffffffffffffffffffffffffffff16611797611391565b73ffffffffffffffffffffffffffffffffffffffff16146117ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e4906138e9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561185d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185490613729565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806119e857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806119f857506119f7826120ca565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611ae6836110ea565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611b37826119ff565b611b76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6d906137e9565b60405180910390fd5b6000611b81836110ea565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611bf057508373ffffffffffffffffffffffffffffffffffffffff16611bd884610708565b73ffffffffffffffffffffffffffffffffffffffff16145b80611c015750611c0081856116dd565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611c2a826110ea565b73ffffffffffffffffffffffffffffffffffffffff1614611c80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7790613909565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611cf0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce7906137a9565b60405180910390fd5b611cfb838383612134565b611d06600082611a73565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d569190613b49565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611dad9190613a68565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b611e80828260405180602001604052806000815250612248565b5050565b611e8f848484611c0a565b611e9b848484846122a3565b611eda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed190613709565b60405180910390fd5b50505050565b60606040518060400160405280601a81526020017f68747470733a2f2f6170692e63727970746f67756e7a2e696f2f000000000000815250905090565b60606000821415611f65576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506120c5565b600082905060005b60008214611f97578080611f8090613c65565b915050600a82611f909190613abe565b9150611f6d565b60008167ffffffffffffffff811115611fd9577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561200b5781602001600182028036833780820191505090505b5090505b600085146120be576001826120249190613b49565b9150600a856120339190613cae565b603061203f9190613a68565b60f81b81838151811061207b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856120b79190613abe565b945061200f565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61213f83838361243a565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156121825761217d8161243f565b6121c1565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146121c0576121bf8382612488565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612204576121ff816125f5565b612243565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612242576122418282612738565b5b5b505050565b61225283836127b7565b61225f60008484846122a3565b61229e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229590613709565b60405180910390fd5b505050565b60006122c48473ffffffffffffffffffffffffffffffffffffffff16612985565b1561242d578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026122ed611a6b565b8786866040518563ffffffff1660e01b815260040161230f9493929190613620565b602060405180830381600087803b15801561232957600080fd5b505af192505050801561235a57506040513d601f19601f820116820180604052508101906123579190612c39565b60015b6123dd573d806000811461238a576040519150601f19603f3d011682016040523d82523d6000602084013e61238f565b606091505b506000815114156123d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123cc90613709565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612432565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016124958461119c565b61249f9190613b49565b9050600060076000848152602001908152602001600020549050818114612584576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506126099190613b49565b905060006009600084815260200190815260200160002054905060006008838154811061265f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080600883815481106126a7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061271c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006127438361119c565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612827576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161281e906138a9565b60405180910390fd5b612830816119ff565b15612870576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161286790613769565b60405180910390fd5b61287c60008383612134565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128cc9190613a68565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b60006129ab6129a6846139f5565b6139c4565b9050828152602081018484840111156129c357600080fd5b6129ce848285613bf1565b509392505050565b6000813590506129e581613dac565b92915050565b6000813590506129fa81613dc3565b92915050565b600081359050612a0f81613dda565b92915050565b600081519050612a2481613dda565b92915050565b600082601f830112612a3b57600080fd5b8135612a4b848260208601612998565b91505092915050565b600081359050612a6381613df1565b92915050565b600060208284031215612a7b57600080fd5b6000612a89848285016129d6565b91505092915050565b60008060408385031215612aa557600080fd5b6000612ab3858286016129d6565b9250506020612ac4858286016129d6565b9150509250929050565b600080600060608486031215612ae357600080fd5b6000612af1868287016129d6565b9350506020612b02868287016129d6565b9250506040612b1386828701612a54565b9150509250925092565b60008060008060808587031215612b3357600080fd5b6000612b41878288016129d6565b9450506020612b52878288016129d6565b9350506040612b6387828801612a54565b925050606085013567ffffffffffffffff811115612b8057600080fd5b612b8c87828801612a2a565b91505092959194509250565b60008060408385031215612bab57600080fd5b6000612bb9858286016129d6565b9250506020612bca858286016129eb565b9150509250929050565b60008060408385031215612be757600080fd5b6000612bf5858286016129d6565b9250506020612c0685828601612a54565b9150509250929050565b600060208284031215612c2257600080fd5b6000612c3084828501612a00565b91505092915050565b600060208284031215612c4b57600080fd5b6000612c5984828501612a15565b91505092915050565b600060208284031215612c7457600080fd5b6000612c8284828501612a54565b91505092915050565b612c9481613b7d565b82525050565b612ca381613b8f565b82525050565b6000612cb482613a25565b612cbe8185613a3b565b9350612cce818560208601613c00565b612cd781613d9b565b840191505092915050565b6000612ced82613a30565b612cf78185613a4c565b9350612d07818560208601613c00565b612d1081613d9b565b840191505092915050565b6000612d2682613a30565b612d308185613a5d565b9350612d40818560208601613c00565b80840191505092915050565b6000612d59602983613a4c565b91507f596f75206d757374207075726368617365206174206c65617374206f6e65204360008301527f727970746f67756e2e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000612dbf601583613a4c565b91507f53616c6520686173206e6f7420737461727465642e00000000000000000000006000830152602082019050919050565b6000612dff602b83613a4c565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b6000612e65603283613a4c565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000612ecb602683613a4c565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612f31603d83613a4c565b91507f54686520616d6f756e7420796f752061726520747279696e6720746f2070757260008301527f63686173652065786365656473204d41585f4e46545f535550504c592e0000006020830152604082019050919050565b6000612f97601c83613a4c565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000612fd7600f83613a4c565b91507f53616c652068617320656e6465642e00000000000000000000000000000000006000830152602082019050919050565b6000613017602483613a4c565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061307d601983613a4c565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b60006130bd602c83613a4c565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613123603383613a4c565b91507f596f752063616e206f6e6c79207075726368617365206d61782031303020437260008301527f7970746f67756e7a20617420612074696d652e000000000000000000000000006020830152604082019050919050565b6000613189603883613a4c565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b60006131ef602a83613a4c565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000613255602983613a4c565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006132bb601683613a4c565b91507f496e636f72726563742045746865722076616c75652e000000000000000000006000830152602082019050919050565b60006132fb602083613a4c565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b600061333b602c83613a4c565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006133a1602083613a4c565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006133e1602983613a4c565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613447602f83613a4c565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b60006134ad602183613a4c565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613513603183613a4c565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000613579602c83613a4c565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b6135db81613be7565b82525050565b60006135ed8285612d1b565b91506135f98284612d1b565b91508190509392505050565b600060208201905061361a6000830184612c8b565b92915050565b60006080820190506136356000830187612c8b565b6136426020830186612c8b565b61364f60408301856135d2565b81810360608301526136618184612ca9565b905095945050505050565b60006020820190506136816000830184612c9a565b92915050565b600060208201905081810360008301526136a18184612ce2565b905092915050565b600060208201905081810360008301526136c281612d4c565b9050919050565b600060208201905081810360008301526136e281612db2565b9050919050565b6000602082019050818103600083015261370281612df2565b9050919050565b6000602082019050818103600083015261372281612e58565b9050919050565b6000602082019050818103600083015261374281612ebe565b9050919050565b6000602082019050818103600083015261376281612f24565b9050919050565b6000602082019050818103600083015261378281612f8a565b9050919050565b600060208201905081810360008301526137a281612fca565b9050919050565b600060208201905081810360008301526137c28161300a565b9050919050565b600060208201905081810360008301526137e281613070565b9050919050565b60006020820190508181036000830152613802816130b0565b9050919050565b6000602082019050818103600083015261382281613116565b9050919050565b600060208201905081810360008301526138428161317c565b9050919050565b60006020820190508181036000830152613862816131e2565b9050919050565b6000602082019050818103600083015261388281613248565b9050919050565b600060208201905081810360008301526138a2816132ae565b9050919050565b600060208201905081810360008301526138c2816132ee565b9050919050565b600060208201905081810360008301526138e28161332e565b9050919050565b6000602082019050818103600083015261390281613394565b9050919050565b60006020820190508181036000830152613922816133d4565b9050919050565b600060208201905081810360008301526139428161343a565b9050919050565b60006020820190508181036000830152613962816134a0565b9050919050565b6000602082019050818103600083015261398281613506565b9050919050565b600060208201905081810360008301526139a28161356c565b9050919050565b60006020820190506139be60008301846135d2565b92915050565b6000604051905081810181811067ffffffffffffffff821117156139eb576139ea613d6c565b5b8060405250919050565b600067ffffffffffffffff821115613a1057613a0f613d6c565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613a7382613be7565b9150613a7e83613be7565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613ab357613ab2613cdf565b5b828201905092915050565b6000613ac982613be7565b9150613ad483613be7565b925082613ae457613ae3613d0e565b5b828204905092915050565b6000613afa82613be7565b9150613b0583613be7565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613b3e57613b3d613cdf565b5b828202905092915050565b6000613b5482613be7565b9150613b5f83613be7565b925082821015613b7257613b71613cdf565b5b828203905092915050565b6000613b8882613bc7565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613c1e578082015181840152602081019050613c03565b83811115613c2d576000848401525b50505050565b60006002820490506001821680613c4b57607f821691505b60208210811415613c5f57613c5e613d3d565b5b50919050565b6000613c7082613be7565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613ca357613ca2613cdf565b5b600182019050919050565b6000613cb982613be7565b9150613cc483613be7565b925082613cd457613cd3613d0e565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b613db581613b7d565b8114613dc057600080fd5b50565b613dcc81613b8f565b8114613dd757600080fd5b50565b613de381613b9b565b8114613dee57600080fd5b50565b613dfa81613be7565b8114613e0557600080fd5b5056fea26469706673582212205018a2af076e8e91e8dc24771fe315da7f569881b157a4353643d1ea349aad2664736f6c63430008000033

Deployed Bytecode

0x6080604052600436106101815760003560e01c806356ebe4e9116100d157806395d89b411161008a578063b88d4fde11610064578063b88d4fde14610530578063c87b56dd14610559578063e985e9c514610596578063f2fde38b146105d357610181565b806395d89b41146104b1578063a22cb465146104dc578063b5077f441461050557610181565b806356ebe4e9146103ae5780635c474f9e146103ca5780636352211e146103f557806370a0823114610432578063715018a61461046f5780638da5cb5b1461048657610181565b80632808c92c1161013e5780633ccfd60b116101185780633ccfd60b1461031357806342842e0e1461031d578063499bba97146103465780634f6ccce71461037157610181565b80632808c92c146102a85780632f745c59146102bf57806334d84c7b146102fc57610181565b806301ffc9a71461018657806306fdde03146101c3578063081812fc146101ee578063095ea7b31461022b57806318160ddd1461025457806323b872dd1461027f575b600080fd5b34801561019257600080fd5b506101ad60048036038101906101a89190612c10565b6105fc565b6040516101ba919061366c565b60405180910390f35b3480156101cf57600080fd5b506101d8610676565b6040516101e59190613687565b60405180910390f35b3480156101fa57600080fd5b5061021560048036038101906102109190612c62565b610708565b6040516102229190613605565b60405180910390f35b34801561023757600080fd5b50610252600480360381019061024d9190612bd4565b61078d565b005b34801561026057600080fd5b506102696108a5565b60405161027691906139a9565b60405180910390f35b34801561028b57600080fd5b506102a660048036038101906102a19190612ace565b6108b2565b005b3480156102b457600080fd5b506102bd610912565b005b3480156102cb57600080fd5b506102e660048036038101906102e19190612bd4565b6109ab565b6040516102f391906139a9565b60405180910390f35b34801561030857600080fd5b50610311610a50565b005b61031b610ae9565b005b34801561032957600080fd5b50610344600480360381019061033f9190612ace565b610ba5565b005b34801561035257600080fd5b5061035b610bc5565b60405161036891906139a9565b60405180910390f35b34801561037d57600080fd5b5061039860048036038101906103939190612c62565b610e8a565b6040516103a591906139a9565b60405180910390f35b6103c860048036038101906103c39190612c62565b610f21565b005b3480156103d657600080fd5b506103df6110d7565b6040516103ec919061366c565b60405180910390f35b34801561040157600080fd5b5061041c60048036038101906104179190612c62565b6110ea565b6040516104299190613605565b60405180910390f35b34801561043e57600080fd5b5061045960048036038101906104549190612a69565b61119c565b60405161046691906139a9565b60405180910390f35b34801561047b57600080fd5b50610484611254565b005b34801561049257600080fd5b5061049b611391565b6040516104a89190613605565b60405180910390f35b3480156104bd57600080fd5b506104c66113bb565b6040516104d39190613687565b60405180910390f35b3480156104e857600080fd5b5061050360048036038101906104fe9190612b98565b61144d565b005b34801561051157600080fd5b5061051a6115ce565b60405161052791906139a9565b60405180910390f35b34801561053c57600080fd5b5061055760048036038101906105529190612b1d565b6115d4565b005b34801561056557600080fd5b50610580600480360381019061057b9190612c62565b611636565b60405161058d9190613687565b60405180910390f35b3480156105a257600080fd5b506105bd60048036038101906105b89190612a92565b6116dd565b6040516105ca919061366c565b60405180910390f35b3480156105df57600080fd5b506105fa60048036038101906105f59190612a69565b611771565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061066f575061066e8261191d565b5b9050919050565b60606000805461068590613c33565b80601f01602080910402602001604051908101604052809291908181526020018280546106b190613c33565b80156106fe5780601f106106d3576101008083540402835291602001916106fe565b820191906000526020600020905b8154815290600101906020018083116106e157829003601f168201915b5050505050905090565b6000610713826119ff565b610752576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610749906138c9565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610798826110ea565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610809576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161080090613949565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610828611a6b565b73ffffffffffffffffffffffffffffffffffffffff161480610857575061085681610851611a6b565b6116dd565b5b610896576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161088d90613829565b60405180910390fd5b6108a08383611a73565b505050565b6000600880549050905090565b6108c36108bd611a6b565b82611b2c565b610902576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108f990613969565b60405180910390fd5b61090d838383611c0a565b505050565b61091a611a6b565b73ffffffffffffffffffffffffffffffffffffffff16610938611391565b73ffffffffffffffffffffffffffffffffffffffff161461098e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610985906138e9565b60405180910390fd5b6000600a60146101000a81548160ff021916908315150217905550565b60006109b68361119c565b82106109f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109ee906136e9565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610a58611a6b565b73ffffffffffffffffffffffffffffffffffffffff16610a76611391565b73ffffffffffffffffffffffffffffffffffffffff1614610acc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac3906138e9565b60405180910390fd5b6001600a60146101000a81548160ff021916908315150217905550565b610af1611a6b565b73ffffffffffffffffffffffffffffffffffffffff16610b0f611391565b73ffffffffffffffffffffffffffffffffffffffff1614610b65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5c906138e9565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050610ba357600080fd5b565b610bc0838383604051806020016040528060008152506115d4565b505050565b600060011515600a60149054906101000a900460ff16151514610c1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c14906136c9565b60405180910390fd5b611d4c610c286108a5565b10610c68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5f90613789565b60405180910390fd5b6000610c726108a5565b9050611d4b811415610c8f576734bc4fdde27c0000915050610e87565b611d488110610ca957671e87f85809dc0000915050610e87565b611d338110610cc35767136dcc951d8c0000915050610e87565b611ce88110610cdd57670de0b6b3a7640000915050610e87565b611c848110610cf757670b1a2bc2ec500000915050610e87565b611c208110610d11576709b6e64a8ec60000915050610e87565b611bbc8110610d2b57670853a0d2313c0000915050610e87565b6119fa8110610d45576706f05b59d3b20000915050610e87565b6118388110610d5f5767058d15e176280000915050610e87565b6115e08110610d7957670429d069189e0000915050610e87565b6113888110610d93576703782dace9d90000915050610e87565b6111948110610dad576702c68af0bb140000915050610e87565b610fa08110610dc75767026db992a3b18000915050610e87565b610dac8110610de157670214e8348c4f0000915050610e87565b610bb88110610dfb576701bc16d674ec8000915050610e87565b6109c48110610e155767016345785d8a0000915050610e87565b6107d08110610e2f5767013fbe85edc90000915050610e87565b6105dc8110610e495767011c37937e080000915050610e87565b6103e88110610e625766f8b0a10e470000915050610e87565b6101f48110610e7b5766d529ae9e860000915050610e87565b66b1a2bc2ec500009150505b90565b6000610e946108a5565b8210610ed5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ecc90613989565b60405180910390fd5b60088281548110610f0f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b611d4c610f2c6108a5565b10610f6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6390613789565b60405180910390fd5b60008111610faf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa6906136a9565b60405180910390fd5b6064811115610ff3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fea90613809565b60405180910390fd5b611d4c81610fff6108a5565b6110099190613a68565b111561104a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104190613749565b60405180910390fd5b3481611054610bc5565b61105e9190613aef565b1461109e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109590613889565b60405180910390fd5b60005b818110156110d35760006110b36108a5565b90506110bf3382611e66565b5080806110cb90613c65565b9150506110a1565b5050565b600a60149054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118a90613869565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561120d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120490613849565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61125c611a6b565b73ffffffffffffffffffffffffffffffffffffffff1661127a611391565b73ffffffffffffffffffffffffffffffffffffffff16146112d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c7906138e9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546113ca90613c33565b80601f01602080910402602001604051908101604052809291908181526020018280546113f690613c33565b80156114435780601f1061141857610100808354040283529160200191611443565b820191906000526020600020905b81548152906001019060200180831161142657829003601f168201915b5050505050905090565b611455611a6b565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ba906137c9565b60405180910390fd5b80600560006114d0611a6b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661157d611a6b565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516115c2919061366c565b60405180910390a35050565b611d4c81565b6115e56115df611a6b565b83611b2c565b611624576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161b90613969565b60405180910390fd5b61163084848484611e84565b50505050565b6060611641826119ff565b611680576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167790613929565b60405180910390fd5b600061168a611ee0565b905060008151116116aa57604051806020016040528060008152506116d5565b806116b484611f1d565b6040516020016116c59291906135e1565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611779611a6b565b73ffffffffffffffffffffffffffffffffffffffff16611797611391565b73ffffffffffffffffffffffffffffffffffffffff16146117ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e4906138e9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561185d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185490613729565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806119e857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806119f857506119f7826120ca565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611ae6836110ea565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611b37826119ff565b611b76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6d906137e9565b60405180910390fd5b6000611b81836110ea565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611bf057508373ffffffffffffffffffffffffffffffffffffffff16611bd884610708565b73ffffffffffffffffffffffffffffffffffffffff16145b80611c015750611c0081856116dd565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611c2a826110ea565b73ffffffffffffffffffffffffffffffffffffffff1614611c80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7790613909565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611cf0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce7906137a9565b60405180910390fd5b611cfb838383612134565b611d06600082611a73565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d569190613b49565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611dad9190613a68565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b611e80828260405180602001604052806000815250612248565b5050565b611e8f848484611c0a565b611e9b848484846122a3565b611eda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed190613709565b60405180910390fd5b50505050565b60606040518060400160405280601a81526020017f68747470733a2f2f6170692e63727970746f67756e7a2e696f2f000000000000815250905090565b60606000821415611f65576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506120c5565b600082905060005b60008214611f97578080611f8090613c65565b915050600a82611f909190613abe565b9150611f6d565b60008167ffffffffffffffff811115611fd9577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561200b5781602001600182028036833780820191505090505b5090505b600085146120be576001826120249190613b49565b9150600a856120339190613cae565b603061203f9190613a68565b60f81b81838151811061207b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856120b79190613abe565b945061200f565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61213f83838361243a565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156121825761217d8161243f565b6121c1565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146121c0576121bf8382612488565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612204576121ff816125f5565b612243565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612242576122418282612738565b5b5b505050565b61225283836127b7565b61225f60008484846122a3565b61229e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229590613709565b60405180910390fd5b505050565b60006122c48473ffffffffffffffffffffffffffffffffffffffff16612985565b1561242d578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026122ed611a6b565b8786866040518563ffffffff1660e01b815260040161230f9493929190613620565b602060405180830381600087803b15801561232957600080fd5b505af192505050801561235a57506040513d601f19601f820116820180604052508101906123579190612c39565b60015b6123dd573d806000811461238a576040519150601f19603f3d011682016040523d82523d6000602084013e61238f565b606091505b506000815114156123d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123cc90613709565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612432565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016124958461119c565b61249f9190613b49565b9050600060076000848152602001908152602001600020549050818114612584576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506126099190613b49565b905060006009600084815260200190815260200160002054905060006008838154811061265f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080600883815481106126a7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061271c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006127438361119c565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612827576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161281e906138a9565b60405180910390fd5b612830816119ff565b15612870576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161286790613769565b60405180910390fd5b61287c60008383612134565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128cc9190613a68565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b60006129ab6129a6846139f5565b6139c4565b9050828152602081018484840111156129c357600080fd5b6129ce848285613bf1565b509392505050565b6000813590506129e581613dac565b92915050565b6000813590506129fa81613dc3565b92915050565b600081359050612a0f81613dda565b92915050565b600081519050612a2481613dda565b92915050565b600082601f830112612a3b57600080fd5b8135612a4b848260208601612998565b91505092915050565b600081359050612a6381613df1565b92915050565b600060208284031215612a7b57600080fd5b6000612a89848285016129d6565b91505092915050565b60008060408385031215612aa557600080fd5b6000612ab3858286016129d6565b9250506020612ac4858286016129d6565b9150509250929050565b600080600060608486031215612ae357600080fd5b6000612af1868287016129d6565b9350506020612b02868287016129d6565b9250506040612b1386828701612a54565b9150509250925092565b60008060008060808587031215612b3357600080fd5b6000612b41878288016129d6565b9450506020612b52878288016129d6565b9350506040612b6387828801612a54565b925050606085013567ffffffffffffffff811115612b8057600080fd5b612b8c87828801612a2a565b91505092959194509250565b60008060408385031215612bab57600080fd5b6000612bb9858286016129d6565b9250506020612bca858286016129eb565b9150509250929050565b60008060408385031215612be757600080fd5b6000612bf5858286016129d6565b9250506020612c0685828601612a54565b9150509250929050565b600060208284031215612c2257600080fd5b6000612c3084828501612a00565b91505092915050565b600060208284031215612c4b57600080fd5b6000612c5984828501612a15565b91505092915050565b600060208284031215612c7457600080fd5b6000612c8284828501612a54565b91505092915050565b612c9481613b7d565b82525050565b612ca381613b8f565b82525050565b6000612cb482613a25565b612cbe8185613a3b565b9350612cce818560208601613c00565b612cd781613d9b565b840191505092915050565b6000612ced82613a30565b612cf78185613a4c565b9350612d07818560208601613c00565b612d1081613d9b565b840191505092915050565b6000612d2682613a30565b612d308185613a5d565b9350612d40818560208601613c00565b80840191505092915050565b6000612d59602983613a4c565b91507f596f75206d757374207075726368617365206174206c65617374206f6e65204360008301527f727970746f67756e2e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000612dbf601583613a4c565b91507f53616c6520686173206e6f7420737461727465642e00000000000000000000006000830152602082019050919050565b6000612dff602b83613a4c565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b6000612e65603283613a4c565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000612ecb602683613a4c565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612f31603d83613a4c565b91507f54686520616d6f756e7420796f752061726520747279696e6720746f2070757260008301527f63686173652065786365656473204d41585f4e46545f535550504c592e0000006020830152604082019050919050565b6000612f97601c83613a4c565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000612fd7600f83613a4c565b91507f53616c652068617320656e6465642e00000000000000000000000000000000006000830152602082019050919050565b6000613017602483613a4c565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061307d601983613a4c565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b60006130bd602c83613a4c565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613123603383613a4c565b91507f596f752063616e206f6e6c79207075726368617365206d61782031303020437260008301527f7970746f67756e7a20617420612074696d652e000000000000000000000000006020830152604082019050919050565b6000613189603883613a4c565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b60006131ef602a83613a4c565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000613255602983613a4c565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006132bb601683613a4c565b91507f496e636f72726563742045746865722076616c75652e000000000000000000006000830152602082019050919050565b60006132fb602083613a4c565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b600061333b602c83613a4c565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006133a1602083613a4c565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006133e1602983613a4c565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613447602f83613a4c565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b60006134ad602183613a4c565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613513603183613a4c565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000613579602c83613a4c565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b6135db81613be7565b82525050565b60006135ed8285612d1b565b91506135f98284612d1b565b91508190509392505050565b600060208201905061361a6000830184612c8b565b92915050565b60006080820190506136356000830187612c8b565b6136426020830186612c8b565b61364f60408301856135d2565b81810360608301526136618184612ca9565b905095945050505050565b60006020820190506136816000830184612c9a565b92915050565b600060208201905081810360008301526136a18184612ce2565b905092915050565b600060208201905081810360008301526136c281612d4c565b9050919050565b600060208201905081810360008301526136e281612db2565b9050919050565b6000602082019050818103600083015261370281612df2565b9050919050565b6000602082019050818103600083015261372281612e58565b9050919050565b6000602082019050818103600083015261374281612ebe565b9050919050565b6000602082019050818103600083015261376281612f24565b9050919050565b6000602082019050818103600083015261378281612f8a565b9050919050565b600060208201905081810360008301526137a281612fca565b9050919050565b600060208201905081810360008301526137c28161300a565b9050919050565b600060208201905081810360008301526137e281613070565b9050919050565b60006020820190508181036000830152613802816130b0565b9050919050565b6000602082019050818103600083015261382281613116565b9050919050565b600060208201905081810360008301526138428161317c565b9050919050565b60006020820190508181036000830152613862816131e2565b9050919050565b6000602082019050818103600083015261388281613248565b9050919050565b600060208201905081810360008301526138a2816132ae565b9050919050565b600060208201905081810360008301526138c2816132ee565b9050919050565b600060208201905081810360008301526138e28161332e565b9050919050565b6000602082019050818103600083015261390281613394565b9050919050565b60006020820190508181036000830152613922816133d4565b9050919050565b600060208201905081810360008301526139428161343a565b9050919050565b60006020820190508181036000830152613962816134a0565b9050919050565b6000602082019050818103600083015261398281613506565b9050919050565b600060208201905081810360008301526139a28161356c565b9050919050565b60006020820190506139be60008301846135d2565b92915050565b6000604051905081810181811067ffffffffffffffff821117156139eb576139ea613d6c565b5b8060405250919050565b600067ffffffffffffffff821115613a1057613a0f613d6c565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613a7382613be7565b9150613a7e83613be7565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613ab357613ab2613cdf565b5b828201905092915050565b6000613ac982613be7565b9150613ad483613be7565b925082613ae457613ae3613d0e565b5b828204905092915050565b6000613afa82613be7565b9150613b0583613be7565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613b3e57613b3d613cdf565b5b828202905092915050565b6000613b5482613be7565b9150613b5f83613be7565b925082821015613b7257613b71613cdf565b5b828203905092915050565b6000613b8882613bc7565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613c1e578082015181840152602081019050613c03565b83811115613c2d576000848401525b50505050565b60006002820490506001821680613c4b57607f821691505b60208210811415613c5f57613c5e613d3d565b5b50919050565b6000613c7082613be7565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613ca357613ca2613cdf565b5b600182019050919050565b6000613cb982613be7565b9150613cc483613be7565b925082613cd457613cd3613d0e565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b613db581613b7d565b8114613dc057600080fd5b50565b613dcc81613b8f565b8114613dd757600080fd5b50565b613de381613b9b565b8114613dee57600080fd5b50565b613dfa81613be7565b8114613e0557600080fd5b5056fea26469706673582212205018a2af076e8e91e8dc24771fe315da7f569881b157a4353643d1ea349aad2664736f6c63430008000033

Deployed Bytecode Sourcemap

41709:3662:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33494:260;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21978:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23399:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22957:384;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34193:107;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24309:332;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45298:70;;;;;;;;;;;;;:::i;:::-;;33830:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45223:69;;;;;;;;;;;;;:::i;:::-;;45103:114;;;:::i;:::-;;24704:165;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42103:2264;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34369:272;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44373:724;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41813:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21666:253;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21386:226;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41125:138;;;;;;;;;;;;;:::i;:::-;;40514:81;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22133:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23702:299;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41763:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24932:321;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22294:394;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24064:186;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41408:230;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33494:260;33621:4;33666:35;33651:50;;;:11;:50;;;;:97;;;;33712:36;33736:11;33712:23;:36::i;:::-;33651:97;33637:111;;33494:260;;;:::o;21978:94::-;22032:13;22061:5;22054:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21978:94;:::o;23399:239::-;23500:7;23527:16;23535:7;23527;:16::i;:::-;23519:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23608:15;:24;23624:7;23608:24;;;;;;;;;;;;;;;;;;;;;23601:31;;23399:239;;;:::o;22957:384::-;23034:13;23050:23;23065:7;23050:14;:23::i;:::-;23034:39;;23094:5;23088:11;;:2;:11;;;;23080:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;23178:5;23162:21;;:12;:10;:12::i;:::-;:21;;;:69;;;;23187:44;23211:5;23218:12;:10;:12::i;:::-;23187:23;:44::i;:::-;23162:69;23146:159;;;;;;;;;;;;:::i;:::-;;;;;;;;;23314:21;23323:2;23327:7;23314:8;:21::i;:::-;22957:384;;;:::o;34193:107::-;34254:7;34277:10;:17;;;;34270:24;;34193:107;:::o;24309:332::-;24490:41;24509:12;:10;:12::i;:::-;24523:7;24490:18;:41::i;:::-;24474:124;;;;;;;;;;;;:::i;:::-;;;;;;;;;24607:28;24617:4;24623:2;24627:7;24607:9;:28::i;:::-;24309:332;;;:::o;45298:70::-;40727:12;:10;:12::i;:::-;40716:23;;:7;:5;:7::i;:::-;:23;;;40708:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45357:5:::1;45343:11;;:19;;;;;;;;;;;;;;;;;;45298:70::o:0;33830:295::-;33952:7;33995:23;34012:5;33995:16;:23::i;:::-;33987:5;:31;33971:108;;;;;;;;;;;;:::i;:::-;;;;;;;;;34093:12;:19;34106:5;34093:19;;;;;;;;;;;;;;;:26;34113:5;34093:26;;;;;;;;;;;;34086:33;;33830:295;;;;:::o;45223:69::-;40727:12;:10;:12::i;:::-;40716:23;;:7;:5;:7::i;:::-;:23;;;40708:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45282:4:::1;45268:11;;:18;;;;;;;;;;;;;;;;;;45223:69::o:0;45103:114::-;40727:12;:10;:12::i;:::-;40716:23;;:7;:5;:7::i;:::-;:23;;;40708:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45171:10:::1;45163:24;;:47;45188:21;45163:47;;;;;;;;;;;;;;;;;;;;;;;45155:56;;;::::0;::::1;;45103:114::o:0;24704:165::-;24824:39;24841:4;24847:2;24851:7;24824:39;;;;;;;;;;;;:16;:39::i;:::-;24704:165;;;:::o;42103:2264::-;42154:7;42193:4;42178:19;;:11;;;;;;;;;;;:19;;;42170:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;41804:4;42238:13;:11;:13::i;:::-;:30;42230:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;42297:21;42321:13;:11;:13::i;:::-;42297:37;;42364:4;42347:13;:21;42343:2019;;;42386:19;42379:26;;;;;42343:2019;42456:4;42439:13;:21;42435:1927;;42478:19;42471:26;;;;;42435:1927;42555:4;42538:13;:21;42534:1828;;42577:19;42570:26;;;;;42534:1828;42654:4;42637:13;:21;42633:1729;;42676:19;42669:26;;;;;42633:1729;42751:4;42734:13;:21;42730:1632;;42773:18;42766:25;;;;;42730:1632;42849:4;42832:13;:21;42828:1534;;42871:18;42864:25;;;;;42828:1534;42947:4;42930:13;:21;42926:1436;;42969:18;42962:25;;;;;42926:1436;43045:4;43028:13;:21;43024:1338;;43067:18;43060:25;;;;;43024:1338;43143:4;43126:13;:21;43122:1240;;43165:18;43158:25;;;;;43122:1240;43241:4;43224:13;:21;43220:1142;;43263:18;43256:25;;;;;43220:1142;43339:4;43322:13;:21;43318:1044;;43361:18;43354:25;;;;;43318:1044;43438:4;43421:13;:21;43417:945;;43460:18;43453:25;;;;;43417:945;43536:4;43519:13;:21;43515:847;;43558:18;43551:25;;;;;43515:847;43636:4;43619:13;:21;43615:747;;43658:18;43651:25;;;;;43615:747;43735:4;43718:13;:21;43714:648;;43757:18;43750:25;;;;;43714:648;43835:4;43818:13;:21;43814:548;;43857:18;43850:25;;;;;43814:548;43933:4;43916:13;:21;43912:450;;43955:17;43948:24;;;;;43912:450;44031:4;44014:13;:21;44010:352;;44053:17;44046:24;;;;;44010:352;44129:4;44112:13;:21;44108:254;;44151:17;44144:24;;;;;44108:254;44227:3;44210:13;:20;44206:156;;44248:17;44241:24;;;;;44206:156;44317:17;44310:24;;;42103:2264;;:::o;34369:272::-;34469:7;34512:30;:28;:30::i;:::-;34504:5;:38;34488:116;;;;;;;;;;;;:::i;:::-;;;;;;;;;34618:10;34629:5;34618:17;;;;;;;;;;;;;;;;;;;;;;;;34611:24;;34369:272;;;:::o;44373:724::-;41804:4;44452:13;:11;:13::i;:::-;:30;44444:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;44532:1;44517:12;:16;44509:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;44618:3;44602:12;:19;;44586:104;;;;;;;;;;;;:::i;:::-;;;;;;;;;41804:4;44729:12;44713:13;:11;:13::i;:::-;:28;;;;:::i;:::-;:46;;44697:141;;;;;;;;;;;;:::i;:::-;;;;;;;;;44900:9;44884:12;44861:20;:18;:20::i;:::-;:35;;;;:::i;:::-;:48;44845:104;;;;;;;;;;;;:::i;:::-;;;;;;;;;44963:9;44958:134;44982:12;44978:1;:16;44958:134;;;45010:17;45030:13;:11;:13::i;:::-;45010:33;;45052:32;45062:10;45074:9;45052;:32::i;:::-;44958:134;44996:3;;;;;:::i;:::-;;;;44958:134;;;;44373:724;:::o;41813:31::-;;;;;;;;;;;;;:::o;21666:253::-;21763:7;21782:13;21798:7;:16;21806:7;21798:16;;;;;;;;;;;;;;;;;;;;;21782:32;;21846:1;21829:19;;:5;:19;;;;21821:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;21908:5;21901:12;;;21666:253;;;:::o;21386:226::-;21483:7;21527:1;21510:19;;:5;:19;;;;21502:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;21590:9;:16;21600:5;21590:16;;;;;;;;;;;;;;;;21583:23;;21386:226;;;:::o;41125:138::-;40727:12;:10;:12::i;:::-;40716:23;;:7;:5;:7::i;:::-;:23;;;40708:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41228:1:::1;41191:40;;41212:6;;;;;;;;;;;41191:40;;;;;;;;;;;;41255:1;41238:6;;:19;;;;;;;;;;;;;;;;;;41125:138::o:0;40514:81::-;40560:7;40583:6;;;;;;;;;;;40576:13;;40514:81;:::o;22133:98::-;22189:13;22218:7;22211:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22133:98;:::o;23702:299::-;23831:12;:10;:12::i;:::-;23819:24;;:8;:24;;;;23811:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;23927:8;23882:18;:32;23901:12;:10;:12::i;:::-;23882:32;;;;;;;;;;;;;;;:42;23915:8;23882:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;23976:8;23947:48;;23962:12;:10;:12::i;:::-;23947:48;;;23986:8;23947:48;;;;;;:::i;:::-;;;;;;;;23702:299;;:::o;41763:45::-;41804:4;41763:45;:::o;24932:321::-;25093:41;25112:12;:10;:12::i;:::-;25126:7;25093:18;:41::i;:::-;25077:124;;;;;;;;;;;;:::i;:::-;;;;;;;;;25208:39;25222:4;25228:2;25232:7;25241:5;25208:13;:39::i;:::-;24932:321;;;;:::o;22294:394::-;22392:13;22433:16;22441:7;22433;:16::i;:::-;22417:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;22523:21;22547:10;:8;:10::i;:::-;22523:34;;22602:1;22584:7;22578:21;:25;:104;;;;;;;;;;;;;;;;;22639:7;22648:18;:7;:16;:18::i;:::-;22622:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;22578:104;22564:118;;;22294:394;;;:::o;24064:186::-;24186:4;24209:18;:25;24228:5;24209:25;;;;;;;;;;;;;;;:35;24235:8;24209:35;;;;;;;;;;;;;;;;;;;;;;;;;24202:42;;24064:186;;;;:::o;41408:230::-;40727:12;:10;:12::i;:::-;40716:23;;:7;:5;:7::i;:::-;:23;;;40708:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41513:1:::1;41493:22;;:8;:22;;;;41485:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;41599:8;41570:38;;41591:6;;;;;;;;;;;41570:38;;;;;;;;;;;;41624:8;41615:6;;:17;;;;;;;;;;;;;;;;;;41408:230:::0;:::o;21021:309::-;21148:4;21193:25;21178:40;;;:11;:40;;;;:99;;;;21244:33;21229:48;;;:11;:48;;;;21178:99;:146;;;;21288:36;21312:11;21288:23;:36::i;:::-;21178:146;21164:160;;21021:309;;;:::o;26700:121::-;26765:4;26813:1;26785:30;;:7;:16;26793:7;26785:16;;;;;;;;;;;;;;;;;;;;;:30;;;;26778:37;;26700:121;;;:::o;16587:92::-;16640:7;16663:10;16656:17;;16587:92;:::o;30441:164::-;30539:2;30512:15;:24;30528:7;30512:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;30591:7;30587:2;30553:46;;30562:23;30577:7;30562:14;:23::i;:::-;30553:46;;;;;;;;;;;;30441:164;;:::o;26972:378::-;27085:4;27109:16;27117:7;27109;:16::i;:::-;27101:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27181:13;27197:23;27212:7;27197:14;:23::i;:::-;27181:39;;27246:5;27235:16;;:7;:16;;;:58;;;;27286:7;27262:31;;:20;27274:7;27262:11;:20::i;:::-;:31;;;27235:58;:108;;;;27304:39;27328:5;27335:7;27304:23;:39::i;:::-;27235:108;27227:117;;;26972:378;;;;:::o;29788:547::-;29937:4;29910:31;;:23;29925:7;29910:14;:23::i;:::-;:31;;;29894:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;30029:1;30015:16;;:2;:16;;;;30007:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;30081:39;30102:4;30108:2;30112:7;30081:20;:39::i;:::-;30177:29;30194:1;30198:7;30177:8;:29::i;:::-;30234:1;30215:9;:15;30225:4;30215:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;30259:1;30242:9;:13;30252:2;30242:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;30286:2;30267:7;:16;30275:7;30267:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;30321:7;30317:2;30302:27;;30311:4;30302:27;;;;;;;;;;;;29788:547;;;:::o;27670:104::-;27742:26;27752:2;27756:7;27742:26;;;;;;;;;;;;:9;:26::i;:::-;27670:104;;:::o;26097:308::-;26232:28;26242:4;26248:2;26252:7;26232:9;:28::i;:::-;26283:48;26306:4;26312:2;26316:7;26325:5;26283:22;:48::i;:::-;26267:132;;;;;;;;;;;;:::i;:::-;;;;;;;;;26097:308;;;;:::o;41974:123::-;42034:13;42056:35;;;;;;;;;;;;;;;;;;;41974:123;:::o;17210:637::-;17266:13;17484:1;17475:5;:10;17471:43;;;17496:10;;;;;;;;;;;;;;;;;;;;;17471:43;17520:12;17535:5;17520:20;;17547:14;17568:62;17583:1;17575:4;:9;17568:62;;17595:8;;;;;:::i;:::-;;;;17620:2;17612:10;;;;;:::i;:::-;;;17568:62;;;17636:19;17668:6;17658:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17636:39;;17682:132;17698:1;17689:5;:10;17682:132;;17720:1;17710:11;;;;;:::i;:::-;;;17781:2;17773:5;:10;;;;:::i;:::-;17760:2;:24;;;;:::i;:::-;17747:39;;17730:6;17737;17730:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;17804:2;17795:11;;;;;:::i;:::-;;;17682:132;;;17834:6;17820:21;;;;;17210:637;;;;:::o;19575:179::-;19685:4;19723:25;19708:40;;;:11;:40;;;;19701:47;;19575:179;;;:::o;35222:521::-;35348:45;35375:4;35381:2;35385:7;35348:26;:45::i;:::-;35422:1;35406:18;;:4;:18;;;35402:167;;;35435:40;35467:7;35435:31;:40::i;:::-;35402:167;;;35501:2;35493:10;;:4;:10;;;35489:80;;35514:47;35547:4;35553:7;35514:32;:47::i;:::-;35489:80;35402:167;35593:1;35579:16;;:2;:16;;;35575:163;;;35606:45;35643:7;35606:36;:45::i;:::-;35575:163;;;35675:4;35669:10;;:2;:10;;;35665:73;;35690:40;35718:2;35722:7;35690:27;:40::i;:::-;35665:73;35575:163;35222:521;;;:::o;27991:281::-;28103:18;28109:2;28113:7;28103:5;:18::i;:::-;28144:54;28175:1;28179:2;28183:7;28192:5;28144:22;:54::i;:::-;28128:138;;;;;;;;;;;;:::i;:::-;;;;;;;;;27991:281;;;:::o;31148:748::-;31285:4;31302:15;:2;:13;;;:15::i;:::-;31298:593;;;31357:2;31341:36;;;31378:12;:10;:12::i;:::-;31392:4;31398:7;31407:5;31341:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;31328:522;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31589:1;31572:6;:13;:18;31568:273;;;31605:60;;;;;;;;;;:::i;:::-;;;;;;;;31568:273;31809:6;31803:13;31794:6;31790:2;31786:15;31779:38;31328:522;31473:45;;;31463:55;;;:6;:55;;;;31456:62;;;;;31298:593;31879:4;31872:11;;31148:748;;;;;;;:::o;32477:112::-;;;;:::o;36430:154::-;36530:10;:17;;;;36503:15;:24;36519:7;36503:24;;;;;;;;;;;:44;;;;36554:10;36570:7;36554:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36430:154;:::o;37193:936::-;37455:22;37505:1;37480:22;37497:4;37480:16;:22::i;:::-;:26;;;;:::i;:::-;37455:51;;37513:18;37534:17;:26;37552:7;37534:26;;;;;;;;;;;;37513:47;;37673:14;37659:10;:28;37655:306;;37698:19;37720:12;:18;37733:4;37720:18;;;;;;;;;;;;;;;:34;37739:14;37720:34;;;;;;;;;;;;37698:56;;37798:11;37765:12;:18;37778:4;37765:18;;;;;;;;;;;;;;;:30;37784:10;37765:30;;;;;;;;;;;:44;;;;37909:10;37876:17;:30;37894:11;37876:30;;;;;;;;;;;:43;;;;37655:306;;38049:17;:26;38067:7;38049:26;;;;;;;;;;;38042:33;;;38089:12;:18;38102:4;38089:18;;;;;;;;;;;;;;;:34;38108:14;38089:34;;;;;;;;;;;38082:41;;;37193:936;;;;:::o;38412:1025::-;38653:22;38698:1;38678:10;:17;;;;:21;;;;:::i;:::-;38653:46;;38706:18;38727:15;:24;38743:7;38727:24;;;;;;;;;;;;38706:45;;39062:19;39084:10;39095:14;39084:26;;;;;;;;;;;;;;;;;;;;;;;;39062:48;;39144:11;39119:10;39130;39119:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;39251:10;39220:15;:28;39236:11;39220:28;;;;;;;;;;;:41;;;;39384:15;:24;39400:7;39384:24;;;;;;;;;;;39377:31;;;39415:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38412:1025;;;;:::o;36032:207::-;36113:14;36130:20;36147:2;36130:16;:20::i;:::-;36113:37;;36184:7;36157:12;:16;36170:2;36157:16;;;;;;;;;;;;;;;:24;36174:6;36157:24;;;;;;;;;;;:34;;;;36227:6;36198:17;:26;36216:7;36198:26;;;;;;;;;;;:35;;;;36032:207;;;:::o;28582:356::-;28672:1;28658:16;;:2;:16;;;;28650:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;28727:16;28735:7;28727;:16::i;:::-;28726:17;28718:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;28785:45;28814:1;28818:2;28822:7;28785:20;:45::i;:::-;28856:1;28839:9;:13;28849:2;28839:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;28883:2;28864:7;:16;28872:7;28864:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;28924:7;28920:2;28899:33;;28916:1;28899:33;;;;;;;;;;;;28582:356;;:::o;8808:404::-;8868:4;9060:12;9170:7;9158:20;9150:28;;9205:1;9198:4;:8;9191:15;;;8808:404;;;:::o;7:342:1:-;;109:64;124:48;165:6;124:48;:::i;:::-;109:64;:::i;:::-;100:73;;196:6;189:5;182:21;234:4;227:5;223:16;272:3;263:6;258:3;254:16;251:25;248:2;;;289:1;286;279:12;248:2;302:41;336:6;331:3;326;302:41;:::i;:::-;90:259;;;;;;:::o;355:139::-;;439:6;426:20;417:29;;455:33;482:5;455:33;:::i;:::-;407:87;;;;:::o;500:133::-;;581:6;568:20;559:29;;597:30;621:5;597:30;:::i;:::-;549:84;;;;:::o;639:137::-;;722:6;709:20;700:29;;738:32;764:5;738:32;:::i;:::-;690:86;;;;:::o;782:141::-;;869:6;863:13;854:22;;885:32;911:5;885:32;:::i;:::-;844:79;;;;:::o;942:271::-;;1046:3;1039:4;1031:6;1027:17;1023:27;1013:2;;1064:1;1061;1054:12;1013:2;1104:6;1091:20;1129:78;1203:3;1195:6;1188:4;1180:6;1176:17;1129:78;:::i;:::-;1120:87;;1003:210;;;;;:::o;1219:139::-;;1303:6;1290:20;1281:29;;1319:33;1346:5;1319:33;:::i;:::-;1271:87;;;;:::o;1364:262::-;;1472:2;1460:9;1451:7;1447:23;1443:32;1440:2;;;1488:1;1485;1478:12;1440:2;1531:1;1556:53;1601:7;1592:6;1581:9;1577:22;1556:53;:::i;:::-;1546:63;;1502:117;1430:196;;;;:::o;1632:407::-;;;1757:2;1745:9;1736:7;1732:23;1728:32;1725:2;;;1773:1;1770;1763:12;1725:2;1816:1;1841:53;1886:7;1877:6;1866:9;1862:22;1841:53;:::i;:::-;1831:63;;1787:117;1943:2;1969:53;2014:7;2005:6;1994:9;1990:22;1969:53;:::i;:::-;1959:63;;1914:118;1715:324;;;;;:::o;2045:552::-;;;;2187:2;2175:9;2166:7;2162:23;2158:32;2155:2;;;2203:1;2200;2193:12;2155:2;2246:1;2271:53;2316:7;2307:6;2296:9;2292:22;2271:53;:::i;:::-;2261:63;;2217:117;2373:2;2399:53;2444:7;2435:6;2424:9;2420:22;2399:53;:::i;:::-;2389:63;;2344:118;2501:2;2527:53;2572:7;2563:6;2552:9;2548:22;2527:53;:::i;:::-;2517:63;;2472:118;2145:452;;;;;:::o;2603:809::-;;;;;2771:3;2759:9;2750:7;2746:23;2742:33;2739:2;;;2788:1;2785;2778:12;2739:2;2831:1;2856:53;2901:7;2892:6;2881:9;2877:22;2856:53;:::i;:::-;2846:63;;2802:117;2958:2;2984:53;3029:7;3020:6;3009:9;3005:22;2984:53;:::i;:::-;2974:63;;2929:118;3086:2;3112:53;3157:7;3148:6;3137:9;3133:22;3112:53;:::i;:::-;3102:63;;3057:118;3242:2;3231:9;3227:18;3214:32;3273:18;3265:6;3262:30;3259:2;;;3305:1;3302;3295:12;3259:2;3333:62;3387:7;3378:6;3367:9;3363:22;3333:62;:::i;:::-;3323:72;;3185:220;2729:683;;;;;;;:::o;3418:401::-;;;3540:2;3528:9;3519:7;3515:23;3511:32;3508:2;;;3556:1;3553;3546:12;3508:2;3599:1;3624:53;3669:7;3660:6;3649:9;3645:22;3624:53;:::i;:::-;3614:63;;3570:117;3726:2;3752:50;3794:7;3785:6;3774:9;3770:22;3752:50;:::i;:::-;3742:60;;3697:115;3498:321;;;;;:::o;3825:407::-;;;3950:2;3938:9;3929:7;3925:23;3921:32;3918:2;;;3966:1;3963;3956:12;3918:2;4009:1;4034:53;4079:7;4070:6;4059:9;4055:22;4034:53;:::i;:::-;4024:63;;3980:117;4136:2;4162:53;4207:7;4198:6;4187:9;4183:22;4162:53;:::i;:::-;4152:63;;4107:118;3908:324;;;;;:::o;4238:260::-;;4345:2;4333:9;4324:7;4320:23;4316:32;4313:2;;;4361:1;4358;4351:12;4313:2;4404:1;4429:52;4473:7;4464:6;4453:9;4449:22;4429:52;:::i;:::-;4419:62;;4375:116;4303:195;;;;:::o;4504:282::-;;4622:2;4610:9;4601:7;4597:23;4593:32;4590:2;;;4638:1;4635;4628:12;4590:2;4681:1;4706:63;4761:7;4752:6;4741:9;4737:22;4706:63;:::i;:::-;4696:73;;4652:127;4580:206;;;;:::o;4792:262::-;;4900:2;4888:9;4879:7;4875:23;4871:32;4868:2;;;4916:1;4913;4906:12;4868:2;4959:1;4984:53;5029:7;5020:6;5009:9;5005:22;4984:53;:::i;:::-;4974:63;;4930:117;4858:196;;;;:::o;5060:118::-;5147:24;5165:5;5147:24;:::i;:::-;5142:3;5135:37;5125:53;;:::o;5184:109::-;5265:21;5280:5;5265:21;:::i;:::-;5260:3;5253:34;5243:50;;:::o;5299:360::-;;5413:38;5445:5;5413:38;:::i;:::-;5467:70;5530:6;5525:3;5467:70;:::i;:::-;5460:77;;5546:52;5591:6;5586:3;5579:4;5572:5;5568:16;5546:52;:::i;:::-;5623:29;5645:6;5623:29;:::i;:::-;5618:3;5614:39;5607:46;;5389:270;;;;;:::o;5665:364::-;;5781:39;5814:5;5781:39;:::i;:::-;5836:71;5900:6;5895:3;5836:71;:::i;:::-;5829:78;;5916:52;5961:6;5956:3;5949:4;5942:5;5938:16;5916:52;:::i;:::-;5993:29;6015:6;5993:29;:::i;:::-;5988:3;5984:39;5977:46;;5757:272;;;;;:::o;6035:377::-;;6169:39;6202:5;6169:39;:::i;:::-;6224:89;6306:6;6301:3;6224:89;:::i;:::-;6217:96;;6322:52;6367:6;6362:3;6355:4;6348:5;6344:16;6322:52;:::i;:::-;6399:6;6394:3;6390:16;6383:23;;6145:267;;;;;:::o;6418:373::-;;6581:67;6645:2;6640:3;6581:67;:::i;:::-;6574:74;;6678:34;6674:1;6669:3;6665:11;6658:55;6744:11;6739:2;6734:3;6730:12;6723:33;6782:2;6777:3;6773:12;6766:19;;6564:227;;;:::o;6797:319::-;;6960:67;7024:2;7019:3;6960:67;:::i;:::-;6953:74;;7057:23;7053:1;7048:3;7044:11;7037:44;7107:2;7102:3;7098:12;7091:19;;6943:173;;;:::o;7122:375::-;;7285:67;7349:2;7344:3;7285:67;:::i;:::-;7278:74;;7382:34;7378:1;7373:3;7369:11;7362:55;7448:13;7443:2;7438:3;7434:12;7427:35;7488:2;7483:3;7479:12;7472:19;;7268:229;;;:::o;7503:382::-;;7666:67;7730:2;7725:3;7666:67;:::i;:::-;7659:74;;7763:34;7759:1;7754:3;7750:11;7743:55;7829:20;7824:2;7819:3;7815:12;7808:42;7876:2;7871:3;7867:12;7860:19;;7649:236;;;:::o;7891:370::-;;8054:67;8118:2;8113:3;8054:67;:::i;:::-;8047:74;;8151:34;8147:1;8142:3;8138:11;8131:55;8217:8;8212:2;8207:3;8203:12;8196:30;8252:2;8247:3;8243:12;8236:19;;8037:224;;;:::o;8267:393::-;;8430:67;8494:2;8489:3;8430:67;:::i;:::-;8423:74;;8527:34;8523:1;8518:3;8514:11;8507:55;8593:31;8588:2;8583:3;8579:12;8572:53;8651:2;8646:3;8642:12;8635:19;;8413:247;;;:::o;8666:326::-;;8829:67;8893:2;8888:3;8829:67;:::i;:::-;8822:74;;8926:30;8922:1;8917:3;8913:11;8906:51;8983:2;8978:3;8974:12;8967:19;;8812:180;;;:::o;8998:313::-;;9161:67;9225:2;9220:3;9161:67;:::i;:::-;9154:74;;9258:17;9254:1;9249:3;9245:11;9238:38;9302:2;9297:3;9293:12;9286:19;;9144:167;;;:::o;9317:368::-;;9480:67;9544:2;9539:3;9480:67;:::i;:::-;9473:74;;9577:34;9573:1;9568:3;9564:11;9557:55;9643:6;9638:2;9633:3;9629:12;9622:28;9676:2;9671:3;9667:12;9660:19;;9463:222;;;:::o;9691:323::-;;9854:67;9918:2;9913:3;9854:67;:::i;:::-;9847:74;;9951:27;9947:1;9942:3;9938:11;9931:48;10005:2;10000:3;9996:12;9989:19;;9837:177;;;:::o;10020:376::-;;10183:67;10247:2;10242:3;10183:67;:::i;:::-;10176:74;;10280:34;10276:1;10271:3;10267:11;10260:55;10346:14;10341:2;10336:3;10332:12;10325:36;10387:2;10382:3;10378:12;10371:19;;10166:230;;;:::o;10402:383::-;;10565:67;10629:2;10624:3;10565:67;:::i;:::-;10558:74;;10662:34;10658:1;10653:3;10649:11;10642:55;10728:21;10723:2;10718:3;10714:12;10707:43;10776:2;10771:3;10767:12;10760:19;;10548:237;;;:::o;10791:388::-;;10954:67;11018:2;11013:3;10954:67;:::i;:::-;10947:74;;11051:34;11047:1;11042:3;11038:11;11031:55;11117:26;11112:2;11107:3;11103:12;11096:48;11170:2;11165:3;11161:12;11154:19;;10937:242;;;:::o;11185:374::-;;11348:67;11412:2;11407:3;11348:67;:::i;:::-;11341:74;;11445:34;11441:1;11436:3;11432:11;11425:55;11511:12;11506:2;11501:3;11497:12;11490:34;11550:2;11545:3;11541:12;11534:19;;11331:228;;;:::o;11565:373::-;;11728:67;11792:2;11787:3;11728:67;:::i;:::-;11721:74;;11825:34;11821:1;11816:3;11812:11;11805:55;11891:11;11886:2;11881:3;11877:12;11870:33;11929:2;11924:3;11920:12;11913:19;;11711:227;;;:::o;11944:320::-;;12107:67;12171:2;12166:3;12107:67;:::i;:::-;12100:74;;12204:24;12200:1;12195:3;12191:11;12184:45;12255:2;12250:3;12246:12;12239:19;;12090:174;;;:::o;12270:330::-;;12433:67;12497:2;12492:3;12433:67;:::i;:::-;12426:74;;12530:34;12526:1;12521:3;12517:11;12510:55;12591:2;12586:3;12582:12;12575:19;;12416:184;;;:::o;12606:376::-;;12769:67;12833:2;12828:3;12769:67;:::i;:::-;12762:74;;12866:34;12862:1;12857:3;12853:11;12846:55;12932:14;12927:2;12922:3;12918:12;12911:36;12973:2;12968:3;12964:12;12957:19;;12752:230;;;:::o;12988:330::-;;13151:67;13215:2;13210:3;13151:67;:::i;:::-;13144:74;;13248:34;13244:1;13239:3;13235:11;13228:55;13309:2;13304:3;13300:12;13293:19;;13134:184;;;:::o;13324:373::-;;13487:67;13551:2;13546:3;13487:67;:::i;:::-;13480:74;;13584:34;13580:1;13575:3;13571:11;13564:55;13650:11;13645:2;13640:3;13636:12;13629:33;13688:2;13683:3;13679:12;13672:19;;13470:227;;;:::o;13703:379::-;;13866:67;13930:2;13925:3;13866:67;:::i;:::-;13859:74;;13963:34;13959:1;13954:3;13950:11;13943:55;14029:17;14024:2;14019:3;14015:12;14008:39;14073:2;14068:3;14064:12;14057:19;;13849:233;;;:::o;14088:365::-;;14251:67;14315:2;14310:3;14251:67;:::i;:::-;14244:74;;14348:34;14344:1;14339:3;14335:11;14328:55;14414:3;14409:2;14404:3;14400:12;14393:25;14444:2;14439:3;14435:12;14428:19;;14234:219;;;:::o;14459:381::-;;14622:67;14686:2;14681:3;14622:67;:::i;:::-;14615:74;;14719:34;14715:1;14710:3;14706:11;14699:55;14785:19;14780:2;14775:3;14771:12;14764:41;14831:2;14826:3;14822:12;14815:19;;14605:235;;;:::o;14846:376::-;;15009:67;15073:2;15068:3;15009:67;:::i;:::-;15002:74;;15106:34;15102:1;15097:3;15093:11;15086:55;15172:14;15167:2;15162:3;15158:12;15151:36;15213:2;15208:3;15204:12;15197:19;;14992:230;;;:::o;15228:118::-;15315:24;15333:5;15315:24;:::i;:::-;15310:3;15303:37;15293:53;;:::o;15352:435::-;;15554:95;15645:3;15636:6;15554:95;:::i;:::-;15547:102;;15666:95;15757:3;15748:6;15666:95;:::i;:::-;15659:102;;15778:3;15771:10;;15536:251;;;;;:::o;15793:222::-;;15924:2;15913:9;15909:18;15901:26;;15937:71;16005:1;15994:9;15990:17;15981:6;15937:71;:::i;:::-;15891:124;;;;:::o;16021:640::-;;16254:3;16243:9;16239:19;16231:27;;16268:71;16336:1;16325:9;16321:17;16312:6;16268:71;:::i;:::-;16349:72;16417:2;16406:9;16402:18;16393:6;16349:72;:::i;:::-;16431;16499:2;16488:9;16484:18;16475:6;16431:72;:::i;:::-;16550:9;16544:4;16540:20;16535:2;16524:9;16520:18;16513:48;16578:76;16649:4;16640:6;16578:76;:::i;:::-;16570:84;;16221:440;;;;;;;:::o;16667:210::-;;16792:2;16781:9;16777:18;16769:26;;16805:65;16867:1;16856:9;16852:17;16843:6;16805:65;:::i;:::-;16759:118;;;;:::o;16883:313::-;;17034:2;17023:9;17019:18;17011:26;;17083:9;17077:4;17073:20;17069:1;17058:9;17054:17;17047:47;17111:78;17184:4;17175:6;17111:78;:::i;:::-;17103:86;;17001:195;;;;:::o;17202:419::-;;17406:2;17395:9;17391:18;17383:26;;17455:9;17449:4;17445:20;17441:1;17430:9;17426:17;17419:47;17483:131;17609:4;17483:131;:::i;:::-;17475:139;;17373:248;;;:::o;17627:419::-;;17831:2;17820:9;17816:18;17808:26;;17880:9;17874:4;17870:20;17866:1;17855:9;17851:17;17844:47;17908:131;18034:4;17908:131;:::i;:::-;17900:139;;17798:248;;;:::o;18052:419::-;;18256:2;18245:9;18241:18;18233:26;;18305:9;18299:4;18295:20;18291:1;18280:9;18276:17;18269:47;18333:131;18459:4;18333:131;:::i;:::-;18325:139;;18223:248;;;:::o;18477:419::-;;18681:2;18670:9;18666:18;18658:26;;18730:9;18724:4;18720:20;18716:1;18705:9;18701:17;18694:47;18758:131;18884:4;18758:131;:::i;:::-;18750:139;;18648:248;;;:::o;18902:419::-;;19106:2;19095:9;19091:18;19083:26;;19155:9;19149:4;19145:20;19141:1;19130:9;19126:17;19119:47;19183:131;19309:4;19183:131;:::i;:::-;19175:139;;19073:248;;;:::o;19327:419::-;;19531:2;19520:9;19516:18;19508:26;;19580:9;19574:4;19570:20;19566:1;19555:9;19551:17;19544:47;19608:131;19734:4;19608:131;:::i;:::-;19600:139;;19498:248;;;:::o;19752:419::-;;19956:2;19945:9;19941:18;19933:26;;20005:9;19999:4;19995:20;19991:1;19980:9;19976:17;19969:47;20033:131;20159:4;20033:131;:::i;:::-;20025:139;;19923:248;;;:::o;20177:419::-;;20381:2;20370:9;20366:18;20358:26;;20430:9;20424:4;20420:20;20416:1;20405:9;20401:17;20394:47;20458:131;20584:4;20458:131;:::i;:::-;20450:139;;20348:248;;;:::o;20602:419::-;;20806:2;20795:9;20791:18;20783:26;;20855:9;20849:4;20845:20;20841:1;20830:9;20826:17;20819:47;20883:131;21009:4;20883:131;:::i;:::-;20875:139;;20773:248;;;:::o;21027:419::-;;21231:2;21220:9;21216:18;21208:26;;21280:9;21274:4;21270:20;21266:1;21255:9;21251:17;21244:47;21308:131;21434:4;21308:131;:::i;:::-;21300:139;;21198:248;;;:::o;21452:419::-;;21656:2;21645:9;21641:18;21633:26;;21705:9;21699:4;21695:20;21691:1;21680:9;21676:17;21669:47;21733:131;21859:4;21733:131;:::i;:::-;21725:139;;21623:248;;;:::o;21877:419::-;;22081:2;22070:9;22066:18;22058:26;;22130:9;22124:4;22120:20;22116:1;22105:9;22101:17;22094:47;22158:131;22284:4;22158:131;:::i;:::-;22150:139;;22048:248;;;:::o;22302:419::-;;22506:2;22495:9;22491:18;22483:26;;22555:9;22549:4;22545:20;22541:1;22530:9;22526:17;22519:47;22583:131;22709:4;22583:131;:::i;:::-;22575:139;;22473:248;;;:::o;22727:419::-;;22931:2;22920:9;22916:18;22908:26;;22980:9;22974:4;22970:20;22966:1;22955:9;22951:17;22944:47;23008:131;23134:4;23008:131;:::i;:::-;23000:139;;22898:248;;;:::o;23152:419::-;;23356:2;23345:9;23341:18;23333:26;;23405:9;23399:4;23395:20;23391:1;23380:9;23376:17;23369:47;23433:131;23559:4;23433:131;:::i;:::-;23425:139;;23323:248;;;:::o;23577:419::-;;23781:2;23770:9;23766:18;23758:26;;23830:9;23824:4;23820:20;23816:1;23805:9;23801:17;23794:47;23858:131;23984:4;23858:131;:::i;:::-;23850:139;;23748:248;;;:::o;24002:419::-;;24206:2;24195:9;24191:18;24183:26;;24255:9;24249:4;24245:20;24241:1;24230:9;24226:17;24219:47;24283:131;24409:4;24283:131;:::i;:::-;24275:139;;24173:248;;;:::o;24427:419::-;;24631:2;24620:9;24616:18;24608:26;;24680:9;24674:4;24670:20;24666:1;24655:9;24651:17;24644:47;24708:131;24834:4;24708:131;:::i;:::-;24700:139;;24598:248;;;:::o;24852:419::-;;25056:2;25045:9;25041:18;25033:26;;25105:9;25099:4;25095:20;25091:1;25080:9;25076:17;25069:47;25133:131;25259:4;25133:131;:::i;:::-;25125:139;;25023:248;;;:::o;25277:419::-;;25481:2;25470:9;25466:18;25458:26;;25530:9;25524:4;25520:20;25516:1;25505:9;25501:17;25494:47;25558:131;25684:4;25558:131;:::i;:::-;25550:139;;25448:248;;;:::o;25702:419::-;;25906:2;25895:9;25891:18;25883:26;;25955:9;25949:4;25945:20;25941:1;25930:9;25926:17;25919:47;25983:131;26109:4;25983:131;:::i;:::-;25975:139;;25873:248;;;:::o;26127:419::-;;26331:2;26320:9;26316:18;26308:26;;26380:9;26374:4;26370:20;26366:1;26355:9;26351:17;26344:47;26408:131;26534:4;26408:131;:::i;:::-;26400:139;;26298:248;;;:::o;26552:419::-;;26756:2;26745:9;26741:18;26733:26;;26805:9;26799:4;26795:20;26791:1;26780:9;26776:17;26769:47;26833:131;26959:4;26833:131;:::i;:::-;26825:139;;26723:248;;;:::o;26977:419::-;;27181:2;27170:9;27166:18;27158:26;;27230:9;27224:4;27220:20;27216:1;27205:9;27201:17;27194:47;27258:131;27384:4;27258:131;:::i;:::-;27250:139;;27148:248;;;:::o;27402:222::-;;27533:2;27522:9;27518:18;27510:26;;27546:71;27614:1;27603:9;27599:17;27590:6;27546:71;:::i;:::-;27500:124;;;;:::o;27630:283::-;;27696:2;27690:9;27680:19;;27738:4;27730:6;27726:17;27845:6;27833:10;27830:22;27809:18;27797:10;27794:34;27791:62;27788:2;;;27856:18;;:::i;:::-;27788:2;27896:10;27892:2;27885:22;27670:243;;;;:::o;27919:331::-;;28070:18;28062:6;28059:30;28056:2;;;28092:18;;:::i;:::-;28056:2;28177:4;28173:9;28166:4;28158:6;28154:17;28150:33;28142:41;;28238:4;28232;28228:15;28220:23;;27985:265;;;:::o;28256:98::-;;28341:5;28335:12;28325:22;;28314:40;;;:::o;28360:99::-;;28446:5;28440:12;28430:22;;28419:40;;;:::o;28465:168::-;;28582:6;28577:3;28570:19;28622:4;28617:3;28613:14;28598:29;;28560:73;;;;:::o;28639:169::-;;28757:6;28752:3;28745:19;28797:4;28792:3;28788:14;28773:29;;28735:73;;;;:::o;28814:148::-;;28953:3;28938:18;;28928:34;;;;:::o;28968:305::-;;29027:20;29045:1;29027:20;:::i;:::-;29022:25;;29061:20;29079:1;29061:20;:::i;:::-;29056:25;;29215:1;29147:66;29143:74;29140:1;29137:81;29134:2;;;29221:18;;:::i;:::-;29134:2;29265:1;29262;29258:9;29251:16;;29012:261;;;;:::o;29279:185::-;;29336:20;29354:1;29336:20;:::i;:::-;29331:25;;29370:20;29388:1;29370:20;:::i;:::-;29365:25;;29409:1;29399:2;;29414:18;;:::i;:::-;29399:2;29456:1;29453;29449:9;29444:14;;29321:143;;;;:::o;29470:348::-;;29533:20;29551:1;29533:20;:::i;:::-;29528:25;;29567:20;29585:1;29567:20;:::i;:::-;29562:25;;29755:1;29687:66;29683:74;29680:1;29677:81;29672:1;29665:9;29658:17;29654:105;29651:2;;;29762:18;;:::i;:::-;29651:2;29810:1;29807;29803:9;29792:20;;29518:300;;;;:::o;29824:191::-;;29884:20;29902:1;29884:20;:::i;:::-;29879:25;;29918:20;29936:1;29918:20;:::i;:::-;29913:25;;29957:1;29954;29951:8;29948:2;;;29962:18;;:::i;:::-;29948:2;30007:1;30004;30000:9;29992:17;;29869:146;;;;:::o;30021:96::-;;30087:24;30105:5;30087:24;:::i;:::-;30076:35;;30066:51;;;:::o;30123:90::-;;30200:5;30193:13;30186:21;30175:32;;30165:48;;;:::o;30219:149::-;;30295:66;30288:5;30284:78;30273:89;;30263:105;;;:::o;30374:126::-;;30451:42;30444:5;30440:54;30429:65;;30419:81;;;:::o;30506:77::-;;30572:5;30561:16;;30551:32;;;:::o;30589:154::-;30673:6;30668:3;30663;30650:30;30735:1;30726:6;30721:3;30717:16;30710:27;30640:103;;;:::o;30749:307::-;30817:1;30827:113;30841:6;30838:1;30835:13;30827:113;;;30926:1;30921:3;30917:11;30911:18;30907:1;30902:3;30898:11;30891:39;30863:2;30860:1;30856:10;30851:15;;30827:113;;;30958:6;30955:1;30952:13;30949:2;;;31038:1;31029:6;31024:3;31020:16;31013:27;30949:2;30798:258;;;;:::o;31062:320::-;;31143:1;31137:4;31133:12;31123:22;;31190:1;31184:4;31180:12;31211:18;31201:2;;31267:4;31259:6;31255:17;31245:27;;31201:2;31329;31321:6;31318:14;31298:18;31295:38;31292:2;;;31348:18;;:::i;:::-;31292:2;31113:269;;;;:::o;31388:233::-;;31450:24;31468:5;31450:24;:::i;:::-;31441:33;;31496:66;31489:5;31486:77;31483:2;;;31566:18;;:::i;:::-;31483:2;31613:1;31606:5;31602:13;31595:20;;31431:190;;;:::o;31627:176::-;;31676:20;31694:1;31676:20;:::i;:::-;31671:25;;31710:20;31728:1;31710:20;:::i;:::-;31705:25;;31749:1;31739:2;;31754:18;;:::i;:::-;31739:2;31795:1;31792;31788:9;31783:14;;31661:142;;;;:::o;31809:180::-;31857:77;31854:1;31847:88;31954:4;31951:1;31944:15;31978:4;31975:1;31968:15;31995:180;32043:77;32040:1;32033:88;32140:4;32137:1;32130:15;32164:4;32161:1;32154:15;32181:180;32229:77;32226:1;32219:88;32326:4;32323:1;32316:15;32350:4;32347:1;32340:15;32367:180;32415:77;32412:1;32405:88;32512:4;32509:1;32502:15;32536:4;32533:1;32526:15;32553:102;;32645:2;32641:7;32636:2;32629:5;32625:14;32621:28;32611:38;;32601:54;;;:::o;32661:122::-;32734:24;32752:5;32734:24;:::i;:::-;32727:5;32724:35;32714:2;;32773:1;32770;32763:12;32714:2;32704:79;:::o;32789:116::-;32859:21;32874:5;32859:21;:::i;:::-;32852:5;32849:32;32839:2;;32895:1;32892;32885:12;32839:2;32829:76;:::o;32911:120::-;32983:23;33000:5;32983:23;:::i;:::-;32976:5;32973:34;32963:2;;33021:1;33018;33011:12;32963:2;32953:78;:::o;33037:122::-;33110:24;33128:5;33110:24;:::i;:::-;33103:5;33100:35;33090:2;;33149:1;33146;33139:12;33090:2;33080:79;:::o

Swarm Source

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