ETH Price: $3,340.34 (+0.12%)

Token

Shmokies (SMK)
 

Overview

Max Total Supply

720 SMK

Holders

178

Total Transfers

-

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

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:
Shmokies

Compiler Version
v0.8.11+commit.d7f03943

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-05-10
*/

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

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

pragma solidity ^0.8.1;

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

    return account.code.length > 0;
  }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

pragma solidity ^0.8.0;

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

  // Token name
  string private _name;

  // Token symbol
  string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    _approve(to, tokenId);
  }

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

    return _tokenApprovals[tokenId];
  }

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

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

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

    _transfer(from, to, tokenId);
  }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    _beforeTokenTransfer(from, to, tokenId);

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

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

    emit Transfer(from, to, tokenId);

    _afterTokenTransfer(from, to, tokenId);
  }

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;

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

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

  /**
   * @dev Initializes the contract setting the deployer as the initial owner.
   */
  constructor() {
    _transferOwnership(_msgSender());
  }

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

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

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

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

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

// File: contracts/Shmokies.sol

pragma solidity >=0.7.0 <0.9.0;

contract Shmokies is ERC721, Ownable {
  using Strings for uint256;
  using Counters for Counters.Counter;

  Counters.Counter private supply;

  string private uriPrefix = "";
  string public uriSuffix = ".json";

  // Example: ipfs://__CID__/
  string public hiddenMetadataUri;

  uint256 public cost = 0.01 ether;
  uint256 public maxSupply = 2500;
  uint256 public maxMintAmountPerTx = 5;
  uint256 public maxMintAmountPerAccount = 5;
  uint256 public freeMints = 500;

  bool public paused = true;
  bool public revealed = false;

  constructor(string memory _hiddenMetadataUri) ERC721("Shmokies", "SMK") {
    setHiddenMetadataUri(_hiddenMetadataUri);
  }

  modifier mintCompliance(uint256 _mintAmount) {
    require(supply.current() + _mintAmount <= maxSupply, "Max supply exceeded!");
    require(_mintAmount > 0 && _mintAmount <= maxMintAmountPerTx, "Choose Number Between 1-5!");

    uint256 mintedBalance = balanceOf(msg.sender);
    require(mintedBalance + _mintAmount <= maxMintAmountPerAccount, "Max mint amount exceeded!");

    _;
  }

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

  function mint(uint256 _mintAmount) public payable mintCompliance(_mintAmount) {
    require(!paused, "The contract is paused!");

    if (supply.current() > freeMints) {
      require(msg.value >= cost * _mintAmount, "Insufficient funds!");
    }

    _mintLoop(msg.sender, _mintAmount);
  }

  function mintForAddress(uint256 _mintAmount, address _receiver)
    public
    mintCompliance(_mintAmount)
    onlyOwner
  {
    _mintLoop(_receiver, _mintAmount);
  }

  function walletOfOwner(address _owner) public view returns (uint256[] memory) {
    uint256 ownerTokenCount = balanceOf(_owner);
    uint256[] memory ownedTokenIds = new uint256[](ownerTokenCount);
    uint256 currentTokenId = 1;
    uint256 ownedTokenIndex = 0;

    while (ownedTokenIndex < ownerTokenCount && currentTokenId <= maxSupply) {
      address currentTokenOwner = ownerOf(currentTokenId);

      if (currentTokenOwner == _owner) {
        ownedTokenIds[ownedTokenIndex] = currentTokenId;

        ownedTokenIndex++;
      }

      currentTokenId++;
    }

    return ownedTokenIds;
  }

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

    if (revealed == false) {
      return string(abi.encodePacked(hiddenMetadataUri, _tokenId.toString(), uriSuffix));
    }

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

  function setRevealed(bool _state) public onlyOwner {
    revealed = _state;
  }

  function setCost(uint256 _cost) public onlyOwner {
    cost = _cost;
  }

  function setMaxMintAmountPerTx(uint256 _maxMintAmountPerTx) public onlyOwner {
    maxMintAmountPerTx = _maxMintAmountPerTx;
  }

  function setMaxMintAmountPerAccount(uint256 _maxMintAmountPerAccount) public onlyOwner {
    maxMintAmountPerAccount = _maxMintAmountPerAccount;
  }

  function setHiddenMetadataUri(string memory _hiddenMetadataUri) public onlyOwner {
    hiddenMetadataUri = _hiddenMetadataUri;
  }

  function setUriPrefix(string memory _uriPrefix) public onlyOwner {
    uriPrefix = _uriPrefix;
  }

  function setUriSuffix(string memory _uriSuffix) public onlyOwner {
    uriSuffix = _uriSuffix;
  }

  function setPaused(bool _state) public onlyOwner {
    paused = _state;
  }

  function withdraw() public onlyOwner {
    (bool os, ) = payable(owner()).call{value: address(this).balance}("");
    require(os);
  }

  function _mintLoop(address _receiver, uint256 _mintAmount) internal {
    for (uint256 i = 0; i < _mintAmount; i++) {
      supply.increment();
      _safeMint(_receiver, supply.current());
    }
  }

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_hiddenMetadataUri","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freeMints","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":"hiddenMetadataUri","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"maxMintAmountPerAccount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmountPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"mintForAddress","outputs":[],"stateMutability":"nonpayable","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":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_hiddenMetadataUri","type":"string"}],"name":"setHiddenMetadataUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintAmountPerAccount","type":"uint256"}],"name":"setMaxMintAmountPerAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintAmountPerTx","type":"uint256"}],"name":"setMaxMintAmountPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"setUriPrefix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriSuffix","type":"string"}],"name":"setUriSuffix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405260405180602001604052806000815250600890805190602001906200002b9291906200037f565b506040518060400160405280600581526020017f2e6a736f6e00000000000000000000000000000000000000000000000000000081525060099080519060200190620000799291906200037f565b50662386f26fc10000600b556109c4600c556005600d556005600e556101f4600f556001601060006101000a81548160ff0219169083151502179055506000601060016101000a81548160ff021916908315150217905550348015620000de57600080fd5b5060405162004a7f38038062004a7f8339818101604052810190620001049190620005cc565b6040518060400160405280600881526020017f53686d6f6b6965730000000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f534d4b00000000000000000000000000000000000000000000000000000000008152508160009080519060200190620001889291906200037f565b508060019080519060200190620001a19291906200037f565b505050620001c4620001b8620001dc60201b60201c565b620001e460201b60201c565b620001d581620002aa60201b60201c565b5062000705565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002ba620001dc60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620002e06200035560201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000330906200067e565b60405180910390fd5b80600a9080519060200190620003519291906200037f565b5050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b8280546200038d90620006cf565b90600052602060002090601f016020900481019282620003b15760008555620003fd565b82601f10620003cc57805160ff1916838001178555620003fd565b82800160010185558215620003fd579182015b82811115620003fc578251825591602001919060010190620003df565b5b5090506200040c919062000410565b5090565b5b808211156200042b57600081600090555060010162000411565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b62000498826200044d565b810181811067ffffffffffffffff82111715620004ba57620004b96200045e565b5b80604052505050565b6000620004cf6200042f565b9050620004dd82826200048d565b919050565b600067ffffffffffffffff8211156200050057620004ff6200045e565b5b6200050b826200044d565b9050602081019050919050565b60005b83811015620005385780820151818401526020810190506200051b565b8381111562000548576000848401525b50505050565b6000620005656200055f84620004e2565b620004c3565b90508281526020810184848401111562000584576200058362000448565b5b6200059184828562000518565b509392505050565b600082601f830112620005b157620005b062000443565b5b8151620005c38482602086016200054e565b91505092915050565b600060208284031215620005e557620005e462000439565b5b600082015167ffffffffffffffff8111156200060657620006056200043e565b5b620006148482850162000599565b91505092915050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000620006666020836200061d565b915062000673826200062e565b602082019050919050565b60006020820190508181036000830152620006998162000657565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620006e857607f821691505b60208210811415620006ff57620006fe620006a0565b5b50919050565b61436a80620007156000396000f3fe6080604052600436106102255760003560e01c8063715018a611610123578063a45ba8e7116100ab578063deaf46ba1161006f578063deaf46ba146107d4578063e0a80853146107fd578063e985e9c514610826578063efbd73f414610863578063f2fde38b1461088c57610225565b8063a45ba8e7146106ef578063b071401b1461071a578063b88d4fde14610743578063c87b56dd1461076c578063d5abeb01146107a957610225565b80638da5cb5b116100f25780638da5cb5b1461062957806394354fd01461065457806395d89b411461067f578063a0712d68146106aa578063a22cb465146106c657610225565b8063715018a61461059357806379fb9b84146105aa5780637ec4a659146105d557806380b17335146105fe57610225565b80633ccfd60b116101b1578063518302271161017557806351830227146104985780635503a0e8146104c35780635c975abb146104ee5780636352211e1461051957806370a082311461055657610225565b80633ccfd60b146103c957806342842e0e146103e0578063438b63001461040957806344a0d68a146104465780634fdd43cb1461046f57610225565b806313faede6116101f857806313faede6146102f857806316ba10e01461032357806316c38b3c1461034c57806318160ddd1461037557806323b872dd146103a057610225565b806301ffc9a71461022a57806306fdde0314610267578063081812fc14610292578063095ea7b3146102cf575b600080fd5b34801561023657600080fd5b50610251600480360381019061024c9190612c2a565b6108b5565b60405161025e9190612c72565b60405180910390f35b34801561027357600080fd5b5061027c610997565b6040516102899190612d26565b60405180910390f35b34801561029e57600080fd5b506102b960048036038101906102b49190612d7e565b610a29565b6040516102c69190612dec565b60405180910390f35b3480156102db57600080fd5b506102f660048036038101906102f19190612e33565b610aae565b005b34801561030457600080fd5b5061030d610bc6565b60405161031a9190612e82565b60405180910390f35b34801561032f57600080fd5b5061034a60048036038101906103459190612fd2565b610bcc565b005b34801561035857600080fd5b50610373600480360381019061036e9190613047565b610c62565b005b34801561038157600080fd5b5061038a610cfb565b6040516103979190612e82565b60405180910390f35b3480156103ac57600080fd5b506103c760048036038101906103c29190613074565b610d0c565b005b3480156103d557600080fd5b506103de610d6c565b005b3480156103ec57600080fd5b5061040760048036038101906104029190613074565b610e68565b005b34801561041557600080fd5b50610430600480360381019061042b91906130c7565b610e88565b60405161043d91906131b2565b60405180910390f35b34801561045257600080fd5b5061046d60048036038101906104689190612d7e565b610f93565b005b34801561047b57600080fd5b5061049660048036038101906104919190612fd2565b611019565b005b3480156104a457600080fd5b506104ad6110af565b6040516104ba9190612c72565b60405180910390f35b3480156104cf57600080fd5b506104d86110c2565b6040516104e59190612d26565b60405180910390f35b3480156104fa57600080fd5b50610503611150565b6040516105109190612c72565b60405180910390f35b34801561052557600080fd5b50610540600480360381019061053b9190612d7e565b611163565b60405161054d9190612dec565b60405180910390f35b34801561056257600080fd5b5061057d600480360381019061057891906130c7565b611215565b60405161058a9190612e82565b60405180910390f35b34801561059f57600080fd5b506105a86112cd565b005b3480156105b657600080fd5b506105bf611355565b6040516105cc9190612e82565b60405180910390f35b3480156105e157600080fd5b506105fc60048036038101906105f79190612fd2565b61135b565b005b34801561060a57600080fd5b506106136113f1565b6040516106209190612e82565b60405180910390f35b34801561063557600080fd5b5061063e6113f7565b60405161064b9190612dec565b60405180910390f35b34801561066057600080fd5b50610669611421565b6040516106769190612e82565b60405180910390f35b34801561068b57600080fd5b50610694611427565b6040516106a19190612d26565b60405180910390f35b6106c460048036038101906106bf9190612d7e565b6114b9565b005b3480156106d257600080fd5b506106ed60048036038101906106e891906131d4565b611684565b005b3480156106fb57600080fd5b5061070461169a565b6040516107119190612d26565b60405180910390f35b34801561072657600080fd5b50610741600480360381019061073c9190612d7e565b611728565b005b34801561074f57600080fd5b5061076a600480360381019061076591906132b5565b6117ae565b005b34801561077857600080fd5b50610793600480360381019061078e9190612d7e565b611810565b6040516107a09190612d26565b60405180910390f35b3480156107b557600080fd5b506107be61190c565b6040516107cb9190612e82565b60405180910390f35b3480156107e057600080fd5b506107fb60048036038101906107f69190612d7e565b611912565b005b34801561080957600080fd5b50610824600480360381019061081f9190613047565b611998565b005b34801561083257600080fd5b5061084d60048036038101906108489190613338565b611a31565b60405161085a9190612c72565b60405180910390f35b34801561086f57600080fd5b5061088a60048036038101906108859190613378565b611ac5565b005b34801561089857600080fd5b506108b360048036038101906108ae91906130c7565b611c59565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061098057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610990575061098f82611d51565b5b9050919050565b6060600080546109a6906133e7565b80601f01602080910402602001604051908101604052809291908181526020018280546109d2906133e7565b8015610a1f5780601f106109f457610100808354040283529160200191610a1f565b820191906000526020600020905b815481529060010190602001808311610a0257829003601f168201915b5050505050905090565b6000610a3482611dbb565b610a73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6a9061348b565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610ab982611163565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b219061351d565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b49611e27565b73ffffffffffffffffffffffffffffffffffffffff161480610b785750610b7781610b72611e27565b611a31565b5b610bb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bae906135af565b60405180910390fd5b610bc18383611e2f565b505050565b600b5481565b610bd4611e27565b73ffffffffffffffffffffffffffffffffffffffff16610bf26113f7565b73ffffffffffffffffffffffffffffffffffffffff1614610c48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3f9061361b565b60405180910390fd5b8060099080519060200190610c5e929190612b1b565b5050565b610c6a611e27565b73ffffffffffffffffffffffffffffffffffffffff16610c886113f7565b73ffffffffffffffffffffffffffffffffffffffff1614610cde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd59061361b565b60405180910390fd5b80601060006101000a81548160ff02191690831515021790555050565b6000610d076007611ee8565b905090565b610d1d610d17611e27565b82611ef6565b610d5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d53906136ad565b60405180910390fd5b610d67838383611fd4565b505050565b610d74611e27565b73ffffffffffffffffffffffffffffffffffffffff16610d926113f7565b73ffffffffffffffffffffffffffffffffffffffff1614610de8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ddf9061361b565b60405180910390fd5b6000610df26113f7565b73ffffffffffffffffffffffffffffffffffffffff1647604051610e15906136fe565b60006040518083038185875af1925050503d8060008114610e52576040519150601f19603f3d011682016040523d82523d6000602084013e610e57565b606091505b5050905080610e6557600080fd5b50565b610e83838383604051806020016040528060008152506117ae565b505050565b60606000610e9583611215565b905060008167ffffffffffffffff811115610eb357610eb2612ea7565b5b604051908082528060200260200182016040528015610ee15781602001602082028036833780820191505090505b50905060006001905060005b8381108015610efe5750600c548211155b15610f87576000610f0e83611163565b90508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610f735782848381518110610f5857610f57613713565b5b6020026020010181815250508180610f6f90613771565b9250505b8280610f7e90613771565b93505050610eed565b82945050505050919050565b610f9b611e27565b73ffffffffffffffffffffffffffffffffffffffff16610fb96113f7565b73ffffffffffffffffffffffffffffffffffffffff161461100f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110069061361b565b60405180910390fd5b80600b8190555050565b611021611e27565b73ffffffffffffffffffffffffffffffffffffffff1661103f6113f7565b73ffffffffffffffffffffffffffffffffffffffff1614611095576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108c9061361b565b60405180910390fd5b80600a90805190602001906110ab929190612b1b565b5050565b601060019054906101000a900460ff1681565b600980546110cf906133e7565b80601f01602080910402602001604051908101604052809291908181526020018280546110fb906133e7565b80156111485780601f1061111d57610100808354040283529160200191611148565b820191906000526020600020905b81548152906001019060200180831161112b57829003601f168201915b505050505081565b601060009054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561120c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112039061382c565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611286576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127d906138be565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6112d5611e27565b73ffffffffffffffffffffffffffffffffffffffff166112f36113f7565b73ffffffffffffffffffffffffffffffffffffffff1614611349576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113409061361b565b60405180910390fd5b611353600061223b565b565b600e5481565b611363611e27565b73ffffffffffffffffffffffffffffffffffffffff166113816113f7565b73ffffffffffffffffffffffffffffffffffffffff16146113d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ce9061361b565b60405180910390fd5b80600890805190602001906113ed929190612b1b565b5050565b600f5481565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600d5481565b606060018054611436906133e7565b80601f0160208091040260200160405190810160405280929190818152602001828054611462906133e7565b80156114af5780601f10611484576101008083540402835291602001916114af565b820191906000526020600020905b81548152906001019060200180831161149257829003601f168201915b5050505050905090565b80600c54816114c86007611ee8565b6114d291906138de565b1115611513576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150a90613980565b60405180910390fd5b6000811180156115255750600d548111155b611564576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155b906139ec565b60405180910390fd5b600061156f33611215565b9050600e54828261158091906138de565b11156115c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b890613a58565b60405180910390fd5b601060009054906101000a900460ff1615611611576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160890613ac4565b60405180910390fd5b600f5461161e6007611ee8565b11156116755782600b546116329190613ae4565b341015611674576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166b90613b8a565b60405180910390fd5b5b61167f3384612301565b505050565b61169661168f611e27565b8383612341565b5050565b600a80546116a7906133e7565b80601f01602080910402602001604051908101604052809291908181526020018280546116d3906133e7565b80156117205780601f106116f557610100808354040283529160200191611720565b820191906000526020600020905b81548152906001019060200180831161170357829003601f168201915b505050505081565b611730611e27565b73ffffffffffffffffffffffffffffffffffffffff1661174e6113f7565b73ffffffffffffffffffffffffffffffffffffffff16146117a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179b9061361b565b60405180910390fd5b80600d8190555050565b6117bf6117b9611e27565b83611ef6565b6117fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f5906136ad565b60405180910390fd5b61180a848484846124ae565b50505050565b606061181b82611dbb565b61185a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185190613c1c565b60405180910390fd5b60001515601060019054906101000a900460ff16151514156118ab57600a6118818361250a565b600960405160200161189593929190613d0c565b6040516020818303038152906040529050611907565b60006118b561266b565b905060008151116118d55760405180602001604052806000815250611903565b806118df8461250a565b60096040516020016118f393929190613d3d565b6040516020818303038152906040525b9150505b919050565b600c5481565b61191a611e27565b73ffffffffffffffffffffffffffffffffffffffff166119386113f7565b73ffffffffffffffffffffffffffffffffffffffff161461198e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119859061361b565b60405180910390fd5b80600e8190555050565b6119a0611e27565b73ffffffffffffffffffffffffffffffffffffffff166119be6113f7565b73ffffffffffffffffffffffffffffffffffffffff1614611a14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0b9061361b565b60405180910390fd5b80601060016101000a81548160ff02191690831515021790555050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b81600c5481611ad46007611ee8565b611ade91906138de565b1115611b1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1690613980565b60405180910390fd5b600081118015611b315750600d548111155b611b70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b67906139ec565b60405180910390fd5b6000611b7b33611215565b9050600e548282611b8c91906138de565b1115611bcd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc490613a58565b60405180910390fd5b611bd5611e27565b73ffffffffffffffffffffffffffffffffffffffff16611bf36113f7565b73ffffffffffffffffffffffffffffffffffffffff1614611c49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c409061361b565b60405180910390fd5b611c538385612301565b50505050565b611c61611e27565b73ffffffffffffffffffffffffffffffffffffffff16611c7f6113f7565b73ffffffffffffffffffffffffffffffffffffffff1614611cd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ccc9061361b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611d45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3c90613de0565b60405180910390fd5b611d4e8161223b565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611ea283611163565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b6000611f0182611dbb565b611f40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3790613e72565b60405180910390fd5b6000611f4b83611163565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611fba57508373ffffffffffffffffffffffffffffffffffffffff16611fa284610a29565b73ffffffffffffffffffffffffffffffffffffffff16145b80611fcb5750611fca8185611a31565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611ff482611163565b73ffffffffffffffffffffffffffffffffffffffff161461204a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204190613f04565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156120ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b190613f96565b60405180910390fd5b6120c58383836126fd565b6120d0600082611e2f565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121209190613fb6565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461217791906138de565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612236838383612702565b505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60005b8181101561233c576123166007612707565b612329836123246007611ee8565b61271d565b808061233490613771565b915050612304565b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156123b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a790614036565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516124a19190612c72565b60405180910390a3505050565b6124b9848484611fd4565b6124c58484848461273b565b612504576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124fb906140c8565b60405180910390fd5b50505050565b60606000821415612552576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612666565b600082905060005b6000821461258457808061256d90613771565b915050600a8261257d9190614117565b915061255a565b60008167ffffffffffffffff8111156125a05761259f612ea7565b5b6040519080825280601f01601f1916602001820160405280156125d25781602001600182028036833780820191505090505b5090505b6000851461265f576001826125eb9190613fb6565b9150600a856125fa9190614148565b603061260691906138de565b60f81b81838151811061261c5761261b613713565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856126589190614117565b94506125d6565b8093505050505b919050565b60606008805461267a906133e7565b80601f01602080910402602001604051908101604052809291908181526020018280546126a6906133e7565b80156126f35780601f106126c8576101008083540402835291602001916126f3565b820191906000526020600020905b8154815290600101906020018083116126d657829003601f168201915b5050505050905090565b505050565b505050565b6001816000016000828254019250508190555050565b6127378282604051806020016040528060008152506128c3565b5050565b600061275c8473ffffffffffffffffffffffffffffffffffffffff1661291e565b156128b6578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612785611e27565b8786866040518563ffffffff1660e01b81526004016127a794939291906141ce565b6020604051808303816000875af19250505080156127e357506040513d601f19601f820116820180604052508101906127e0919061422f565b60015b612866573d8060008114612813576040519150601f19603f3d011682016040523d82523d6000602084013e612818565b606091505b5060008151141561285e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612855906140c8565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506128bb565b600190505b949350505050565b6128cd8383612941565b6128da600084848461273b565b612919576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612910906140c8565b60405180910390fd5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156129b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129a8906142a8565b60405180910390fd5b6129ba81611dbb565b156129fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129f190614314565b60405180910390fd5b612a06600083836126fd565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a5691906138de565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612b1760008383612702565b5050565b828054612b27906133e7565b90600052602060002090601f016020900481019282612b495760008555612b90565b82601f10612b6257805160ff1916838001178555612b90565b82800160010185558215612b90579182015b82811115612b8f578251825591602001919060010190612b74565b5b509050612b9d9190612ba1565b5090565b5b80821115612bba576000816000905550600101612ba2565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612c0781612bd2565b8114612c1257600080fd5b50565b600081359050612c2481612bfe565b92915050565b600060208284031215612c4057612c3f612bc8565b5b6000612c4e84828501612c15565b91505092915050565b60008115159050919050565b612c6c81612c57565b82525050565b6000602082019050612c876000830184612c63565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612cc7578082015181840152602081019050612cac565b83811115612cd6576000848401525b50505050565b6000601f19601f8301169050919050565b6000612cf882612c8d565b612d028185612c98565b9350612d12818560208601612ca9565b612d1b81612cdc565b840191505092915050565b60006020820190508181036000830152612d408184612ced565b905092915050565b6000819050919050565b612d5b81612d48565b8114612d6657600080fd5b50565b600081359050612d7881612d52565b92915050565b600060208284031215612d9457612d93612bc8565b5b6000612da284828501612d69565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612dd682612dab565b9050919050565b612de681612dcb565b82525050565b6000602082019050612e016000830184612ddd565b92915050565b612e1081612dcb565b8114612e1b57600080fd5b50565b600081359050612e2d81612e07565b92915050565b60008060408385031215612e4a57612e49612bc8565b5b6000612e5885828601612e1e565b9250506020612e6985828601612d69565b9150509250929050565b612e7c81612d48565b82525050565b6000602082019050612e976000830184612e73565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612edf82612cdc565b810181811067ffffffffffffffff82111715612efe57612efd612ea7565b5b80604052505050565b6000612f11612bbe565b9050612f1d8282612ed6565b919050565b600067ffffffffffffffff821115612f3d57612f3c612ea7565b5b612f4682612cdc565b9050602081019050919050565b82818337600083830152505050565b6000612f75612f7084612f22565b612f07565b905082815260208101848484011115612f9157612f90612ea2565b5b612f9c848285612f53565b509392505050565b600082601f830112612fb957612fb8612e9d565b5b8135612fc9848260208601612f62565b91505092915050565b600060208284031215612fe857612fe7612bc8565b5b600082013567ffffffffffffffff81111561300657613005612bcd565b5b61301284828501612fa4565b91505092915050565b61302481612c57565b811461302f57600080fd5b50565b6000813590506130418161301b565b92915050565b60006020828403121561305d5761305c612bc8565b5b600061306b84828501613032565b91505092915050565b60008060006060848603121561308d5761308c612bc8565b5b600061309b86828701612e1e565b93505060206130ac86828701612e1e565b92505060406130bd86828701612d69565b9150509250925092565b6000602082840312156130dd576130dc612bc8565b5b60006130eb84828501612e1e565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61312981612d48565b82525050565b600061313b8383613120565b60208301905092915050565b6000602082019050919050565b600061315f826130f4565b61316981856130ff565b935061317483613110565b8060005b838110156131a557815161318c888261312f565b975061319783613147565b925050600181019050613178565b5085935050505092915050565b600060208201905081810360008301526131cc8184613154565b905092915050565b600080604083850312156131eb576131ea612bc8565b5b60006131f985828601612e1e565b925050602061320a85828601613032565b9150509250929050565b600067ffffffffffffffff82111561322f5761322e612ea7565b5b61323882612cdc565b9050602081019050919050565b600061325861325384613214565b612f07565b90508281526020810184848401111561327457613273612ea2565b5b61327f848285612f53565b509392505050565b600082601f83011261329c5761329b612e9d565b5b81356132ac848260208601613245565b91505092915050565b600080600080608085870312156132cf576132ce612bc8565b5b60006132dd87828801612e1e565b94505060206132ee87828801612e1e565b93505060406132ff87828801612d69565b925050606085013567ffffffffffffffff8111156133205761331f612bcd565b5b61332c87828801613287565b91505092959194509250565b6000806040838503121561334f5761334e612bc8565b5b600061335d85828601612e1e565b925050602061336e85828601612e1e565b9150509250929050565b6000806040838503121561338f5761338e612bc8565b5b600061339d85828601612d69565b92505060206133ae85828601612e1e565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806133ff57607f821691505b60208210811415613413576134126133b8565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613475602c83612c98565b915061348082613419565b604082019050919050565b600060208201905081810360008301526134a481613468565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613507602183612c98565b9150613512826134ab565b604082019050919050565b60006020820190508181036000830152613536816134fa565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000613599603883612c98565b91506135a48261353d565b604082019050919050565b600060208201905081810360008301526135c88161358c565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613605602083612c98565b9150613610826135cf565b602082019050919050565b60006020820190508181036000830152613634816135f8565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000613697603183612c98565b91506136a28261363b565b604082019050919050565b600060208201905081810360008301526136c68161368a565b9050919050565b600081905092915050565b50565b60006136e86000836136cd565b91506136f3826136d8565b600082019050919050565b6000613709826136db565b9150819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061377c82612d48565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156137af576137ae613742565b5b600182019050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000613816602983612c98565b9150613821826137ba565b604082019050919050565b6000602082019050818103600083015261384581613809565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b60006138a8602a83612c98565b91506138b38261384c565b604082019050919050565b600060208201905081810360008301526138d78161389b565b9050919050565b60006138e982612d48565b91506138f483612d48565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561392957613928613742565b5b828201905092915050565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b600061396a601483612c98565b915061397582613934565b602082019050919050565b600060208201905081810360008301526139998161395d565b9050919050565b7f43686f6f7365204e756d626572204265747765656e20312d3521000000000000600082015250565b60006139d6601a83612c98565b91506139e1826139a0565b602082019050919050565b60006020820190508181036000830152613a05816139c9565b9050919050565b7f4d6178206d696e7420616d6f756e742065786365656465642100000000000000600082015250565b6000613a42601983612c98565b9150613a4d82613a0c565b602082019050919050565b60006020820190508181036000830152613a7181613a35565b9050919050565b7f54686520636f6e74726163742069732070617573656421000000000000000000600082015250565b6000613aae601783612c98565b9150613ab982613a78565b602082019050919050565b60006020820190508181036000830152613add81613aa1565b9050919050565b6000613aef82612d48565b9150613afa83612d48565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613b3357613b32613742565b5b828202905092915050565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b6000613b74601383612c98565b9150613b7f82613b3e565b602082019050919050565b60006020820190508181036000830152613ba381613b67565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000613c06602f83612c98565b9150613c1182613baa565b604082019050919050565b60006020820190508181036000830152613c3581613bf9565b9050919050565b600081905092915050565b60008190508160005260206000209050919050565b60008154613c69816133e7565b613c738186613c3c565b94506001821660008114613c8e5760018114613c9f57613cd2565b60ff19831686528186019350613cd2565b613ca885613c47565b60005b83811015613cca57815481890152600182019150602081019050613cab565b838801955050505b50505092915050565b6000613ce682612c8d565b613cf08185613c3c565b9350613d00818560208601612ca9565b80840191505092915050565b6000613d188286613c5c565b9150613d248285613cdb565b9150613d308284613c5c565b9150819050949350505050565b6000613d498286613cdb565b9150613d558285613cdb565b9150613d618284613c5c565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613dca602683612c98565b9150613dd582613d6e565b604082019050919050565b60006020820190508181036000830152613df981613dbd565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613e5c602c83612c98565b9150613e6782613e00565b604082019050919050565b60006020820190508181036000830152613e8b81613e4f565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000613eee602583612c98565b9150613ef982613e92565b604082019050919050565b60006020820190508181036000830152613f1d81613ee1565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613f80602483612c98565b9150613f8b82613f24565b604082019050919050565b60006020820190508181036000830152613faf81613f73565b9050919050565b6000613fc182612d48565b9150613fcc83612d48565b925082821015613fdf57613fde613742565b5b828203905092915050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614020601983612c98565b915061402b82613fea565b602082019050919050565b6000602082019050818103600083015261404f81614013565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006140b2603283612c98565b91506140bd82614056565b604082019050919050565b600060208201905081810360008301526140e1816140a5565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061412282612d48565b915061412d83612d48565b92508261413d5761413c6140e8565b5b828204905092915050565b600061415382612d48565b915061415e83612d48565b92508261416e5761416d6140e8565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b60006141a082614179565b6141aa8185614184565b93506141ba818560208601612ca9565b6141c381612cdc565b840191505092915050565b60006080820190506141e36000830187612ddd565b6141f06020830186612ddd565b6141fd6040830185612e73565b818103606083015261420f8184614195565b905095945050505050565b60008151905061422981612bfe565b92915050565b60006020828403121561424557614244612bc8565b5b60006142538482850161421a565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614292602083612c98565b915061429d8261425c565b602082019050919050565b600060208201905081810360008301526142c181614285565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006142fe601c83612c98565b9150614309826142c8565b602082019050919050565b6000602082019050818103600083015261432d816142f1565b905091905056fea2646970667358221220958fb67a555257e3127abccaaaa511c510bdce2c4140b92dffb20308f1257c4e64736f6c634300080b003300000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d6162717177544846436467583277574d3952456452764a625471387636755848367974546146706e6d7351642f00000000000000000000

Deployed Bytecode

0x6080604052600436106102255760003560e01c8063715018a611610123578063a45ba8e7116100ab578063deaf46ba1161006f578063deaf46ba146107d4578063e0a80853146107fd578063e985e9c514610826578063efbd73f414610863578063f2fde38b1461088c57610225565b8063a45ba8e7146106ef578063b071401b1461071a578063b88d4fde14610743578063c87b56dd1461076c578063d5abeb01146107a957610225565b80638da5cb5b116100f25780638da5cb5b1461062957806394354fd01461065457806395d89b411461067f578063a0712d68146106aa578063a22cb465146106c657610225565b8063715018a61461059357806379fb9b84146105aa5780637ec4a659146105d557806380b17335146105fe57610225565b80633ccfd60b116101b1578063518302271161017557806351830227146104985780635503a0e8146104c35780635c975abb146104ee5780636352211e1461051957806370a082311461055657610225565b80633ccfd60b146103c957806342842e0e146103e0578063438b63001461040957806344a0d68a146104465780634fdd43cb1461046f57610225565b806313faede6116101f857806313faede6146102f857806316ba10e01461032357806316c38b3c1461034c57806318160ddd1461037557806323b872dd146103a057610225565b806301ffc9a71461022a57806306fdde0314610267578063081812fc14610292578063095ea7b3146102cf575b600080fd5b34801561023657600080fd5b50610251600480360381019061024c9190612c2a565b6108b5565b60405161025e9190612c72565b60405180910390f35b34801561027357600080fd5b5061027c610997565b6040516102899190612d26565b60405180910390f35b34801561029e57600080fd5b506102b960048036038101906102b49190612d7e565b610a29565b6040516102c69190612dec565b60405180910390f35b3480156102db57600080fd5b506102f660048036038101906102f19190612e33565b610aae565b005b34801561030457600080fd5b5061030d610bc6565b60405161031a9190612e82565b60405180910390f35b34801561032f57600080fd5b5061034a60048036038101906103459190612fd2565b610bcc565b005b34801561035857600080fd5b50610373600480360381019061036e9190613047565b610c62565b005b34801561038157600080fd5b5061038a610cfb565b6040516103979190612e82565b60405180910390f35b3480156103ac57600080fd5b506103c760048036038101906103c29190613074565b610d0c565b005b3480156103d557600080fd5b506103de610d6c565b005b3480156103ec57600080fd5b5061040760048036038101906104029190613074565b610e68565b005b34801561041557600080fd5b50610430600480360381019061042b91906130c7565b610e88565b60405161043d91906131b2565b60405180910390f35b34801561045257600080fd5b5061046d60048036038101906104689190612d7e565b610f93565b005b34801561047b57600080fd5b5061049660048036038101906104919190612fd2565b611019565b005b3480156104a457600080fd5b506104ad6110af565b6040516104ba9190612c72565b60405180910390f35b3480156104cf57600080fd5b506104d86110c2565b6040516104e59190612d26565b60405180910390f35b3480156104fa57600080fd5b50610503611150565b6040516105109190612c72565b60405180910390f35b34801561052557600080fd5b50610540600480360381019061053b9190612d7e565b611163565b60405161054d9190612dec565b60405180910390f35b34801561056257600080fd5b5061057d600480360381019061057891906130c7565b611215565b60405161058a9190612e82565b60405180910390f35b34801561059f57600080fd5b506105a86112cd565b005b3480156105b657600080fd5b506105bf611355565b6040516105cc9190612e82565b60405180910390f35b3480156105e157600080fd5b506105fc60048036038101906105f79190612fd2565b61135b565b005b34801561060a57600080fd5b506106136113f1565b6040516106209190612e82565b60405180910390f35b34801561063557600080fd5b5061063e6113f7565b60405161064b9190612dec565b60405180910390f35b34801561066057600080fd5b50610669611421565b6040516106769190612e82565b60405180910390f35b34801561068b57600080fd5b50610694611427565b6040516106a19190612d26565b60405180910390f35b6106c460048036038101906106bf9190612d7e565b6114b9565b005b3480156106d257600080fd5b506106ed60048036038101906106e891906131d4565b611684565b005b3480156106fb57600080fd5b5061070461169a565b6040516107119190612d26565b60405180910390f35b34801561072657600080fd5b50610741600480360381019061073c9190612d7e565b611728565b005b34801561074f57600080fd5b5061076a600480360381019061076591906132b5565b6117ae565b005b34801561077857600080fd5b50610793600480360381019061078e9190612d7e565b611810565b6040516107a09190612d26565b60405180910390f35b3480156107b557600080fd5b506107be61190c565b6040516107cb9190612e82565b60405180910390f35b3480156107e057600080fd5b506107fb60048036038101906107f69190612d7e565b611912565b005b34801561080957600080fd5b50610824600480360381019061081f9190613047565b611998565b005b34801561083257600080fd5b5061084d60048036038101906108489190613338565b611a31565b60405161085a9190612c72565b60405180910390f35b34801561086f57600080fd5b5061088a60048036038101906108859190613378565b611ac5565b005b34801561089857600080fd5b506108b360048036038101906108ae91906130c7565b611c59565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061098057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610990575061098f82611d51565b5b9050919050565b6060600080546109a6906133e7565b80601f01602080910402602001604051908101604052809291908181526020018280546109d2906133e7565b8015610a1f5780601f106109f457610100808354040283529160200191610a1f565b820191906000526020600020905b815481529060010190602001808311610a0257829003601f168201915b5050505050905090565b6000610a3482611dbb565b610a73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6a9061348b565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610ab982611163565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b219061351d565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b49611e27565b73ffffffffffffffffffffffffffffffffffffffff161480610b785750610b7781610b72611e27565b611a31565b5b610bb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bae906135af565b60405180910390fd5b610bc18383611e2f565b505050565b600b5481565b610bd4611e27565b73ffffffffffffffffffffffffffffffffffffffff16610bf26113f7565b73ffffffffffffffffffffffffffffffffffffffff1614610c48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3f9061361b565b60405180910390fd5b8060099080519060200190610c5e929190612b1b565b5050565b610c6a611e27565b73ffffffffffffffffffffffffffffffffffffffff16610c886113f7565b73ffffffffffffffffffffffffffffffffffffffff1614610cde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd59061361b565b60405180910390fd5b80601060006101000a81548160ff02191690831515021790555050565b6000610d076007611ee8565b905090565b610d1d610d17611e27565b82611ef6565b610d5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d53906136ad565b60405180910390fd5b610d67838383611fd4565b505050565b610d74611e27565b73ffffffffffffffffffffffffffffffffffffffff16610d926113f7565b73ffffffffffffffffffffffffffffffffffffffff1614610de8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ddf9061361b565b60405180910390fd5b6000610df26113f7565b73ffffffffffffffffffffffffffffffffffffffff1647604051610e15906136fe565b60006040518083038185875af1925050503d8060008114610e52576040519150601f19603f3d011682016040523d82523d6000602084013e610e57565b606091505b5050905080610e6557600080fd5b50565b610e83838383604051806020016040528060008152506117ae565b505050565b60606000610e9583611215565b905060008167ffffffffffffffff811115610eb357610eb2612ea7565b5b604051908082528060200260200182016040528015610ee15781602001602082028036833780820191505090505b50905060006001905060005b8381108015610efe5750600c548211155b15610f87576000610f0e83611163565b90508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610f735782848381518110610f5857610f57613713565b5b6020026020010181815250508180610f6f90613771565b9250505b8280610f7e90613771565b93505050610eed565b82945050505050919050565b610f9b611e27565b73ffffffffffffffffffffffffffffffffffffffff16610fb96113f7565b73ffffffffffffffffffffffffffffffffffffffff161461100f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110069061361b565b60405180910390fd5b80600b8190555050565b611021611e27565b73ffffffffffffffffffffffffffffffffffffffff1661103f6113f7565b73ffffffffffffffffffffffffffffffffffffffff1614611095576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108c9061361b565b60405180910390fd5b80600a90805190602001906110ab929190612b1b565b5050565b601060019054906101000a900460ff1681565b600980546110cf906133e7565b80601f01602080910402602001604051908101604052809291908181526020018280546110fb906133e7565b80156111485780601f1061111d57610100808354040283529160200191611148565b820191906000526020600020905b81548152906001019060200180831161112b57829003601f168201915b505050505081565b601060009054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561120c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112039061382c565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611286576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127d906138be565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6112d5611e27565b73ffffffffffffffffffffffffffffffffffffffff166112f36113f7565b73ffffffffffffffffffffffffffffffffffffffff1614611349576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113409061361b565b60405180910390fd5b611353600061223b565b565b600e5481565b611363611e27565b73ffffffffffffffffffffffffffffffffffffffff166113816113f7565b73ffffffffffffffffffffffffffffffffffffffff16146113d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ce9061361b565b60405180910390fd5b80600890805190602001906113ed929190612b1b565b5050565b600f5481565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600d5481565b606060018054611436906133e7565b80601f0160208091040260200160405190810160405280929190818152602001828054611462906133e7565b80156114af5780601f10611484576101008083540402835291602001916114af565b820191906000526020600020905b81548152906001019060200180831161149257829003601f168201915b5050505050905090565b80600c54816114c86007611ee8565b6114d291906138de565b1115611513576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150a90613980565b60405180910390fd5b6000811180156115255750600d548111155b611564576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155b906139ec565b60405180910390fd5b600061156f33611215565b9050600e54828261158091906138de565b11156115c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b890613a58565b60405180910390fd5b601060009054906101000a900460ff1615611611576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160890613ac4565b60405180910390fd5b600f5461161e6007611ee8565b11156116755782600b546116329190613ae4565b341015611674576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166b90613b8a565b60405180910390fd5b5b61167f3384612301565b505050565b61169661168f611e27565b8383612341565b5050565b600a80546116a7906133e7565b80601f01602080910402602001604051908101604052809291908181526020018280546116d3906133e7565b80156117205780601f106116f557610100808354040283529160200191611720565b820191906000526020600020905b81548152906001019060200180831161170357829003601f168201915b505050505081565b611730611e27565b73ffffffffffffffffffffffffffffffffffffffff1661174e6113f7565b73ffffffffffffffffffffffffffffffffffffffff16146117a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179b9061361b565b60405180910390fd5b80600d8190555050565b6117bf6117b9611e27565b83611ef6565b6117fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f5906136ad565b60405180910390fd5b61180a848484846124ae565b50505050565b606061181b82611dbb565b61185a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185190613c1c565b60405180910390fd5b60001515601060019054906101000a900460ff16151514156118ab57600a6118818361250a565b600960405160200161189593929190613d0c565b6040516020818303038152906040529050611907565b60006118b561266b565b905060008151116118d55760405180602001604052806000815250611903565b806118df8461250a565b60096040516020016118f393929190613d3d565b6040516020818303038152906040525b9150505b919050565b600c5481565b61191a611e27565b73ffffffffffffffffffffffffffffffffffffffff166119386113f7565b73ffffffffffffffffffffffffffffffffffffffff161461198e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119859061361b565b60405180910390fd5b80600e8190555050565b6119a0611e27565b73ffffffffffffffffffffffffffffffffffffffff166119be6113f7565b73ffffffffffffffffffffffffffffffffffffffff1614611a14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0b9061361b565b60405180910390fd5b80601060016101000a81548160ff02191690831515021790555050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b81600c5481611ad46007611ee8565b611ade91906138de565b1115611b1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1690613980565b60405180910390fd5b600081118015611b315750600d548111155b611b70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b67906139ec565b60405180910390fd5b6000611b7b33611215565b9050600e548282611b8c91906138de565b1115611bcd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc490613a58565b60405180910390fd5b611bd5611e27565b73ffffffffffffffffffffffffffffffffffffffff16611bf36113f7565b73ffffffffffffffffffffffffffffffffffffffff1614611c49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c409061361b565b60405180910390fd5b611c538385612301565b50505050565b611c61611e27565b73ffffffffffffffffffffffffffffffffffffffff16611c7f6113f7565b73ffffffffffffffffffffffffffffffffffffffff1614611cd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ccc9061361b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611d45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3c90613de0565b60405180910390fd5b611d4e8161223b565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611ea283611163565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b6000611f0182611dbb565b611f40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3790613e72565b60405180910390fd5b6000611f4b83611163565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611fba57508373ffffffffffffffffffffffffffffffffffffffff16611fa284610a29565b73ffffffffffffffffffffffffffffffffffffffff16145b80611fcb5750611fca8185611a31565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611ff482611163565b73ffffffffffffffffffffffffffffffffffffffff161461204a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204190613f04565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156120ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b190613f96565b60405180910390fd5b6120c58383836126fd565b6120d0600082611e2f565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121209190613fb6565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461217791906138de565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612236838383612702565b505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60005b8181101561233c576123166007612707565b612329836123246007611ee8565b61271d565b808061233490613771565b915050612304565b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156123b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a790614036565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516124a19190612c72565b60405180910390a3505050565b6124b9848484611fd4565b6124c58484848461273b565b612504576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124fb906140c8565b60405180910390fd5b50505050565b60606000821415612552576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612666565b600082905060005b6000821461258457808061256d90613771565b915050600a8261257d9190614117565b915061255a565b60008167ffffffffffffffff8111156125a05761259f612ea7565b5b6040519080825280601f01601f1916602001820160405280156125d25781602001600182028036833780820191505090505b5090505b6000851461265f576001826125eb9190613fb6565b9150600a856125fa9190614148565b603061260691906138de565b60f81b81838151811061261c5761261b613713565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856126589190614117565b94506125d6565b8093505050505b919050565b60606008805461267a906133e7565b80601f01602080910402602001604051908101604052809291908181526020018280546126a6906133e7565b80156126f35780601f106126c8576101008083540402835291602001916126f3565b820191906000526020600020905b8154815290600101906020018083116126d657829003601f168201915b5050505050905090565b505050565b505050565b6001816000016000828254019250508190555050565b6127378282604051806020016040528060008152506128c3565b5050565b600061275c8473ffffffffffffffffffffffffffffffffffffffff1661291e565b156128b6578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612785611e27565b8786866040518563ffffffff1660e01b81526004016127a794939291906141ce565b6020604051808303816000875af19250505080156127e357506040513d601f19601f820116820180604052508101906127e0919061422f565b60015b612866573d8060008114612813576040519150601f19603f3d011682016040523d82523d6000602084013e612818565b606091505b5060008151141561285e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612855906140c8565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506128bb565b600190505b949350505050565b6128cd8383612941565b6128da600084848461273b565b612919576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612910906140c8565b60405180910390fd5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156129b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129a8906142a8565b60405180910390fd5b6129ba81611dbb565b156129fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129f190614314565b60405180910390fd5b612a06600083836126fd565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a5691906138de565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612b1760008383612702565b5050565b828054612b27906133e7565b90600052602060002090601f016020900481019282612b495760008555612b90565b82601f10612b6257805160ff1916838001178555612b90565b82800160010185558215612b90579182015b82811115612b8f578251825591602001919060010190612b74565b5b509050612b9d9190612ba1565b5090565b5b80821115612bba576000816000905550600101612ba2565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612c0781612bd2565b8114612c1257600080fd5b50565b600081359050612c2481612bfe565b92915050565b600060208284031215612c4057612c3f612bc8565b5b6000612c4e84828501612c15565b91505092915050565b60008115159050919050565b612c6c81612c57565b82525050565b6000602082019050612c876000830184612c63565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612cc7578082015181840152602081019050612cac565b83811115612cd6576000848401525b50505050565b6000601f19601f8301169050919050565b6000612cf882612c8d565b612d028185612c98565b9350612d12818560208601612ca9565b612d1b81612cdc565b840191505092915050565b60006020820190508181036000830152612d408184612ced565b905092915050565b6000819050919050565b612d5b81612d48565b8114612d6657600080fd5b50565b600081359050612d7881612d52565b92915050565b600060208284031215612d9457612d93612bc8565b5b6000612da284828501612d69565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612dd682612dab565b9050919050565b612de681612dcb565b82525050565b6000602082019050612e016000830184612ddd565b92915050565b612e1081612dcb565b8114612e1b57600080fd5b50565b600081359050612e2d81612e07565b92915050565b60008060408385031215612e4a57612e49612bc8565b5b6000612e5885828601612e1e565b9250506020612e6985828601612d69565b9150509250929050565b612e7c81612d48565b82525050565b6000602082019050612e976000830184612e73565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612edf82612cdc565b810181811067ffffffffffffffff82111715612efe57612efd612ea7565b5b80604052505050565b6000612f11612bbe565b9050612f1d8282612ed6565b919050565b600067ffffffffffffffff821115612f3d57612f3c612ea7565b5b612f4682612cdc565b9050602081019050919050565b82818337600083830152505050565b6000612f75612f7084612f22565b612f07565b905082815260208101848484011115612f9157612f90612ea2565b5b612f9c848285612f53565b509392505050565b600082601f830112612fb957612fb8612e9d565b5b8135612fc9848260208601612f62565b91505092915050565b600060208284031215612fe857612fe7612bc8565b5b600082013567ffffffffffffffff81111561300657613005612bcd565b5b61301284828501612fa4565b91505092915050565b61302481612c57565b811461302f57600080fd5b50565b6000813590506130418161301b565b92915050565b60006020828403121561305d5761305c612bc8565b5b600061306b84828501613032565b91505092915050565b60008060006060848603121561308d5761308c612bc8565b5b600061309b86828701612e1e565b93505060206130ac86828701612e1e565b92505060406130bd86828701612d69565b9150509250925092565b6000602082840312156130dd576130dc612bc8565b5b60006130eb84828501612e1e565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61312981612d48565b82525050565b600061313b8383613120565b60208301905092915050565b6000602082019050919050565b600061315f826130f4565b61316981856130ff565b935061317483613110565b8060005b838110156131a557815161318c888261312f565b975061319783613147565b925050600181019050613178565b5085935050505092915050565b600060208201905081810360008301526131cc8184613154565b905092915050565b600080604083850312156131eb576131ea612bc8565b5b60006131f985828601612e1e565b925050602061320a85828601613032565b9150509250929050565b600067ffffffffffffffff82111561322f5761322e612ea7565b5b61323882612cdc565b9050602081019050919050565b600061325861325384613214565b612f07565b90508281526020810184848401111561327457613273612ea2565b5b61327f848285612f53565b509392505050565b600082601f83011261329c5761329b612e9d565b5b81356132ac848260208601613245565b91505092915050565b600080600080608085870312156132cf576132ce612bc8565b5b60006132dd87828801612e1e565b94505060206132ee87828801612e1e565b93505060406132ff87828801612d69565b925050606085013567ffffffffffffffff8111156133205761331f612bcd565b5b61332c87828801613287565b91505092959194509250565b6000806040838503121561334f5761334e612bc8565b5b600061335d85828601612e1e565b925050602061336e85828601612e1e565b9150509250929050565b6000806040838503121561338f5761338e612bc8565b5b600061339d85828601612d69565b92505060206133ae85828601612e1e565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806133ff57607f821691505b60208210811415613413576134126133b8565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613475602c83612c98565b915061348082613419565b604082019050919050565b600060208201905081810360008301526134a481613468565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613507602183612c98565b9150613512826134ab565b604082019050919050565b60006020820190508181036000830152613536816134fa565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000613599603883612c98565b91506135a48261353d565b604082019050919050565b600060208201905081810360008301526135c88161358c565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613605602083612c98565b9150613610826135cf565b602082019050919050565b60006020820190508181036000830152613634816135f8565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000613697603183612c98565b91506136a28261363b565b604082019050919050565b600060208201905081810360008301526136c68161368a565b9050919050565b600081905092915050565b50565b60006136e86000836136cd565b91506136f3826136d8565b600082019050919050565b6000613709826136db565b9150819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061377c82612d48565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156137af576137ae613742565b5b600182019050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000613816602983612c98565b9150613821826137ba565b604082019050919050565b6000602082019050818103600083015261384581613809565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b60006138a8602a83612c98565b91506138b38261384c565b604082019050919050565b600060208201905081810360008301526138d78161389b565b9050919050565b60006138e982612d48565b91506138f483612d48565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561392957613928613742565b5b828201905092915050565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b600061396a601483612c98565b915061397582613934565b602082019050919050565b600060208201905081810360008301526139998161395d565b9050919050565b7f43686f6f7365204e756d626572204265747765656e20312d3521000000000000600082015250565b60006139d6601a83612c98565b91506139e1826139a0565b602082019050919050565b60006020820190508181036000830152613a05816139c9565b9050919050565b7f4d6178206d696e7420616d6f756e742065786365656465642100000000000000600082015250565b6000613a42601983612c98565b9150613a4d82613a0c565b602082019050919050565b60006020820190508181036000830152613a7181613a35565b9050919050565b7f54686520636f6e74726163742069732070617573656421000000000000000000600082015250565b6000613aae601783612c98565b9150613ab982613a78565b602082019050919050565b60006020820190508181036000830152613add81613aa1565b9050919050565b6000613aef82612d48565b9150613afa83612d48565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613b3357613b32613742565b5b828202905092915050565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b6000613b74601383612c98565b9150613b7f82613b3e565b602082019050919050565b60006020820190508181036000830152613ba381613b67565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000613c06602f83612c98565b9150613c1182613baa565b604082019050919050565b60006020820190508181036000830152613c3581613bf9565b9050919050565b600081905092915050565b60008190508160005260206000209050919050565b60008154613c69816133e7565b613c738186613c3c565b94506001821660008114613c8e5760018114613c9f57613cd2565b60ff19831686528186019350613cd2565b613ca885613c47565b60005b83811015613cca57815481890152600182019150602081019050613cab565b838801955050505b50505092915050565b6000613ce682612c8d565b613cf08185613c3c565b9350613d00818560208601612ca9565b80840191505092915050565b6000613d188286613c5c565b9150613d248285613cdb565b9150613d308284613c5c565b9150819050949350505050565b6000613d498286613cdb565b9150613d558285613cdb565b9150613d618284613c5c565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613dca602683612c98565b9150613dd582613d6e565b604082019050919050565b60006020820190508181036000830152613df981613dbd565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613e5c602c83612c98565b9150613e6782613e00565b604082019050919050565b60006020820190508181036000830152613e8b81613e4f565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000613eee602583612c98565b9150613ef982613e92565b604082019050919050565b60006020820190508181036000830152613f1d81613ee1565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613f80602483612c98565b9150613f8b82613f24565b604082019050919050565b60006020820190508181036000830152613faf81613f73565b9050919050565b6000613fc182612d48565b9150613fcc83612d48565b925082821015613fdf57613fde613742565b5b828203905092915050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614020601983612c98565b915061402b82613fea565b602082019050919050565b6000602082019050818103600083015261404f81614013565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006140b2603283612c98565b91506140bd82614056565b604082019050919050565b600060208201905081810360008301526140e1816140a5565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061412282612d48565b915061412d83612d48565b92508261413d5761413c6140e8565b5b828204905092915050565b600061415382612d48565b915061415e83612d48565b92508261416e5761416d6140e8565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b60006141a082614179565b6141aa8185614184565b93506141ba818560208601612ca9565b6141c381612cdc565b840191505092915050565b60006080820190506141e36000830187612ddd565b6141f06020830186612ddd565b6141fd6040830185612e73565b818103606083015261420f8184614195565b905095945050505050565b60008151905061422981612bfe565b92915050565b60006020828403121561424557614244612bc8565b5b60006142538482850161421a565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614292602083612c98565b915061429d8261425c565b602082019050919050565b600060208201905081810360008301526142c181614285565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006142fe601c83612c98565b9150614309826142c8565b602082019050919050565b6000602082019050818103600083015261432d816142f1565b905091905056fea2646970667358221220958fb67a555257e3127abccaaaa511c510bdce2c4140b92dffb20308f1257c4e64736f6c634300080b0033

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

00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d6162717177544846436467583277574d3952456452764a625471387636755848367974546146706e6d7351642f00000000000000000000

-----Decoded View---------------
Arg [0] : _hiddenMetadataUri (string): ipfs://QmabqqwTHFCdgX2wWM9REdRvJbTq8v6uXH6ytTaFpnmsQd/

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [2] : 697066733a2f2f516d6162717177544846436467583277574d3952456452764a
Arg [3] : 625471387636755848367974546146706e6d7351642f00000000000000000000


Deployed Bytecode Sourcemap

36571:4161:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20426:309;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21327:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22776:211;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22341:377;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36866:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40083:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40189:77;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37662:89;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23508:332;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40272:137;;;;;;;;;;;;;:::i;:::-;;23903:165;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38241:617;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39467:74;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39839:132;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37095:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36757:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37065:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21043:225;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20791:198;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35734:97;;;;;;;;;;;;;:::i;:::-;;36981:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39977:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37028:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35123:81;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36939:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21482:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37757:299;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23051:149;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36828:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39547:130;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24131:321;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38864:510;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36903:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39683:150;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39380:81;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23263:186;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38062:173;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35976:191;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20426:309;20553:4;20598:25;20583:40;;;:11;:40;;;;:99;;;;20649:33;20634:48;;;:11;:48;;;;20583:99;:146;;;;20693:36;20717:11;20693:23;:36::i;:::-;20583:146;20569:160;;20426:309;;;:::o;21327:94::-;21381:13;21410:5;21403:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21327:94;:::o;22776:211::-;22852:7;22876:16;22884:7;22876;:16::i;:::-;22868:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22957:15;:24;22973:7;22957:24;;;;;;;;;;;;;;;;;;;;;22950:31;;22776:211;;;:::o;22341:377::-;22418:13;22434:23;22449:7;22434:14;:23::i;:::-;22418:39;;22478:5;22472:11;;:2;:11;;;;22464:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;22562:5;22546:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;22571:37;22588:5;22595:12;:10;:12::i;:::-;22571:16;:37::i;:::-;22546:62;22530:152;;;;;;;;;;;;:::i;:::-;;;;;;;;;22691:21;22700:2;22704:7;22691:8;:21::i;:::-;22411:307;22341:377;;:::o;36866:32::-;;;;:::o;40083:100::-;35336:12;:10;:12::i;:::-;35325:23;;:7;:5;:7::i;:::-;:23;;;35317:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40167:10:::1;40155:9;:22;;;;;;;;;;;;:::i;:::-;;40083:100:::0;:::o;40189:77::-;35336:12;:10;:12::i;:::-;35325:23;;:7;:5;:7::i;:::-;:23;;;35317:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40254:6:::1;40245;;:15;;;;;;;;;;;;;;;;;;40189:77:::0;:::o;37662:89::-;37706:7;37729:16;:6;:14;:16::i;:::-;37722:23;;37662:89;:::o;23508:332::-;23689:41;23708:12;:10;:12::i;:::-;23722:7;23689:18;:41::i;:::-;23673:124;;;;;;;;;;;;:::i;:::-;;;;;;;;;23806:28;23816:4;23822:2;23826:7;23806:9;:28::i;:::-;23508:332;;;:::o;40272:137::-;35336:12;:10;:12::i;:::-;35325:23;;:7;:5;:7::i;:::-;:23;;;35317:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40317:7:::1;40338;:5;:7::i;:::-;40330:21;;40359;40330:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40316:69;;;40400:2;40392:11;;;::::0;::::1;;40309:100;40272:137::o:0;23903:165::-;24023:39;24040:4;24046:2;24050:7;24023:39;;;;;;;;;;;;:16;:39::i;:::-;23903:165;;;:::o;38241:617::-;38301:16;38326:23;38352:17;38362:6;38352:9;:17::i;:::-;38326:43;;38376:30;38423:15;38409:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38376:63;;38446:22;38471:1;38446:26;;38479:23;38515:309;38540:15;38522;:33;:64;;;;;38577:9;;38559:14;:27;;38522:64;38515:309;;;38597:25;38625:23;38633:14;38625:7;:23::i;:::-;38597:51;;38684:6;38663:27;;:17;:27;;;38659:131;;;38736:14;38703:13;38717:15;38703:30;;;;;;;;:::i;:::-;;;;;;;:47;;;;;38763:17;;;;;:::i;:::-;;;;38659:131;38800:16;;;;;:::i;:::-;;;;38588:236;38515:309;;;38839:13;38832:20;;;;;;38241:617;;;:::o;39467:74::-;35336:12;:10;:12::i;:::-;35325:23;;:7;:5;:7::i;:::-;:23;;;35317:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39530:5:::1;39523:4;:12;;;;39467:74:::0;:::o;39839:132::-;35336:12;:10;:12::i;:::-;35325:23;;:7;:5;:7::i;:::-;:23;;;35317:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39947:18:::1;39927:17;:38;;;;;;;;;;;;:::i;:::-;;39839:132:::0;:::o;37095:28::-;;;;;;;;;;;;;:::o;36757:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;37065:25::-;;;;;;;;;;;;;:::o;21043:225::-;21115:7;21131:13;21147:7;:16;21155:7;21147:16;;;;;;;;;;;;;;;;;;;;;21131:32;;21195:1;21178:19;;:5;:19;;;;21170:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;21257:5;21250:12;;;21043:225;;;:::o;20791:198::-;20863:7;20904:1;20887:19;;:5;:19;;;;20879:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;20967:9;:16;20977:5;20967:16;;;;;;;;;;;;;;;;20960:23;;20791:198;;;:::o;35734:97::-;35336:12;:10;:12::i;:::-;35325:23;;:7;:5;:7::i;:::-;:23;;;35317:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;35795:30:::1;35822:1;35795:18;:30::i;:::-;35734:97::o:0;36981:42::-;;;;:::o;39977:100::-;35336:12;:10;:12::i;:::-;35325:23;;:7;:5;:7::i;:::-;:23;;;35317:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40061:10:::1;40049:9;:22;;;;;;;;;;;;:::i;:::-;;39977:100:::0;:::o;37028:30::-;;;;:::o;35123:81::-;35169:7;35192:6;;;;;;;;;;;35185:13;;35123:81;:::o;36939:37::-;;;;:::o;21482:98::-;21538:13;21567:7;21560:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21482:98;:::o;37757:299::-;37822:11;37355:9;;37340:11;37321:16;:6;:14;:16::i;:::-;:30;;;;:::i;:::-;:43;;37313:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;37418:1;37404:11;:15;:52;;;;;37438:18;;37423:11;:33;;37404:52;37396:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;37496:21;37520;37530:10;37520:9;:21::i;:::-;37496:45;;37587:23;;37572:11;37556:13;:27;;;;:::i;:::-;:54;;37548:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;37851:6:::1;;;;;;;;;;;37850:7;37842:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;37917:9;;37898:16;:6;:14;:16::i;:::-;:28;37894:114;;;37965:11;37958:4;;:18;;;;:::i;:::-;37945:9;:31;;37937:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;37894:114;38016:34;38026:10;38038:11;38016:9;:34::i;:::-;37306:350:::0;37757:299;;:::o;23051:149::-;23142:52;23161:12;:10;:12::i;:::-;23175:8;23185;23142:18;:52::i;:::-;23051:149;;:::o;36828:31::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;39547:130::-;35336:12;:10;:12::i;:::-;35325:23;;:7;:5;:7::i;:::-;:23;;;35317:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39652:19:::1;39631:18;:40;;;;39547:130:::0;:::o;24131:321::-;24292:41;24311:12;:10;:12::i;:::-;24325:7;24292:18;:41::i;:::-;24276:124;;;;;;;;;;;;:::i;:::-;;;;;;;;;24407:39;24421:4;24427:2;24431:7;24440:5;24407:13;:39::i;:::-;24131:321;;;;:::o;38864:510::-;38938:13;38968:17;38976:8;38968:7;:17::i;:::-;38960:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;39062:5;39050:17;;:8;;;;;;;;;;;:17;;;39046:122;;;39109:17;39128:19;:8;:17;:19::i;:::-;39149:9;39092:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;39078:82;;;;39046:122;39176:28;39207:10;:8;:10::i;:::-;39176:41;;39269:1;39244:14;39238:28;:32;:130;;;;;;;;;;;;;;;;;39306:14;39322:19;:8;:17;:19::i;:::-;39343:9;39289:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;39238:130;39224:144;;;38864:510;;;;:::o;36903:31::-;;;;:::o;39683:150::-;35336:12;:10;:12::i;:::-;35325:23;;:7;:5;:7::i;:::-;:23;;;35317:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39803:24:::1;39777:23;:50;;;;39683:150:::0;:::o;39380:81::-;35336:12;:10;:12::i;:::-;35325:23;;:7;:5;:7::i;:::-;:23;;;35317:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39449:6:::1;39438:8;;:17;;;;;;;;;;;;;;;;;;39380:81:::0;:::o;23263:186::-;23385:4;23408:18;:25;23427:5;23408:25;;;;;;;;;;;;;;;:35;23434:8;23408:35;;;;;;;;;;;;;;;;;;;;;;;;;23401:42;;23263:186;;;;:::o;38062:173::-;38158:11;37355:9;;37340:11;37321:16;:6;:14;:16::i;:::-;:30;;;;:::i;:::-;:43;;37313:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;37418:1;37404:11;:15;:52;;;;;37438:18;;37423:11;:33;;37404:52;37396:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;37496:21;37520;37530:10;37520:9;:21::i;:::-;37496:45;;37587:23;;37572:11;37556:13;:27;;;;:::i;:::-;:54;;37548:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;35336:12:::1;:10;:12::i;:::-;35325:23;;:7;:5;:7::i;:::-;:23;;;35317:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38196:33:::2;38206:9;38217:11;38196:9;:33::i;:::-;37306:350:::0;38062:173;;;:::o;35976:191::-;35336:12;:10;:12::i;:::-;35325:23;;:7;:5;:7::i;:::-;:23;;;35317:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36081:1:::1;36061:22;;:8;:22;;;;36053:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;36133:28;36152:8;36133:18;:28::i;:::-;35976:191:::0;:::o;18931:151::-;19016:4;19051:25;19036:40;;;:11;:40;;;;19029:47;;18931:151;;;:::o;25899:121::-;25964:4;26012:1;25984:30;;:7;:16;25992:7;25984:16;;;;;;;;;;;;;;;;;;;;;:30;;;;25977:37;;25899:121;;;:::o;15958:92::-;16011:7;16034:10;16027:17;;15958:92;:::o;29764:164::-;29862:2;29835:15;:24;29851:7;29835:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;29914:7;29910:2;29876:46;;29885:23;29900:7;29885:14;:23::i;:::-;29876:46;;;;;;;;;;;;29764:164;;:::o;33556:108::-;33621:7;33644;:14;;;33637:21;;33556:108;;;:::o;26171:371::-;26284:4;26308:16;26316:7;26308;:16::i;:::-;26300:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26380:13;26396:23;26411:7;26396:14;:23::i;:::-;26380:39;;26445:5;26434:16;;:7;:16;;;:58;;;;26485:7;26461:31;;:20;26473:7;26461:11;:20::i;:::-;:31;;;26434:58;:101;;;;26503:32;26520:5;26527:7;26503:16;:32::i;:::-;26434:101;26426:110;;;26171:371;;;;:::o;29089:569::-;29230:4;29203:31;;:23;29218:7;29203:14;:23::i;:::-;:31;;;29195:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;29305:1;29291:16;;:2;:16;;;;29283:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;29357:39;29378:4;29384:2;29388:7;29357:20;:39::i;:::-;29453:29;29470:1;29474:7;29453:8;:29::i;:::-;29510:1;29491:9;:15;29501:4;29491:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;29535:1;29518:9;:13;29528:2;29518:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29562:2;29543:7;:16;29551:7;29543:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29597:7;29593:2;29578:27;;29587:4;29578:27;;;;;;;;;;;;29614:38;29634:4;29640:2;29644:7;29614:19;:38::i;:::-;29089:569;;;:::o;36317:177::-;36387:16;36406:6;;;;;;;;;;;36387:25;;36428:8;36419:6;;:17;;;;;;;;;;;;;;;;;;36479:8;36448:40;;36469:8;36448:40;;;;;;;;;;;;36380:114;36317:177;:::o;40415:204::-;40495:9;40490:124;40514:11;40510:1;:15;40490:124;;;40541:18;:6;:16;:18::i;:::-;40568:38;40578:9;40589:16;:6;:14;:16::i;:::-;40568:9;:38::i;:::-;40527:3;;;;;:::i;:::-;;;;40490:124;;;;40415:204;;:::o;30058:287::-;30195:8;30186:17;;:5;:17;;;;30178:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;30278:8;30240:18;:25;30259:5;30240:25;;;;;;;;;;;;;;;:35;30266:8;30240:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;30320:8;30298:41;;30313:5;30298:41;;;30330:8;30298:41;;;;;;:::i;:::-;;;;;;;;30058:287;;;:::o;25296:308::-;25431:28;25441:4;25447:2;25451:7;25431:9;:28::i;:::-;25482:48;25505:4;25511:2;25515:7;25524:5;25482:22;:48::i;:::-;25466:132;;;;;;;;;;;;:::i;:::-;;;;;;;;;25296:308;;;;:::o;16511:637::-;16567:13;16785:1;16776:5;:10;16772:43;;;16797:10;;;;;;;;;;;;;;;;;;;;;16772:43;16821:12;16836:5;16821:20;;16848:14;16869:62;16884:1;16876:4;:9;16869:62;;16896:8;;;;;:::i;:::-;;;;16921:2;16913:10;;;;;:::i;:::-;;;16869:62;;;16937:19;16969:6;16959:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16937:39;;16983:132;16999:1;16990:5;:10;16983:132;;17021:1;17011:11;;;;;:::i;:::-;;;17082:2;17074:5;:10;;;;:::i;:::-;17061:2;:24;;;;:::i;:::-;17048:39;;17031:6;17038;17031:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;17105:2;17096:11;;;;;:::i;:::-;;;16983:132;;;17135:6;17121:21;;;;;16511:637;;;;:::o;40625:104::-;40685:13;40714:9;40707:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40625:104;:::o;32117:112::-;;;;:::o;32590:111::-;;;;:::o;33670:::-;33767:1;33749:7;:14;;;:19;;;;;;;;;;;33670:111;:::o;26862:104::-;26934:26;26944:2;26948:7;26934:26;;;;;;;;;;;;:9;:26::i;:::-;26862:104;;:::o;30888:687::-;31025:4;31042:15;:2;:13;;;:15::i;:::-;31038:532;;;31088:2;31072:36;;;31109:12;:10;:12::i;:::-;31123:4;31129:7;31138:5;31072:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;31068:461;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31327:1;31310:6;:13;:18;31306:214;;;31343:60;;;;;;;;;;:::i;:::-;;;;;;;;31306:214;31488:6;31482:13;31473:6;31469:2;31465:15;31458:38;31068:461;31215:41;;;31205:51;;;:6;:51;;;;31198:58;;;;;31038:532;31558:4;31551:11;;30888:687;;;;;;;:::o;27183:281::-;27295:18;27301:2;27305:7;27295:5;:18::i;:::-;27336:54;27367:1;27371:2;27375:7;27384:5;27336:22;:54::i;:::-;27320:138;;;;;;;;;;;;:::i;:::-;;;;;;;;;27183:281;;;:::o;8481:308::-;8541:4;8782:1;8760:7;:19;;;:23;8753:30;;8481:308;;;:::o;27774:409::-;27864:1;27850:16;;:2;:16;;;;27842:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;27919:16;27927:7;27919;:16::i;:::-;27918:17;27910:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;27977:45;28006:1;28010:2;28014:7;27977:20;:45::i;:::-;28048:1;28031:9;:13;28041:2;28031:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;28075:2;28056:7;:16;28064:7;28056:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;28116:7;28112:2;28091:33;;28108:1;28091:33;;;;;;;;;;;;28133:44;28161:1;28165:2;28169:7;28133:19;:44::i;:::-;27774:409;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:117::-;5399:1;5396;5389:12;5413:117;5522:1;5519;5512:12;5536:180;5584:77;5581:1;5574:88;5681:4;5678:1;5671:15;5705:4;5702:1;5695:15;5722:281;5805:27;5827:4;5805:27;:::i;:::-;5797:6;5793:40;5935:6;5923:10;5920:22;5899:18;5887:10;5884:34;5881:62;5878:88;;;5946:18;;:::i;:::-;5878:88;5986:10;5982:2;5975:22;5765:238;5722:281;;:::o;6009:129::-;6043:6;6070:20;;:::i;:::-;6060:30;;6099:33;6127:4;6119:6;6099:33;:::i;:::-;6009:129;;;:::o;6144:308::-;6206:4;6296:18;6288:6;6285:30;6282:56;;;6318:18;;:::i;:::-;6282:56;6356:29;6378:6;6356:29;:::i;:::-;6348:37;;6440:4;6434;6430:15;6422:23;;6144:308;;;:::o;6458:154::-;6542:6;6537:3;6532;6519:30;6604:1;6595:6;6590:3;6586:16;6579:27;6458:154;;;:::o;6618:412::-;6696:5;6721:66;6737:49;6779:6;6737:49;:::i;:::-;6721:66;:::i;:::-;6712:75;;6810:6;6803:5;6796:21;6848:4;6841:5;6837:16;6886:3;6877:6;6872:3;6868:16;6865:25;6862:112;;;6893:79;;:::i;:::-;6862:112;6983:41;7017:6;7012:3;7007;6983:41;:::i;:::-;6702:328;6618:412;;;;;:::o;7050:340::-;7106:5;7155:3;7148:4;7140:6;7136:17;7132:27;7122:122;;7163:79;;:::i;:::-;7122:122;7280:6;7267:20;7305:79;7380:3;7372:6;7365:4;7357:6;7353:17;7305:79;:::i;:::-;7296:88;;7112:278;7050:340;;;;:::o;7396:509::-;7465:6;7514:2;7502:9;7493:7;7489:23;7485:32;7482:119;;;7520:79;;:::i;:::-;7482:119;7668:1;7657:9;7653:17;7640:31;7698:18;7690:6;7687:30;7684:117;;;7720:79;;:::i;:::-;7684:117;7825:63;7880:7;7871:6;7860:9;7856:22;7825:63;:::i;:::-;7815:73;;7611:287;7396:509;;;;:::o;7911:116::-;7981:21;7996:5;7981:21;:::i;:::-;7974:5;7971:32;7961:60;;8017:1;8014;8007:12;7961:60;7911:116;:::o;8033:133::-;8076:5;8114:6;8101:20;8092:29;;8130:30;8154:5;8130:30;:::i;:::-;8033:133;;;;:::o;8172:323::-;8228:6;8277:2;8265:9;8256:7;8252:23;8248:32;8245:119;;;8283:79;;:::i;:::-;8245:119;8403:1;8428:50;8470:7;8461:6;8450:9;8446:22;8428:50;:::i;:::-;8418:60;;8374:114;8172:323;;;;:::o;8501:619::-;8578:6;8586;8594;8643:2;8631:9;8622:7;8618:23;8614:32;8611:119;;;8649:79;;:::i;:::-;8611:119;8769:1;8794:53;8839:7;8830:6;8819:9;8815:22;8794:53;:::i;:::-;8784:63;;8740:117;8896:2;8922:53;8967:7;8958:6;8947:9;8943:22;8922:53;:::i;:::-;8912:63;;8867:118;9024:2;9050:53;9095:7;9086:6;9075:9;9071:22;9050:53;:::i;:::-;9040:63;;8995:118;8501:619;;;;;:::o;9126:329::-;9185:6;9234:2;9222:9;9213:7;9209:23;9205:32;9202:119;;;9240:79;;:::i;:::-;9202:119;9360:1;9385:53;9430:7;9421:6;9410:9;9406:22;9385:53;:::i;:::-;9375:63;;9331:117;9126:329;;;;:::o;9461:114::-;9528:6;9562:5;9556:12;9546:22;;9461:114;;;:::o;9581:184::-;9680:11;9714:6;9709:3;9702:19;9754:4;9749:3;9745:14;9730:29;;9581:184;;;;:::o;9771:132::-;9838:4;9861:3;9853:11;;9891:4;9886:3;9882:14;9874:22;;9771:132;;;:::o;9909:108::-;9986:24;10004:5;9986:24;:::i;:::-;9981:3;9974:37;9909:108;;:::o;10023:179::-;10092:10;10113:46;10155:3;10147:6;10113:46;:::i;:::-;10191:4;10186:3;10182:14;10168:28;;10023:179;;;;:::o;10208:113::-;10278:4;10310;10305:3;10301:14;10293:22;;10208:113;;;:::o;10357:732::-;10476:3;10505:54;10553:5;10505:54;:::i;:::-;10575:86;10654:6;10649:3;10575:86;:::i;:::-;10568:93;;10685:56;10735:5;10685:56;:::i;:::-;10764:7;10795:1;10780:284;10805:6;10802:1;10799:13;10780:284;;;10881:6;10875:13;10908:63;10967:3;10952:13;10908:63;:::i;:::-;10901:70;;10994:60;11047:6;10994:60;:::i;:::-;10984:70;;10840:224;10827:1;10824;10820:9;10815:14;;10780:284;;;10784:14;11080:3;11073:10;;10481:608;;;10357:732;;;;:::o;11095:373::-;11238:4;11276:2;11265:9;11261:18;11253:26;;11325:9;11319:4;11315:20;11311:1;11300:9;11296:17;11289:47;11353:108;11456:4;11447:6;11353:108;:::i;:::-;11345:116;;11095:373;;;;:::o;11474:468::-;11539:6;11547;11596:2;11584:9;11575:7;11571:23;11567:32;11564:119;;;11602:79;;:::i;:::-;11564:119;11722:1;11747:53;11792:7;11783:6;11772:9;11768:22;11747:53;:::i;:::-;11737:63;;11693:117;11849:2;11875:50;11917:7;11908:6;11897:9;11893:22;11875:50;:::i;:::-;11865:60;;11820:115;11474:468;;;;;:::o;11948:307::-;12009:4;12099:18;12091:6;12088:30;12085:56;;;12121:18;;:::i;:::-;12085:56;12159:29;12181:6;12159:29;:::i;:::-;12151:37;;12243:4;12237;12233:15;12225:23;;11948:307;;;:::o;12261:410::-;12338:5;12363:65;12379:48;12420:6;12379:48;:::i;:::-;12363:65;:::i;:::-;12354:74;;12451:6;12444:5;12437:21;12489:4;12482:5;12478:16;12527:3;12518:6;12513:3;12509:16;12506:25;12503:112;;;12534:79;;:::i;:::-;12503:112;12624:41;12658:6;12653:3;12648;12624:41;:::i;:::-;12344:327;12261:410;;;;;:::o;12690:338::-;12745:5;12794:3;12787:4;12779:6;12775:17;12771:27;12761:122;;12802:79;;:::i;:::-;12761:122;12919:6;12906:20;12944:78;13018:3;13010:6;13003:4;12995:6;12991:17;12944:78;:::i;:::-;12935:87;;12751:277;12690:338;;;;:::o;13034:943::-;13129:6;13137;13145;13153;13202:3;13190:9;13181:7;13177:23;13173:33;13170:120;;;13209:79;;:::i;:::-;13170:120;13329:1;13354:53;13399:7;13390:6;13379:9;13375:22;13354:53;:::i;:::-;13344:63;;13300:117;13456:2;13482:53;13527:7;13518:6;13507:9;13503:22;13482:53;:::i;:::-;13472:63;;13427:118;13584:2;13610:53;13655:7;13646:6;13635:9;13631:22;13610:53;:::i;:::-;13600:63;;13555:118;13740:2;13729:9;13725:18;13712:32;13771:18;13763:6;13760:30;13757:117;;;13793:79;;:::i;:::-;13757:117;13898:62;13952:7;13943:6;13932:9;13928:22;13898:62;:::i;:::-;13888:72;;13683:287;13034:943;;;;;;;:::o;13983:474::-;14051:6;14059;14108:2;14096:9;14087:7;14083:23;14079:32;14076:119;;;14114:79;;:::i;:::-;14076:119;14234:1;14259:53;14304:7;14295:6;14284:9;14280:22;14259:53;:::i;:::-;14249:63;;14205:117;14361:2;14387:53;14432:7;14423:6;14412:9;14408:22;14387:53;:::i;:::-;14377:63;;14332:118;13983:474;;;;;:::o;14463:::-;14531:6;14539;14588:2;14576:9;14567:7;14563:23;14559:32;14556:119;;;14594:79;;:::i;:::-;14556:119;14714:1;14739:53;14784:7;14775:6;14764:9;14760:22;14739:53;:::i;:::-;14729:63;;14685:117;14841:2;14867:53;14912:7;14903:6;14892:9;14888:22;14867:53;:::i;:::-;14857:63;;14812:118;14463:474;;;;;:::o;14943:180::-;14991:77;14988:1;14981:88;15088:4;15085:1;15078:15;15112:4;15109:1;15102:15;15129:320;15173:6;15210:1;15204:4;15200:12;15190:22;;15257:1;15251:4;15247:12;15278:18;15268:81;;15334:4;15326:6;15322:17;15312:27;;15268:81;15396:2;15388:6;15385:14;15365:18;15362:38;15359:84;;;15415:18;;:::i;:::-;15359:84;15180:269;15129:320;;;:::o;15455:231::-;15595:34;15591:1;15583:6;15579:14;15572:58;15664:14;15659:2;15651:6;15647:15;15640:39;15455:231;:::o;15692:366::-;15834:3;15855:67;15919:2;15914:3;15855:67;:::i;:::-;15848:74;;15931:93;16020:3;15931:93;:::i;:::-;16049:2;16044:3;16040:12;16033:19;;15692:366;;;:::o;16064:419::-;16230:4;16268:2;16257:9;16253:18;16245:26;;16317:9;16311:4;16307:20;16303:1;16292:9;16288:17;16281:47;16345:131;16471:4;16345:131;:::i;:::-;16337:139;;16064:419;;;:::o;16489:220::-;16629:34;16625:1;16617:6;16613:14;16606:58;16698:3;16693:2;16685:6;16681:15;16674:28;16489:220;:::o;16715:366::-;16857:3;16878:67;16942:2;16937:3;16878:67;:::i;:::-;16871:74;;16954:93;17043:3;16954:93;:::i;:::-;17072:2;17067:3;17063:12;17056:19;;16715:366;;;:::o;17087:419::-;17253:4;17291:2;17280:9;17276:18;17268:26;;17340:9;17334:4;17330:20;17326:1;17315:9;17311:17;17304:47;17368:131;17494:4;17368:131;:::i;:::-;17360:139;;17087:419;;;:::o;17512:243::-;17652:34;17648:1;17640:6;17636:14;17629:58;17721:26;17716:2;17708:6;17704:15;17697:51;17512:243;:::o;17761:366::-;17903:3;17924:67;17988:2;17983:3;17924:67;:::i;:::-;17917:74;;18000:93;18089:3;18000:93;:::i;:::-;18118:2;18113:3;18109:12;18102:19;;17761:366;;;:::o;18133:419::-;18299:4;18337:2;18326:9;18322:18;18314:26;;18386:9;18380:4;18376:20;18372:1;18361:9;18357:17;18350:47;18414:131;18540:4;18414:131;:::i;:::-;18406:139;;18133:419;;;:::o;18558:182::-;18698:34;18694:1;18686:6;18682:14;18675:58;18558:182;:::o;18746:366::-;18888:3;18909:67;18973:2;18968:3;18909:67;:::i;:::-;18902:74;;18985:93;19074:3;18985:93;:::i;:::-;19103:2;19098:3;19094:12;19087:19;;18746:366;;;:::o;19118:419::-;19284:4;19322:2;19311:9;19307:18;19299:26;;19371:9;19365:4;19361:20;19357:1;19346:9;19342:17;19335:47;19399:131;19525:4;19399:131;:::i;:::-;19391:139;;19118:419;;;:::o;19543:236::-;19683:34;19679:1;19671:6;19667:14;19660:58;19752:19;19747:2;19739:6;19735:15;19728:44;19543:236;:::o;19785:366::-;19927:3;19948:67;20012:2;20007:3;19948:67;:::i;:::-;19941:74;;20024:93;20113:3;20024:93;:::i;:::-;20142:2;20137:3;20133:12;20126:19;;19785:366;;;:::o;20157:419::-;20323:4;20361:2;20350:9;20346:18;20338:26;;20410:9;20404:4;20400:20;20396:1;20385:9;20381:17;20374:47;20438:131;20564:4;20438:131;:::i;:::-;20430:139;;20157:419;;;:::o;20582:147::-;20683:11;20720:3;20705:18;;20582:147;;;;:::o;20735:114::-;;:::o;20855:398::-;21014:3;21035:83;21116:1;21111:3;21035:83;:::i;:::-;21028:90;;21127:93;21216:3;21127:93;:::i;:::-;21245:1;21240:3;21236:11;21229:18;;20855:398;;;:::o;21259:379::-;21443:3;21465:147;21608:3;21465:147;:::i;:::-;21458:154;;21629:3;21622:10;;21259:379;;;:::o;21644:180::-;21692:77;21689:1;21682:88;21789:4;21786:1;21779:15;21813:4;21810:1;21803:15;21830:180;21878:77;21875:1;21868:88;21975:4;21972:1;21965:15;21999:4;21996:1;21989:15;22016:233;22055:3;22078:24;22096:5;22078:24;:::i;:::-;22069:33;;22124:66;22117:5;22114:77;22111:103;;;22194:18;;:::i;:::-;22111:103;22241:1;22234:5;22230:13;22223:20;;22016:233;;;:::o;22255:228::-;22395:34;22391:1;22383:6;22379:14;22372:58;22464:11;22459:2;22451:6;22447:15;22440:36;22255:228;:::o;22489:366::-;22631:3;22652:67;22716:2;22711:3;22652:67;:::i;:::-;22645:74;;22728:93;22817:3;22728:93;:::i;:::-;22846:2;22841:3;22837:12;22830:19;;22489:366;;;:::o;22861:419::-;23027:4;23065:2;23054:9;23050:18;23042:26;;23114:9;23108:4;23104:20;23100:1;23089:9;23085:17;23078:47;23142:131;23268:4;23142:131;:::i;:::-;23134:139;;22861:419;;;:::o;23286:229::-;23426:34;23422:1;23414:6;23410:14;23403:58;23495:12;23490:2;23482:6;23478:15;23471:37;23286:229;:::o;23521:366::-;23663:3;23684:67;23748:2;23743:3;23684:67;:::i;:::-;23677:74;;23760:93;23849:3;23760:93;:::i;:::-;23878:2;23873:3;23869:12;23862:19;;23521:366;;;:::o;23893:419::-;24059:4;24097:2;24086:9;24082:18;24074:26;;24146:9;24140:4;24136:20;24132:1;24121:9;24117:17;24110:47;24174:131;24300:4;24174:131;:::i;:::-;24166:139;;23893:419;;;:::o;24318:305::-;24358:3;24377:20;24395:1;24377:20;:::i;:::-;24372:25;;24411:20;24429:1;24411:20;:::i;:::-;24406:25;;24565:1;24497:66;24493:74;24490:1;24487:81;24484:107;;;24571:18;;:::i;:::-;24484:107;24615:1;24612;24608:9;24601:16;;24318:305;;;;:::o;24629:170::-;24769:22;24765:1;24757:6;24753:14;24746:46;24629:170;:::o;24805:366::-;24947:3;24968:67;25032:2;25027:3;24968:67;:::i;:::-;24961:74;;25044:93;25133:3;25044:93;:::i;:::-;25162:2;25157:3;25153:12;25146:19;;24805:366;;;:::o;25177:419::-;25343:4;25381:2;25370:9;25366:18;25358:26;;25430:9;25424:4;25420:20;25416:1;25405:9;25401:17;25394:47;25458:131;25584:4;25458:131;:::i;:::-;25450:139;;25177:419;;;:::o;25602:176::-;25742:28;25738:1;25730:6;25726:14;25719:52;25602:176;:::o;25784:366::-;25926:3;25947:67;26011:2;26006:3;25947:67;:::i;:::-;25940:74;;26023:93;26112:3;26023:93;:::i;:::-;26141:2;26136:3;26132:12;26125:19;;25784:366;;;:::o;26156:419::-;26322:4;26360:2;26349:9;26345:18;26337:26;;26409:9;26403:4;26399:20;26395:1;26384:9;26380:17;26373:47;26437:131;26563:4;26437:131;:::i;:::-;26429:139;;26156:419;;;:::o;26581:175::-;26721:27;26717:1;26709:6;26705:14;26698:51;26581:175;:::o;26762:366::-;26904:3;26925:67;26989:2;26984:3;26925:67;:::i;:::-;26918:74;;27001:93;27090:3;27001:93;:::i;:::-;27119:2;27114:3;27110:12;27103:19;;26762:366;;;:::o;27134:419::-;27300:4;27338:2;27327:9;27323:18;27315:26;;27387:9;27381:4;27377:20;27373:1;27362:9;27358:17;27351:47;27415:131;27541:4;27415:131;:::i;:::-;27407:139;;27134:419;;;:::o;27559:173::-;27699:25;27695:1;27687:6;27683:14;27676:49;27559:173;:::o;27738:366::-;27880:3;27901:67;27965:2;27960:3;27901:67;:::i;:::-;27894:74;;27977:93;28066:3;27977:93;:::i;:::-;28095:2;28090:3;28086:12;28079:19;;27738:366;;;:::o;28110:419::-;28276:4;28314:2;28303:9;28299:18;28291:26;;28363:9;28357:4;28353:20;28349:1;28338:9;28334:17;28327:47;28391:131;28517:4;28391:131;:::i;:::-;28383:139;;28110:419;;;:::o;28535:348::-;28575:7;28598:20;28616:1;28598:20;:::i;:::-;28593:25;;28632:20;28650:1;28632:20;:::i;:::-;28627:25;;28820:1;28752:66;28748:74;28745:1;28742:81;28737:1;28730:9;28723:17;28719:105;28716:131;;;28827:18;;:::i;:::-;28716:131;28875:1;28872;28868:9;28857:20;;28535:348;;;;:::o;28889:169::-;29029:21;29025:1;29017:6;29013:14;29006:45;28889:169;:::o;29064:366::-;29206:3;29227:67;29291:2;29286:3;29227:67;:::i;:::-;29220:74;;29303:93;29392:3;29303:93;:::i;:::-;29421:2;29416:3;29412:12;29405:19;;29064:366;;;:::o;29436:419::-;29602:4;29640:2;29629:9;29625:18;29617:26;;29689:9;29683:4;29679:20;29675:1;29664:9;29660:17;29653:47;29717:131;29843:4;29717:131;:::i;:::-;29709:139;;29436:419;;;:::o;29861:234::-;30001:34;29997:1;29989:6;29985:14;29978:58;30070:17;30065:2;30057:6;30053:15;30046:42;29861:234;:::o;30101:366::-;30243:3;30264:67;30328:2;30323:3;30264:67;:::i;:::-;30257:74;;30340:93;30429:3;30340:93;:::i;:::-;30458:2;30453:3;30449:12;30442:19;;30101:366;;;:::o;30473:419::-;30639:4;30677:2;30666:9;30662:18;30654:26;;30726:9;30720:4;30716:20;30712:1;30701:9;30697:17;30690:47;30754:131;30880:4;30754:131;:::i;:::-;30746:139;;30473:419;;;:::o;30898:148::-;31000:11;31037:3;31022:18;;30898:148;;;;:::o;31052:141::-;31101:4;31124:3;31116:11;;31147:3;31144:1;31137:14;31181:4;31178:1;31168:18;31160:26;;31052:141;;;:::o;31223:845::-;31326:3;31363:5;31357:12;31392:36;31418:9;31392:36;:::i;:::-;31444:89;31526:6;31521:3;31444:89;:::i;:::-;31437:96;;31564:1;31553:9;31549:17;31580:1;31575:137;;;;31726:1;31721:341;;;;31542:520;;31575:137;31659:4;31655:9;31644;31640:25;31635:3;31628:38;31695:6;31690:3;31686:16;31679:23;;31575:137;;31721:341;31788:38;31820:5;31788:38;:::i;:::-;31848:1;31862:154;31876:6;31873:1;31870:13;31862:154;;;31950:7;31944:14;31940:1;31935:3;31931:11;31924:35;32000:1;31991:7;31987:15;31976:26;;31898:4;31895:1;31891:12;31886:17;;31862:154;;;32045:6;32040:3;32036:16;32029:23;;31728:334;;31542:520;;31330:738;;31223:845;;;;:::o;32074:377::-;32180:3;32208:39;32241:5;32208:39;:::i;:::-;32263:89;32345:6;32340:3;32263:89;:::i;:::-;32256:96;;32361:52;32406:6;32401:3;32394:4;32387:5;32383:16;32361:52;:::i;:::-;32438:6;32433:3;32429:16;32422:23;;32184:267;32074:377;;;;:::o;32457:583::-;32679:3;32701:92;32789:3;32780:6;32701:92;:::i;:::-;32694:99;;32810:95;32901:3;32892:6;32810:95;:::i;:::-;32803:102;;32922:92;33010:3;33001:6;32922:92;:::i;:::-;32915:99;;33031:3;33024:10;;32457:583;;;;;;:::o;33046:589::-;33271:3;33293:95;33384:3;33375:6;33293:95;:::i;:::-;33286:102;;33405:95;33496:3;33487:6;33405:95;:::i;:::-;33398:102;;33517:92;33605:3;33596:6;33517:92;:::i;:::-;33510:99;;33626:3;33619:10;;33046:589;;;;;;:::o;33641:225::-;33781:34;33777:1;33769:6;33765:14;33758:58;33850:8;33845:2;33837:6;33833:15;33826:33;33641:225;:::o;33872:366::-;34014:3;34035:67;34099:2;34094:3;34035:67;:::i;:::-;34028:74;;34111:93;34200:3;34111:93;:::i;:::-;34229:2;34224:3;34220:12;34213:19;;33872:366;;;:::o;34244:419::-;34410:4;34448:2;34437:9;34433:18;34425:26;;34497:9;34491:4;34487:20;34483:1;34472:9;34468:17;34461:47;34525:131;34651:4;34525:131;:::i;:::-;34517:139;;34244:419;;;:::o;34669:231::-;34809:34;34805:1;34797:6;34793:14;34786:58;34878:14;34873:2;34865:6;34861:15;34854:39;34669:231;:::o;34906:366::-;35048:3;35069:67;35133:2;35128:3;35069:67;:::i;:::-;35062:74;;35145:93;35234:3;35145:93;:::i;:::-;35263:2;35258:3;35254:12;35247:19;;34906:366;;;:::o;35278:419::-;35444:4;35482:2;35471:9;35467:18;35459:26;;35531:9;35525:4;35521:20;35517:1;35506:9;35502:17;35495:47;35559:131;35685:4;35559:131;:::i;:::-;35551:139;;35278:419;;;:::o;35703:224::-;35843:34;35839:1;35831:6;35827:14;35820:58;35912:7;35907:2;35899:6;35895:15;35888:32;35703:224;:::o;35933:366::-;36075:3;36096:67;36160:2;36155:3;36096:67;:::i;:::-;36089:74;;36172:93;36261:3;36172:93;:::i;:::-;36290:2;36285:3;36281:12;36274:19;;35933:366;;;:::o;36305:419::-;36471:4;36509:2;36498:9;36494:18;36486:26;;36558:9;36552:4;36548:20;36544:1;36533:9;36529:17;36522:47;36586:131;36712:4;36586:131;:::i;:::-;36578:139;;36305:419;;;:::o;36730:223::-;36870:34;36866:1;36858:6;36854:14;36847:58;36939:6;36934:2;36926:6;36922:15;36915:31;36730:223;:::o;36959:366::-;37101:3;37122:67;37186:2;37181:3;37122:67;:::i;:::-;37115:74;;37198:93;37287:3;37198:93;:::i;:::-;37316:2;37311:3;37307:12;37300:19;;36959:366;;;:::o;37331:419::-;37497:4;37535:2;37524:9;37520:18;37512:26;;37584:9;37578:4;37574:20;37570:1;37559:9;37555:17;37548:47;37612:131;37738:4;37612:131;:::i;:::-;37604:139;;37331:419;;;:::o;37756:191::-;37796:4;37816:20;37834:1;37816:20;:::i;:::-;37811:25;;37850:20;37868:1;37850:20;:::i;:::-;37845:25;;37889:1;37886;37883:8;37880:34;;;37894:18;;:::i;:::-;37880:34;37939:1;37936;37932:9;37924:17;;37756:191;;;;:::o;37953:175::-;38093:27;38089:1;38081:6;38077:14;38070:51;37953:175;:::o;38134:366::-;38276:3;38297:67;38361:2;38356:3;38297:67;:::i;:::-;38290:74;;38373:93;38462:3;38373:93;:::i;:::-;38491:2;38486:3;38482:12;38475:19;;38134:366;;;:::o;38506:419::-;38672:4;38710:2;38699:9;38695:18;38687:26;;38759:9;38753:4;38749:20;38745:1;38734:9;38730:17;38723:47;38787:131;38913:4;38787:131;:::i;:::-;38779:139;;38506:419;;;:::o;38931:237::-;39071:34;39067:1;39059:6;39055:14;39048:58;39140:20;39135:2;39127:6;39123:15;39116:45;38931:237;:::o;39174:366::-;39316:3;39337:67;39401:2;39396:3;39337:67;:::i;:::-;39330:74;;39413:93;39502:3;39413:93;:::i;:::-;39531:2;39526:3;39522:12;39515:19;;39174:366;;;:::o;39546:419::-;39712:4;39750:2;39739:9;39735:18;39727:26;;39799:9;39793:4;39789:20;39785:1;39774:9;39770:17;39763:47;39827:131;39953:4;39827:131;:::i;:::-;39819:139;;39546:419;;;:::o;39971:180::-;40019:77;40016:1;40009:88;40116:4;40113:1;40106:15;40140:4;40137:1;40130:15;40157:185;40197:1;40214:20;40232:1;40214:20;:::i;:::-;40209:25;;40248:20;40266:1;40248:20;:::i;:::-;40243:25;;40287:1;40277:35;;40292:18;;:::i;:::-;40277:35;40334:1;40331;40327:9;40322:14;;40157:185;;;;:::o;40348:176::-;40380:1;40397:20;40415:1;40397:20;:::i;:::-;40392:25;;40431:20;40449:1;40431:20;:::i;:::-;40426:25;;40470:1;40460:35;;40475:18;;:::i;:::-;40460:35;40516:1;40513;40509:9;40504:14;;40348:176;;;;:::o;40530:98::-;40581:6;40615:5;40609:12;40599:22;;40530:98;;;:::o;40634:168::-;40717:11;40751:6;40746:3;40739:19;40791:4;40786:3;40782:14;40767:29;;40634:168;;;;:::o;40808:360::-;40894:3;40922:38;40954:5;40922:38;:::i;:::-;40976:70;41039:6;41034:3;40976:70;:::i;:::-;40969:77;;41055:52;41100:6;41095:3;41088:4;41081:5;41077:16;41055:52;:::i;:::-;41132:29;41154:6;41132:29;:::i;:::-;41127:3;41123:39;41116:46;;40898:270;40808:360;;;;:::o;41174:640::-;41369:4;41407:3;41396:9;41392:19;41384:27;;41421:71;41489:1;41478:9;41474:17;41465:6;41421:71;:::i;:::-;41502:72;41570:2;41559:9;41555:18;41546:6;41502:72;:::i;:::-;41584;41652:2;41641:9;41637:18;41628:6;41584:72;:::i;:::-;41703:9;41697:4;41693:20;41688:2;41677:9;41673:18;41666:48;41731:76;41802:4;41793:6;41731:76;:::i;:::-;41723:84;;41174:640;;;;;;;:::o;41820:141::-;41876:5;41907:6;41901:13;41892:22;;41923:32;41949:5;41923:32;:::i;:::-;41820:141;;;;:::o;41967:349::-;42036:6;42085:2;42073:9;42064:7;42060:23;42056:32;42053:119;;;42091:79;;:::i;:::-;42053:119;42211:1;42236:63;42291:7;42282:6;42271:9;42267:22;42236:63;:::i;:::-;42226:73;;42182:127;41967:349;;;;:::o;42322:182::-;42462:34;42458:1;42450:6;42446:14;42439:58;42322:182;:::o;42510:366::-;42652:3;42673:67;42737:2;42732:3;42673:67;:::i;:::-;42666:74;;42749:93;42838:3;42749:93;:::i;:::-;42867:2;42862:3;42858:12;42851:19;;42510:366;;;:::o;42882:419::-;43048:4;43086:2;43075:9;43071:18;43063:26;;43135:9;43129:4;43125:20;43121:1;43110:9;43106:17;43099:47;43163:131;43289:4;43163:131;:::i;:::-;43155:139;;42882:419;;;:::o;43307:178::-;43447:30;43443:1;43435:6;43431:14;43424:54;43307:178;:::o;43491:366::-;43633:3;43654:67;43718:2;43713:3;43654:67;:::i;:::-;43647:74;;43730:93;43819:3;43730:93;:::i;:::-;43848:2;43843:3;43839:12;43832:19;;43491:366;;;:::o;43863:419::-;44029:4;44067:2;44056:9;44052:18;44044:26;;44116:9;44110:4;44106:20;44102:1;44091:9;44087:17;44080:47;44144:131;44270:4;44144:131;:::i;:::-;44136:139;;43863:419;;;:::o

Swarm Source

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