ETH Price: $2,873.60 (-9.22%)
Gas: 15 Gwei

Token

0xChainMonkeys (0xChainMonkeys)
 

Overview

Max Total Supply

3,333 0xChainMonkeys

Holders

257

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 0xChainMonkeys
0x56492e1f8d714797ac46b9847be3c940b271a2e7
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:
ChainMonkeys

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-02-20
*/

// 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/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/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/utils/introspection/IERC165.sol


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


// OpenZeppelin Contracts 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/extensions/IERC721Enumerable.sol


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

pragma solidity ^0.8.0;


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

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

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

// File: @openzeppelin/contracts/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/security/ReentrancyGuard.sol


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

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

// File: @openzeppelin/contracts/utils/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: contracts/ERC721A.sol



pragma solidity ^0.8.0;









/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata and Enumerable extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..).
 *
 * Assumes the number of issuable tokens (collection size) is capped and fits in a uint128.
 *
 * Does not support burning tokens to address(0).
 */
contract ERC721A is
  Context,
  ERC165,
  IERC721,
  IERC721Metadata,
  IERC721Enumerable
{
  using Address for address;
  using Strings for uint256;

  struct TokenOwnership {
    address addr;
    uint64 startTimestamp;
  }

  struct AddressData {
    uint128 balance;
    uint128 numberMinted;
  }

  uint256 private currentIndex = 0;

  uint256 internal collectionSize;
  uint256 internal maxBatchSize;

  // Token name
  string private _name;

  // Token symbol
  string private _symbol;

  // Mapping from token ID to ownership details
  // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details.
  mapping(uint256 => TokenOwnership) private _ownerships;

  // Mapping owner address to address data
  mapping(address => AddressData) private _addressData;

  // 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
   * `maxBatchSize` refers to how much a minter can mint at a time.
   * `collectionSize_` refers to how many tokens are in the collection.
   */
  constructor(
    string memory name_,
    string memory symbol_,
    uint256 maxBatchSize_,
    uint256 collectionSize_
  ) {
    require(
      collectionSize_ > 0,
      "ERC721A: collection must have a nonzero supply"
    );
    require(maxBatchSize_ > 0, "ERC721A: max batch size must be nonzero");
    _name = name_;
    _symbol = symbol_;
    maxBatchSize = maxBatchSize_;
    collectionSize = collectionSize_;
  }

   /**
   * @dev See maxBatchSize Functionality..
   */
  function changeMaxBatchSize(uint256 newBatch) public{
    maxBatchSize = newBatch;
  }

  function changeCollectionSize(uint256 newCollectionSize) public{
    collectionSize = newCollectionSize;
  }

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

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

  /**
   * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
   * This read function is O(collectionSize). If calling from a separate contract, be sure to test gas first.
   * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
   */
  function tokenOfOwnerByIndex(address owner, uint256 index)
    public
    view
    override
    returns (uint256)
  {
    require(index < balanceOf(owner), "ERC721A: owner index out of bounds");
    uint256 numMintedSoFar = totalSupply();
    uint256 tokenIdsIdx = 0;
    address currOwnershipAddr = address(0);
    for (uint256 i = 0; i < numMintedSoFar; i++) {
      TokenOwnership memory ownership = _ownerships[i];
      if (ownership.addr != address(0)) {
        currOwnershipAddr = ownership.addr;
      }
      if (currOwnershipAddr == owner) {
        if (tokenIdsIdx == index) {
          return i;
        }
        tokenIdsIdx++;
      }
    }
    revert("ERC721A: unable to get token of owner by index");
  }

  /**
   * @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 ||
      interfaceId == type(IERC721Enumerable).interfaceId ||
      super.supportsInterface(interfaceId);
  }

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

  function _numberMinted(address owner) internal view returns (uint256) {
    require(
      owner != address(0),
      "ERC721A: number minted query for the zero address"
    );
    return uint256(_addressData[owner].numberMinted);
  }

  function ownershipOf(uint256 tokenId)
    internal
    view
    returns (TokenOwnership memory)
  {
    require(_exists(tokenId), "ERC721A: owner query for nonexistent token");

    uint256 lowestTokenToCheck;
    if (tokenId >= maxBatchSize) {
      lowestTokenToCheck = tokenId - maxBatchSize + 1;
    }

    for (uint256 curr = tokenId; curr >= lowestTokenToCheck; curr--) {
      TokenOwnership memory ownership = _ownerships[curr];
      if (ownership.addr != address(0)) {
        return ownership;
      }
    }

    revert("ERC721A: unable to determine the owner of token");
  }

  /**
   * @dev See {IERC721-ownerOf}.
   */
  function ownerOf(uint256 tokenId) public view override returns (address) {
    return ownershipOf(tokenId).addr;
  }

  /**
   * @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 override {
    address owner = ERC721A.ownerOf(tokenId);
    require(to != owner, "ERC721A: approval to current owner");

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

    _approve(to, tokenId, owner);
  }

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

    return _tokenApprovals[tokenId];
  }

  /**
   * @dev See {IERC721-setApprovalForAll}.
   */
  function setApprovalForAll(address operator, bool approved) public override {
    require(operator != _msgSender(), "ERC721A: approve to caller");

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

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

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

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

  /**
   * @dev See {IERC721-safeTransferFrom}.
   */
  function safeTransferFrom(
    address from,
    address to,
    uint256 tokenId,
    bytes memory _data
  ) public override {
    _transfer(from, to, tokenId);
    require(
      _checkOnERC721Received(from, to, tokenId, _data),
      "ERC721A: 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`),
   */
  function _exists(uint256 tokenId) internal view returns (bool) {
    return tokenId < currentIndex;
  }

  function _safeMint(address to, uint256 quantity) internal {
    _safeMint(to, quantity, "");
  }

  /**
   * @dev Mints `quantity` tokens and transfers them to `to`.
   *
   * Requirements:
   *
   * - there must be `quantity` tokens remaining unminted in the total collection.
   * - `to` cannot be the zero address.
   * - `quantity` cannot be larger than the max batch size.
   *
   * Emits a {Transfer} event.
   */
  function _safeMint(
    address to,
    uint256 quantity,
    bytes memory _data
  ) internal {
    uint256 startTokenId = currentIndex;
    require(to != address(0), "ERC721A: mint to the zero address");
    // We know if the first token in the batch doesn't exist, the other ones don't as well, because of serial ordering.
    require(!_exists(startTokenId), "ERC721A: token already minted");
    require(quantity <= maxBatchSize, "ERC721A: quantity to mint too high");

    _beforeTokenTransfers(address(0), to, startTokenId, quantity);

    AddressData memory addressData = _addressData[to];
    _addressData[to] = AddressData(
      addressData.balance + uint128(quantity),
      addressData.numberMinted + uint128(quantity)
    );
    _ownerships[startTokenId] = TokenOwnership(to, uint64(block.timestamp));

    uint256 updatedIndex = startTokenId;

    for (uint256 i = 0; i < quantity; i++) {
      emit Transfer(address(0), to, updatedIndex);
      require(
        _checkOnERC721Received(address(0), to, updatedIndex, _data),
        "ERC721A: transfer to non ERC721Receiver implementer"
      );
      updatedIndex++;
    }

    currentIndex = updatedIndex;
    _afterTokenTransfers(address(0), to, startTokenId, quantity);
  }

  /**
   * @dev Transfers `tokenId` from `from` to `to`.
   *
   * 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
  ) private {
    TokenOwnership memory prevOwnership = ownershipOf(tokenId);

    bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr ||
      getApproved(tokenId) == _msgSender() ||
      isApprovedForAll(prevOwnership.addr, _msgSender()));

    require(
      isApprovedOrOwner,
      "ERC721A: transfer caller is not owner nor approved"
    );

    require(
      prevOwnership.addr == from,
      "ERC721A: transfer from incorrect owner"
    );
    require(to != address(0), "ERC721A: transfer to the zero address");

    _beforeTokenTransfers(from, to, tokenId, 1);

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

    _addressData[from].balance -= 1;
    _addressData[to].balance += 1;
    _ownerships[tokenId] = TokenOwnership(to, uint64(block.timestamp));

    // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
    // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
    uint256 nextTokenId = tokenId + 1;
    if (_ownerships[nextTokenId].addr == address(0)) {
      if (_exists(nextTokenId)) {
        _ownerships[nextTokenId] = TokenOwnership(
          prevOwnership.addr,
          prevOwnership.startTimestamp
        );
      }
    }

    emit Transfer(from, to, tokenId);
    _afterTokenTransfers(from, to, tokenId, 1);
  }

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

  uint256 public nextOwnerToExplicitlySet = 0;

  /**
   * @dev Explicitly set `owners` to eliminate loops in future calls of ownerOf().
   */
  function _setOwnersExplicit(uint256 quantity) internal {
    uint256 oldNextOwnerToSet = nextOwnerToExplicitlySet;
    require(quantity > 0, "quantity must be nonzero");
    uint256 endIndex = oldNextOwnerToSet + quantity - 1;
    if (endIndex > collectionSize - 1) {
      endIndex = collectionSize - 1;
    }
    // We know if the last one in the group exists, all in the group exist, due to serial ordering.
    require(_exists(endIndex), "not enough minted yet for this cleanup");
    for (uint256 i = oldNextOwnerToSet; i <= endIndex; i++) {
      if (_ownerships[i].addr == address(0)) {
        TokenOwnership memory ownership = ownershipOf(i);
        _ownerships[i] = TokenOwnership(
          ownership.addr,
          ownership.startTimestamp
        );
      }
    }
    nextOwnerToExplicitlySet = endIndex + 1;
  }

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

  /**
   * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
   *
   * startTokenId - the first token id to be transferred
   * quantity - the amount to be transferred
   *
   * 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`.
   */
  function _beforeTokenTransfers(
    address from,
    address to,
    uint256 startTokenId,
    uint256 quantity
  ) internal virtual {}

  /**
   * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
   * minting.
   *
   * startTokenId - the first token id to be transferred
   * quantity - the amount to be transferred
   *
   * Calling conditions:
   *
   * - when `from` and `to` are both non-zero.
   * - `from` and `to` are never both zero.
   */
  function _afterTokenTransfers(
    address from,
    address to,
    uint256 startTokenId,
    uint256 quantity
  ) internal virtual {}
}
// 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/0xChainMonkeys.sol



pragma solidity ^0.8.0;





contract ChainMonkeys is Ownable, ERC721A, ReentrancyGuard {

  constructor(
    uint256 maxBatchSize_,
    uint256 collectionSize_,
    uint256 amountForAuctionAndDev_,
    uint256 amountForDevs_
  ) ERC721A("0xChainMonkeys", "0xChainMonkeys", maxBatchSize_, collectionSize_) {
    require(amountForAuctionAndDev_ <= collectionSize_, "larger collection size needed" );
  }
    
    uint256 public pricePerPublic = 0.01 ether;
    uint256 maxSupply = 6969;
    mapping(address => uint256) public minted;
    bool public saleStart = false; 
  
  function setPublicSale(bool start) public onlyOwner{
    saleStart = start;
  }
  
  function setPublicSalePrice(uint256 price) public onlyOwner{
    pricePerPublic = price;
  }

  function setMaxSupply(uint256 newMax) public onlyOwner{
    maxSupply = newMax;
  }

/* 
    * @dev Public Sale Mint - First 1000 are free.
    * @param quantity Number of NFT's to be minted for FREE if there are less than 1000 total. This contract is very gas efficient, these free mints are very low risk.
    */

  function mintFreeFirst1000(uint256 quantity) external payable {
    require(saleStart, "Sale hasn't started");
    require(quantity <= 5, "Cant mint more than 5");
    require(totalSupply() + quantity <= 1000, "Sold out");
    require(minted[msg.sender] + quantity <= 5, "Cant mint more than 5 per wallet");
    minted[msg.sender] += quantity;    
    _safeMint(msg.sender, quantity);
  }

  function mintMarketing(address to, uint256 quantity) external payable onlyOwner {
    require(totalSupply() + quantity <= maxSupply, "Sold out");
    _safeMint(to, quantity);
  }

/* 
    * @dev Public Sale Mint
    * @param quantity How many NFT's you want for 0.01 each. This contract is very gas efficient.
    */
  function mint(uint256 quantity) external payable{
    require(quantity <= 10, "Cant mint more than 10 at once");
    require(totalSupply() + quantity <= maxSupply, "Sold out");
    require(msg.value >= pricePerPublic * quantity, "Not enough Eth");
    _safeMint(msg.sender, quantity);
  }

  // // metadata URI
  string private _baseTokenURI;

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

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

  function withdrawMoney() external onlyOwner nonReentrant {
    (bool success, ) = msg.sender.call{value: address(this).balance}("");
    require(success, "Transfer failed.");
  }

  function setOwnersExplicit(uint256 quantity) external onlyOwner nonReentrant {
    _setOwnersExplicit(quantity);
  }

  function numberMinted(address owner) public view returns (uint256) {
    return _numberMinted(owner);
  }

  function getOwnershipData(uint256 tokenId)
    external
    view
    returns (TokenOwnership memory)
  {
    return ownershipOf(tokenId);
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"uint256","name":"maxBatchSize_","type":"uint256"},{"internalType":"uint256","name":"collectionSize_","type":"uint256"},{"internalType":"uint256","name":"amountForAuctionAndDev_","type":"uint256"},{"internalType":"uint256","name":"amountForDevs_","type":"uint256"}],"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":[{"internalType":"uint256","name":"newCollectionSize","type":"uint256"}],"name":"changeCollectionSize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newBatch","type":"uint256"}],"name":"changeMaxBatchSize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getOwnershipData","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"}],"internalType":"struct ERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mintFreeFirst1000","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mintMarketing","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"minted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextOwnerToExplicitlySet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"pricePerPublic","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleStart","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMax","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"setOwnersExplicit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"start","type":"bool"}],"name":"setPublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"setPublicSalePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawMoney","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405260006001556000600a55662386f26fc10000600c55611b39600d556000600f60006101000a81548160ff0219169083151502179055503480156200004757600080fd5b50604051620056283803806200562883398181016040528101906200006d9190620003b6565b6040518060400160405280600e81526020017f3078436861696e4d6f6e6b6579730000000000000000000000000000000000008152506040518060400160405280600e81526020017f3078436861696e4d6f6e6b6579730000000000000000000000000000000000008152508585620000fb620000ef6200022360201b60201c565b6200022b60201b60201c565b6000811162000141576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200013890620004e1565b60405180910390fd5b6000821162000187576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200017e906200049d565b60405180910390fd5b83600490805190602001906200019f929190620002ef565b508260059080519060200190620001b8929190620002ef565b508160038190555080600281905550505050506001600b819055508282111562000219576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200021090620004bf565b60405180910390fd5b5050505062000669565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002fd906200051e565b90600052602060002090601f0160209004810192826200032157600085556200036d565b82601f106200033c57805160ff19168380011785556200036d565b828001600101855582156200036d579182015b828111156200036c5782518255916020019190600101906200034f565b5b5090506200037c919062000380565b5090565b5b808211156200039b57600081600090555060010162000381565b5090565b600081519050620003b0816200064f565b92915050565b60008060008060808587031215620003d357620003d262000583565b5b6000620003e3878288016200039f565b9450506020620003f6878288016200039f565b935050604062000409878288016200039f565b92505060606200041c878288016200039f565b91505092959194509250565b60006200043760278362000503565b9150620004448262000588565b604082019050919050565b60006200045e601d8362000503565b91506200046b82620005d7565b602082019050919050565b600062000485602e8362000503565b9150620004928262000600565b604082019050919050565b60006020820190508181036000830152620004b88162000428565b9050919050565b60006020820190508181036000830152620004da816200044f565b9050919050565b60006020820190508181036000830152620004fc8162000476565b9050919050565b600082825260208201905092915050565b6000819050919050565b600060028204905060018216806200053757607f821691505b602082108114156200054e576200054d62000554565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600080fd5b7f455243373231413a206d61782062617463682073697a65206d7573742062652060008201527f6e6f6e7a65726f00000000000000000000000000000000000000000000000000602082015250565b7f6c617267657220636f6c6c656374696f6e2073697a65206e6565646564000000600082015250565b7f455243373231413a20636f6c6c656374696f6e206d757374206861766520612060008201527f6e6f6e7a65726f20737570706c79000000000000000000000000000000000000602082015250565b6200065a8162000514565b81146200066657600080fd5b50565b614faf80620006796000396000f3fe60806040526004361061020f5760003560e01c8063715018a611610118578063a22cb465116100a0578063c87b56dd1161006f578063c87b56dd1461076c578063d7224ba0146107a9578063dc33e681146107d4578063e985e9c514610811578063f2fde38b1461084e5761020f565b8063a22cb465146106d8578063ab0bcc4114610701578063ac4460021461072c578063b88d4fde146107435761020f565b80638da5cb5b116100e75780638da5cb5b146106005780639231ab2a1461062b57806395d89b41146106685780639801b11c14610693578063a0712d68146106bc5761020f565b8063715018a614610579578063763f401114610590578063791a2519146105ac5780638736482d146105d55761020f565b806342842e0e1161019b5780636352211e1161016a5780636352211e146104915780636c6df75c146104ce5780636ebfd34d146104ea5780636f8b44b01461051357806370a082311461053c5761020f565b806342842e0e146103d95780634f6ccce71461040257806355f804b31461043f5780635aca1bb6146104685761020f565b806318160ddd116101e257806318160ddd146102e25780631e7269c51461030d57806323b872dd1461034a5780632d20fb60146103735780632f745c591461039c5761020f565b806301ffc9a71461021457806306fdde0314610251578063081812fc1461027c578063095ea7b3146102b9575b600080fd5b34801561022057600080fd5b5061023b600480360381019061023691906136d3565b610877565b6040516102489190613dc4565b60405180910390f35b34801561025d57600080fd5b506102666109c1565b6040516102739190613ddf565b60405180910390f35b34801561028857600080fd5b506102a3600480360381019061029e919061377a565b610a53565b6040516102b09190613d5d565b60405180910390f35b3480156102c557600080fd5b506102e060048036038101906102db9190613666565b610ad8565b005b3480156102ee57600080fd5b506102f7610bf1565b60405161030491906141fc565b60405180910390f35b34801561031957600080fd5b50610334600480360381019061032f91906134e3565b610bfb565b60405161034191906141fc565b60405180910390f35b34801561035657600080fd5b50610371600480360381019061036c9190613550565b610c13565b005b34801561037f57600080fd5b5061039a6004803603810190610395919061377a565b610c23565b005b3480156103a857600080fd5b506103c360048036038101906103be9190613666565b610d01565b6040516103d091906141fc565b60405180910390f35b3480156103e557600080fd5b5061040060048036038101906103fb9190613550565b610eff565b005b34801561040e57600080fd5b506104296004803603810190610424919061377a565b610f1f565b60405161043691906141fc565b60405180910390f35b34801561044b57600080fd5b506104666004803603810190610461919061372d565b610f72565b005b34801561047457600080fd5b5061048f600480360381019061048a91906136a6565b611004565b005b34801561049d57600080fd5b506104b860048036038101906104b3919061377a565b61109d565b6040516104c59190613d5d565b60405180910390f35b6104e860048036038101906104e3919061377a565b6110b3565b005b3480156104f657600080fd5b50610511600480360381019061050c919061377a565b61128e565b005b34801561051f57600080fd5b5061053a6004803603810190610535919061377a565b611298565b005b34801561054857600080fd5b50610563600480360381019061055e91906134e3565b61131e565b60405161057091906141fc565b60405180910390f35b34801561058557600080fd5b5061058e611407565b005b6105aa60048036038101906105a59190613666565b61148f565b005b3480156105b857600080fd5b506105d360048036038101906105ce919061377a565b611570565b005b3480156105e157600080fd5b506105ea6115f6565b6040516105f791906141fc565b60405180910390f35b34801561060c57600080fd5b506106156115fc565b6040516106229190613d5d565b60405180910390f35b34801561063757600080fd5b50610652600480360381019061064d919061377a565b611625565b60405161065f91906141e1565b60405180910390f35b34801561067457600080fd5b5061067d61163d565b60405161068a9190613ddf565b60405180910390f35b34801561069f57600080fd5b506106ba60048036038101906106b5919061377a565b6116cf565b005b6106d660048036038101906106d1919061377a565b6116d9565b005b3480156106e457600080fd5b506106ff60048036038101906106fa9190613626565b6117d1565b005b34801561070d57600080fd5b50610716611952565b6040516107239190613dc4565b60405180910390f35b34801561073857600080fd5b50610741611965565b005b34801561074f57600080fd5b5061076a600480360381019061076591906135a3565b611ae6565b005b34801561077857600080fd5b50610793600480360381019061078e919061377a565b611b42565b6040516107a09190613ddf565b60405180910390f35b3480156107b557600080fd5b506107be611be9565b6040516107cb91906141fc565b60405180910390f35b3480156107e057600080fd5b506107fb60048036038101906107f691906134e3565b611bef565b60405161080891906141fc565b60405180910390f35b34801561081d57600080fd5b5061083860048036038101906108339190613510565b611c01565b6040516108459190613dc4565b60405180910390f35b34801561085a57600080fd5b50610875600480360381019061087091906134e3565b611c95565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061094257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109aa57507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109ba57506109b982611d8d565b5b9050919050565b6060600480546109d09061455a565b80601f01602080910402602001604051908101604052809291908181526020018280546109fc9061455a565b8015610a495780601f10610a1e57610100808354040283529160200191610a49565b820191906000526020600020905b815481529060010190602001808311610a2c57829003601f168201915b5050505050905090565b6000610a5e82611df7565b610a9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a94906141a1565b60405180910390fd5b6008600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610ae38261109d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4b90614001565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b73611e05565b73ffffffffffffffffffffffffffffffffffffffff161480610ba25750610ba181610b9c611e05565b611c01565b5b610be1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd890613ee1565b60405180910390fd5b610bec838383611e0d565b505050565b6000600154905090565b600e6020528060005260406000206000915090505481565b610c1e838383611ebf565b505050565b610c2b611e05565b73ffffffffffffffffffffffffffffffffffffffff16610c496115fc565b73ffffffffffffffffffffffffffffffffffffffff1614610c9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9690613f61565b60405180910390fd5b6002600b541415610ce5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cdc90614161565b60405180910390fd5b6002600b81905550610cf681612478565b6001600b8190555050565b6000610d0c8361131e565b8210610d4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4490613e01565b60405180910390fd5b6000610d57610bf1565b905060008060005b83811015610ebd576000600660008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610e5157806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ea95786841415610e9a578195505050505050610ef9565b8380610ea5906145bd565b9450505b508080610eb5906145bd565b915050610d5f565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef090614101565b60405180910390fd5b92915050565b610f1a83838360405180602001604052806000815250611ae6565b505050565b6000610f29610bf1565b8210610f6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6190613e61565b60405180910390fd5b819050919050565b610f7a611e05565b73ffffffffffffffffffffffffffffffffffffffff16610f986115fc565b73ffffffffffffffffffffffffffffffffffffffff1614610fee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe590613f61565b60405180910390fd5b818160109190610fff9291906132d7565b505050565b61100c611e05565b73ffffffffffffffffffffffffffffffffffffffff1661102a6115fc565b73ffffffffffffffffffffffffffffffffffffffff1614611080576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107790613f61565b60405180910390fd5b80600f60006101000a81548160ff02191690831515021790555050565b60006110a8826126ca565b600001519050919050565b600f60009054906101000a900460ff16611102576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f990614141565b60405180910390fd5b6005811115611146576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113d90613fe1565b60405180910390fd5b6103e881611152610bf1565b61115c9190614301565b111561119d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119490614041565b60405180910390fd5b600581600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546111ea9190614301565b111561122b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122290613ec1565b60405180910390fd5b80600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461127a9190614301565b9250508190555061128b3382612891565b50565b8060038190555050565b6112a0611e05565b73ffffffffffffffffffffffffffffffffffffffff166112be6115fc565b73ffffffffffffffffffffffffffffffffffffffff1614611314576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130b90613f61565b60405180910390fd5b80600d8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561138f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138690613f21565b60405180910390fd5b600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b61140f611e05565b73ffffffffffffffffffffffffffffffffffffffff1661142d6115fc565b73ffffffffffffffffffffffffffffffffffffffff1614611483576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147a90613f61565b60405180910390fd5b61148d60006128af565b565b611497611e05565b73ffffffffffffffffffffffffffffffffffffffff166114b56115fc565b73ffffffffffffffffffffffffffffffffffffffff161461150b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150290613f61565b60405180910390fd5b600d5481611517610bf1565b6115219190614301565b1115611562576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155990614041565b60405180910390fd5b61156c8282612891565b5050565b611578611e05565b73ffffffffffffffffffffffffffffffffffffffff166115966115fc565b73ffffffffffffffffffffffffffffffffffffffff16146115ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e390613f61565b60405180910390fd5b80600c8190555050565b600c5481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61162d61335d565b611636826126ca565b9050919050565b60606005805461164c9061455a565b80601f01602080910402602001604051908101604052809291908181526020018280546116789061455a565b80156116c55780601f1061169a576101008083540402835291602001916116c5565b820191906000526020600020905b8154815290600101906020018083116116a857829003601f168201915b5050505050905090565b8060028190555050565b600a81111561171d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611714906140a1565b60405180910390fd5b600d5481611729610bf1565b6117339190614301565b1115611774576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176b90614041565b60405180910390fd5b80600c546117829190614388565b3410156117c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117bb906140e1565b60405180910390fd5b6117ce3382612891565b50565b6117d9611e05565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611847576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183e90613fa1565b60405180910390fd5b8060096000611854611e05565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611901611e05565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516119469190613dc4565b60405180910390a35050565b600f60009054906101000a900460ff1681565b61196d611e05565b73ffffffffffffffffffffffffffffffffffffffff1661198b6115fc565b73ffffffffffffffffffffffffffffffffffffffff16146119e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d890613f61565b60405180910390fd5b6002600b541415611a27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1e90614161565b60405180910390fd5b6002600b8190555060003373ffffffffffffffffffffffffffffffffffffffff1647604051611a5590613d48565b60006040518083038185875af1925050503d8060008114611a92576040519150601f19603f3d011682016040523d82523d6000602084013e611a97565b606091505b5050905080611adb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad290614021565b60405180910390fd5b506001600b81905550565b611af1848484611ebf565b611afd84848484612973565b611b3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3390614061565b60405180910390fd5b50505050565b6060611b4d82611df7565b611b8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8390613f81565b60405180910390fd5b6000611b96612b0a565b90506000815111611bb65760405180602001604052806000815250611be1565b80611bc084612b9c565b604051602001611bd1929190613d24565b6040516020818303038152906040525b915050919050565b600a5481565b6000611bfa82612cfd565b9050919050565b6000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611c9d611e05565b73ffffffffffffffffffffffffffffffffffffffff16611cbb6115fc565b73ffffffffffffffffffffffffffffffffffffffff1614611d11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0890613f61565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611d81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7890613e21565b60405180910390fd5b611d8a816128af565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600060015482109050919050565b600033905090565b826008600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000611eca826126ca565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16611ef1611e05565b73ffffffffffffffffffffffffffffffffffffffff161480611f4d5750611f16611e05565b73ffffffffffffffffffffffffffffffffffffffff16611f3584610a53565b73ffffffffffffffffffffffffffffffffffffffff16145b80611f695750611f688260000151611f63611e05565b611c01565b5b905080611fab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa290613fc1565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff161461201d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201490613f41565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561208d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208490613e81565b60405180910390fd5b61209a8585856001612de6565b6120aa6000848460000151611e0d565b6001600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff1661211891906143e2565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff166121bc91906142bb565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506006600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555090505060006001846122c29190614301565b9050600073ffffffffffffffffffffffffffffffffffffffff166006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156124085761233881611df7565b15612407576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506006600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46124708686866001612dec565b505050505050565b6000600a549050600082116124c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124b990613f01565b60405180910390fd5b6000600183836124d29190614301565b6124dc9190614416565b905060016002546124ed9190614416565b8111156125065760016002546125039190614416565b90505b61250f81611df7565b61254e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161254590614121565b60405180910390fd5b60008290505b8181116126b157600073ffffffffffffffffffffffffffffffffffffffff166006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561269e5760006125d1826126ca565b90506040518060400160405280826000015173ffffffffffffffffffffffffffffffffffffffff168152602001826020015167ffffffffffffffff168152506006600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050505b80806126a9906145bd565b915050612554565b506001816126bf9190614301565b600a81905550505050565b6126d261335d565b6126db82611df7565b61271a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161271190613e41565b60405180910390fd5b60006003548310612742576001600354846127359190614416565b61273f9190614301565b90505b60008390505b818110612850576000600660008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461283c5780935050505061288c565b50808061284890614530565b915050612748565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161288390614181565b60405180910390fd5b919050565b6128ab828260405180602001604052806000815250612df2565b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006129948473ffffffffffffffffffffffffffffffffffffffff166132b4565b15612afd578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026129bd611e05565b8786866040518563ffffffff1660e01b81526004016129df9493929190613d78565b602060405180830381600087803b1580156129f957600080fd5b505af1925050508015612a2a57506040513d601f19601f82011682018060405250810190612a279190613700565b60015b612aad573d8060008114612a5a576040519150601f19603f3d011682016040523d82523d6000602084013e612a5f565b606091505b50600081511415612aa5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a9c90614061565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612b02565b600190505b949350505050565b606060108054612b199061455a565b80601f0160208091040260200160405190810160405280929190818152602001828054612b459061455a565b8015612b925780601f10612b6757610100808354040283529160200191612b92565b820191906000526020600020905b815481529060010190602001808311612b7557829003601f168201915b5050505050905090565b60606000821415612be4576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612cf8565b600082905060005b60008214612c16578080612bff906145bd565b915050600a82612c0f9190614357565b9150612bec565b60008167ffffffffffffffff811115612c3257612c316146f3565b5b6040519080825280601f01601f191660200182016040528015612c645781602001600182028036833780820191505090505b5090505b60008514612cf157600182612c7d9190614416565b9150600a85612c8c9190614606565b6030612c989190614301565b60f81b818381518110612cae57612cad6146c4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612cea9190614357565b9450612c68565b8093505050505b919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612d6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d6590613ea1565b60405180910390fd5b600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b50505050565b50505050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612e69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e60906140c1565b60405180910390fd5b612e7281611df7565b15612eb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ea990614081565b60405180910390fd5b600354831115612ef7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eee906141c1565b60405180910390fd5b612f046000858386612de6565b6000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16815250509050604051806040016040528085836000015161300191906142bb565b6fffffffffffffffffffffffffffffffff16815260200185836020015161302891906142bb565b6fffffffffffffffffffffffffffffffff16815250600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506006600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b8581101561329757818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46132376000888488612973565b613276576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161326d90614061565b60405180910390fd5b8180613281906145bd565b925050808061328f906145bd565b9150506131c6565b50806001819055506132ac6000878588612dec565b505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b8280546132e39061455a565b90600052602060002090601f016020900481019282613305576000855561334c565b82601f1061331e57803560ff191683800117855561334c565b8280016001018555821561334c579182015b8281111561334b578235825591602001919060010190613330565b5b5090506133599190613397565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b808211156133b0576000816000905550600101613398565b5090565b60006133c76133c28461423c565b614217565b9050828152602081018484840111156133e3576133e2614731565b5b6133ee8482856144ee565b509392505050565b60008135905061340581614f1d565b92915050565b60008135905061341a81614f34565b92915050565b60008135905061342f81614f4b565b92915050565b60008151905061344481614f4b565b92915050565b600082601f83011261345f5761345e614727565b5b813561346f8482602086016133b4565b91505092915050565b60008083601f84011261348e5761348d614727565b5b8235905067ffffffffffffffff8111156134ab576134aa614722565b5b6020830191508360018202830111156134c7576134c661472c565b5b9250929050565b6000813590506134dd81614f62565b92915050565b6000602082840312156134f9576134f861473b565b5b6000613507848285016133f6565b91505092915050565b600080604083850312156135275761352661473b565b5b6000613535858286016133f6565b9250506020613546858286016133f6565b9150509250929050565b6000806000606084860312156135695761356861473b565b5b6000613577868287016133f6565b9350506020613588868287016133f6565b9250506040613599868287016134ce565b9150509250925092565b600080600080608085870312156135bd576135bc61473b565b5b60006135cb878288016133f6565b94505060206135dc878288016133f6565b93505060406135ed878288016134ce565b925050606085013567ffffffffffffffff81111561360e5761360d614736565b5b61361a8782880161344a565b91505092959194509250565b6000806040838503121561363d5761363c61473b565b5b600061364b858286016133f6565b925050602061365c8582860161340b565b9150509250929050565b6000806040838503121561367d5761367c61473b565b5b600061368b858286016133f6565b925050602061369c858286016134ce565b9150509250929050565b6000602082840312156136bc576136bb61473b565b5b60006136ca8482850161340b565b91505092915050565b6000602082840312156136e9576136e861473b565b5b60006136f784828501613420565b91505092915050565b6000602082840312156137165761371561473b565b5b600061372484828501613435565b91505092915050565b600080602083850312156137445761374361473b565b5b600083013567ffffffffffffffff81111561376257613761614736565b5b61376e85828601613478565b92509250509250929050565b6000602082840312156137905761378f61473b565b5b600061379e848285016134ce565b91505092915050565b6137b08161444a565b82525050565b6137bf8161444a565b82525050565b6137ce8161445c565b82525050565b60006137df8261426d565b6137e98185614283565b93506137f98185602086016144fd565b61380281614740565b840191505092915050565b600061381882614278565b613822818561429f565b93506138328185602086016144fd565b61383b81614740565b840191505092915050565b600061385182614278565b61385b81856142b0565b935061386b8185602086016144fd565b80840191505092915050565b600061388460228361429f565b915061388f82614751565b604082019050919050565b60006138a760268361429f565b91506138b2826147a0565b604082019050919050565b60006138ca602a8361429f565b91506138d5826147ef565b604082019050919050565b60006138ed60238361429f565b91506138f88261483e565b604082019050919050565b600061391060258361429f565b915061391b8261488d565b604082019050919050565b600061393360318361429f565b915061393e826148dc565b604082019050919050565b600061395660208361429f565b91506139618261492b565b602082019050919050565b600061397960398361429f565b915061398482614954565b604082019050919050565b600061399c60188361429f565b91506139a7826149a3565b602082019050919050565b60006139bf602b8361429f565b91506139ca826149cc565b604082019050919050565b60006139e260268361429f565b91506139ed82614a1b565b604082019050919050565b6000613a0560208361429f565b9150613a1082614a6a565b602082019050919050565b6000613a28602f8361429f565b9150613a3382614a93565b604082019050919050565b6000613a4b601a8361429f565b9150613a5682614ae2565b602082019050919050565b6000613a6e60328361429f565b9150613a7982614b0b565b604082019050919050565b6000613a9160158361429f565b9150613a9c82614b5a565b602082019050919050565b6000613ab460228361429f565b9150613abf82614b83565b604082019050919050565b6000613ad7600083614294565b9150613ae282614bd2565b600082019050919050565b6000613afa60108361429f565b9150613b0582614bd5565b602082019050919050565b6000613b1d60088361429f565b9150613b2882614bfe565b602082019050919050565b6000613b4060338361429f565b9150613b4b82614c27565b604082019050919050565b6000613b63601d8361429f565b9150613b6e82614c76565b602082019050919050565b6000613b86601e8361429f565b9150613b9182614c9f565b602082019050919050565b6000613ba960218361429f565b9150613bb482614cc8565b604082019050919050565b6000613bcc600e8361429f565b9150613bd782614d17565b602082019050919050565b6000613bef602e8361429f565b9150613bfa82614d40565b604082019050919050565b6000613c1260268361429f565b9150613c1d82614d8f565b604082019050919050565b6000613c3560138361429f565b9150613c4082614dde565b602082019050919050565b6000613c58601f8361429f565b9150613c6382614e07565b602082019050919050565b6000613c7b602f8361429f565b9150613c8682614e30565b604082019050919050565b6000613c9e602d8361429f565b9150613ca982614e7f565b604082019050919050565b6000613cc160228361429f565b9150613ccc82614ece565b604082019050919050565b604082016000820151613ced60008501826137a7565b506020820151613d006020850182613d15565b50505050565b613d0f816144d0565b82525050565b613d1e816144da565b82525050565b6000613d308285613846565b9150613d3c8284613846565b91508190509392505050565b6000613d5382613aca565b9150819050919050565b6000602082019050613d7260008301846137b6565b92915050565b6000608082019050613d8d60008301876137b6565b613d9a60208301866137b6565b613da76040830185613d06565b8181036060830152613db981846137d4565b905095945050505050565b6000602082019050613dd960008301846137c5565b92915050565b60006020820190508181036000830152613df9818461380d565b905092915050565b60006020820190508181036000830152613e1a81613877565b9050919050565b60006020820190508181036000830152613e3a8161389a565b9050919050565b60006020820190508181036000830152613e5a816138bd565b9050919050565b60006020820190508181036000830152613e7a816138e0565b9050919050565b60006020820190508181036000830152613e9a81613903565b9050919050565b60006020820190508181036000830152613eba81613926565b9050919050565b60006020820190508181036000830152613eda81613949565b9050919050565b60006020820190508181036000830152613efa8161396c565b9050919050565b60006020820190508181036000830152613f1a8161398f565b9050919050565b60006020820190508181036000830152613f3a816139b2565b9050919050565b60006020820190508181036000830152613f5a816139d5565b9050919050565b60006020820190508181036000830152613f7a816139f8565b9050919050565b60006020820190508181036000830152613f9a81613a1b565b9050919050565b60006020820190508181036000830152613fba81613a3e565b9050919050565b60006020820190508181036000830152613fda81613a61565b9050919050565b60006020820190508181036000830152613ffa81613a84565b9050919050565b6000602082019050818103600083015261401a81613aa7565b9050919050565b6000602082019050818103600083015261403a81613aed565b9050919050565b6000602082019050818103600083015261405a81613b10565b9050919050565b6000602082019050818103600083015261407a81613b33565b9050919050565b6000602082019050818103600083015261409a81613b56565b9050919050565b600060208201905081810360008301526140ba81613b79565b9050919050565b600060208201905081810360008301526140da81613b9c565b9050919050565b600060208201905081810360008301526140fa81613bbf565b9050919050565b6000602082019050818103600083015261411a81613be2565b9050919050565b6000602082019050818103600083015261413a81613c05565b9050919050565b6000602082019050818103600083015261415a81613c28565b9050919050565b6000602082019050818103600083015261417a81613c4b565b9050919050565b6000602082019050818103600083015261419a81613c6e565b9050919050565b600060208201905081810360008301526141ba81613c91565b9050919050565b600060208201905081810360008301526141da81613cb4565b9050919050565b60006040820190506141f66000830184613cd7565b92915050565b60006020820190506142116000830184613d06565b92915050565b6000614221614232565b905061422d828261458c565b919050565b6000604051905090565b600067ffffffffffffffff821115614257576142566146f3565b5b61426082614740565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006142c682614494565b91506142d183614494565b9250826fffffffffffffffffffffffffffffffff038211156142f6576142f5614637565b5b828201905092915050565b600061430c826144d0565b9150614317836144d0565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561434c5761434b614637565b5b828201905092915050565b6000614362826144d0565b915061436d836144d0565b92508261437d5761437c614666565b5b828204905092915050565b6000614393826144d0565b915061439e836144d0565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156143d7576143d6614637565b5b828202905092915050565b60006143ed82614494565b91506143f883614494565b92508282101561440b5761440a614637565b5b828203905092915050565b6000614421826144d0565b915061442c836144d0565b92508282101561443f5761443e614637565b5b828203905092915050565b6000614455826144b0565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b82818337600083830152505050565b60005b8381101561451b578082015181840152602081019050614500565b8381111561452a576000848401525b50505050565b600061453b826144d0565b9150600082141561454f5761454e614637565b5b600182039050919050565b6000600282049050600182168061457257607f821691505b6020821081141561458657614585614695565b5b50919050565b61459582614740565b810181811067ffffffffffffffff821117156145b4576145b36146f3565b5b80604052505050565b60006145c8826144d0565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156145fb576145fa614637565b5b600182019050919050565b6000614611826144d0565b915061461c836144d0565b92508261462c5761462b614666565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206e756d626572206d696e74656420717565727920666f7260008201527f20746865207a65726f2061646472657373000000000000000000000000000000602082015250565b7f43616e74206d696e74206d6f7265207468616e2035207065722077616c6c6574600082015250565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b7f7175616e74697479206d757374206265206e6f6e7a65726f0000000000000000600082015250565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f43616e74206d696e74206d6f7265207468616e20350000000000000000000000600082015250565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f536f6c64206f7574000000000000000000000000000000000000000000000000600082015250565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b7f455243373231413a20746f6b656e20616c7265616479206d696e746564000000600082015250565b7f43616e74206d696e74206d6f7265207468616e203130206174206f6e63650000600082015250565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f7420656e6f75676820457468000000000000000000000000000000000000600082015250565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b7f6e6f7420656e6f756768206d696e7465642079657420666f722074686973206360008201527f6c65616e75700000000000000000000000000000000000000000000000000000602082015250565b7f53616c65206861736e2774207374617274656400000000000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b7f455243373231413a207175616e7469747920746f206d696e7420746f6f20686960008201527f6768000000000000000000000000000000000000000000000000000000000000602082015250565b614f268161444a565b8114614f3157600080fd5b50565b614f3d8161445c565b8114614f4857600080fd5b50565b614f5481614468565b8114614f5f57600080fd5b50565b614f6b816144d0565b8114614f7657600080fd5b5056fea26469706673582212209a1cda0702ad2ae7fba2be675b783097c151fc64a3b9cef8e6496e8d6537c14f64736f6c63430008070033000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000001b3900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x60806040526004361061020f5760003560e01c8063715018a611610118578063a22cb465116100a0578063c87b56dd1161006f578063c87b56dd1461076c578063d7224ba0146107a9578063dc33e681146107d4578063e985e9c514610811578063f2fde38b1461084e5761020f565b8063a22cb465146106d8578063ab0bcc4114610701578063ac4460021461072c578063b88d4fde146107435761020f565b80638da5cb5b116100e75780638da5cb5b146106005780639231ab2a1461062b57806395d89b41146106685780639801b11c14610693578063a0712d68146106bc5761020f565b8063715018a614610579578063763f401114610590578063791a2519146105ac5780638736482d146105d55761020f565b806342842e0e1161019b5780636352211e1161016a5780636352211e146104915780636c6df75c146104ce5780636ebfd34d146104ea5780636f8b44b01461051357806370a082311461053c5761020f565b806342842e0e146103d95780634f6ccce71461040257806355f804b31461043f5780635aca1bb6146104685761020f565b806318160ddd116101e257806318160ddd146102e25780631e7269c51461030d57806323b872dd1461034a5780632d20fb60146103735780632f745c591461039c5761020f565b806301ffc9a71461021457806306fdde0314610251578063081812fc1461027c578063095ea7b3146102b9575b600080fd5b34801561022057600080fd5b5061023b600480360381019061023691906136d3565b610877565b6040516102489190613dc4565b60405180910390f35b34801561025d57600080fd5b506102666109c1565b6040516102739190613ddf565b60405180910390f35b34801561028857600080fd5b506102a3600480360381019061029e919061377a565b610a53565b6040516102b09190613d5d565b60405180910390f35b3480156102c557600080fd5b506102e060048036038101906102db9190613666565b610ad8565b005b3480156102ee57600080fd5b506102f7610bf1565b60405161030491906141fc565b60405180910390f35b34801561031957600080fd5b50610334600480360381019061032f91906134e3565b610bfb565b60405161034191906141fc565b60405180910390f35b34801561035657600080fd5b50610371600480360381019061036c9190613550565b610c13565b005b34801561037f57600080fd5b5061039a6004803603810190610395919061377a565b610c23565b005b3480156103a857600080fd5b506103c360048036038101906103be9190613666565b610d01565b6040516103d091906141fc565b60405180910390f35b3480156103e557600080fd5b5061040060048036038101906103fb9190613550565b610eff565b005b34801561040e57600080fd5b506104296004803603810190610424919061377a565b610f1f565b60405161043691906141fc565b60405180910390f35b34801561044b57600080fd5b506104666004803603810190610461919061372d565b610f72565b005b34801561047457600080fd5b5061048f600480360381019061048a91906136a6565b611004565b005b34801561049d57600080fd5b506104b860048036038101906104b3919061377a565b61109d565b6040516104c59190613d5d565b60405180910390f35b6104e860048036038101906104e3919061377a565b6110b3565b005b3480156104f657600080fd5b50610511600480360381019061050c919061377a565b61128e565b005b34801561051f57600080fd5b5061053a6004803603810190610535919061377a565b611298565b005b34801561054857600080fd5b50610563600480360381019061055e91906134e3565b61131e565b60405161057091906141fc565b60405180910390f35b34801561058557600080fd5b5061058e611407565b005b6105aa60048036038101906105a59190613666565b61148f565b005b3480156105b857600080fd5b506105d360048036038101906105ce919061377a565b611570565b005b3480156105e157600080fd5b506105ea6115f6565b6040516105f791906141fc565b60405180910390f35b34801561060c57600080fd5b506106156115fc565b6040516106229190613d5d565b60405180910390f35b34801561063757600080fd5b50610652600480360381019061064d919061377a565b611625565b60405161065f91906141e1565b60405180910390f35b34801561067457600080fd5b5061067d61163d565b60405161068a9190613ddf565b60405180910390f35b34801561069f57600080fd5b506106ba60048036038101906106b5919061377a565b6116cf565b005b6106d660048036038101906106d1919061377a565b6116d9565b005b3480156106e457600080fd5b506106ff60048036038101906106fa9190613626565b6117d1565b005b34801561070d57600080fd5b50610716611952565b6040516107239190613dc4565b60405180910390f35b34801561073857600080fd5b50610741611965565b005b34801561074f57600080fd5b5061076a600480360381019061076591906135a3565b611ae6565b005b34801561077857600080fd5b50610793600480360381019061078e919061377a565b611b42565b6040516107a09190613ddf565b60405180910390f35b3480156107b557600080fd5b506107be611be9565b6040516107cb91906141fc565b60405180910390f35b3480156107e057600080fd5b506107fb60048036038101906107f691906134e3565b611bef565b60405161080891906141fc565b60405180910390f35b34801561081d57600080fd5b5061083860048036038101906108339190613510565b611c01565b6040516108459190613dc4565b60405180910390f35b34801561085a57600080fd5b50610875600480360381019061087091906134e3565b611c95565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061094257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109aa57507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109ba57506109b982611d8d565b5b9050919050565b6060600480546109d09061455a565b80601f01602080910402602001604051908101604052809291908181526020018280546109fc9061455a565b8015610a495780601f10610a1e57610100808354040283529160200191610a49565b820191906000526020600020905b815481529060010190602001808311610a2c57829003601f168201915b5050505050905090565b6000610a5e82611df7565b610a9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a94906141a1565b60405180910390fd5b6008600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610ae38261109d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4b90614001565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b73611e05565b73ffffffffffffffffffffffffffffffffffffffff161480610ba25750610ba181610b9c611e05565b611c01565b5b610be1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd890613ee1565b60405180910390fd5b610bec838383611e0d565b505050565b6000600154905090565b600e6020528060005260406000206000915090505481565b610c1e838383611ebf565b505050565b610c2b611e05565b73ffffffffffffffffffffffffffffffffffffffff16610c496115fc565b73ffffffffffffffffffffffffffffffffffffffff1614610c9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9690613f61565b60405180910390fd5b6002600b541415610ce5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cdc90614161565b60405180910390fd5b6002600b81905550610cf681612478565b6001600b8190555050565b6000610d0c8361131e565b8210610d4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4490613e01565b60405180910390fd5b6000610d57610bf1565b905060008060005b83811015610ebd576000600660008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610e5157806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ea95786841415610e9a578195505050505050610ef9565b8380610ea5906145bd565b9450505b508080610eb5906145bd565b915050610d5f565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef090614101565b60405180910390fd5b92915050565b610f1a83838360405180602001604052806000815250611ae6565b505050565b6000610f29610bf1565b8210610f6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6190613e61565b60405180910390fd5b819050919050565b610f7a611e05565b73ffffffffffffffffffffffffffffffffffffffff16610f986115fc565b73ffffffffffffffffffffffffffffffffffffffff1614610fee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe590613f61565b60405180910390fd5b818160109190610fff9291906132d7565b505050565b61100c611e05565b73ffffffffffffffffffffffffffffffffffffffff1661102a6115fc565b73ffffffffffffffffffffffffffffffffffffffff1614611080576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107790613f61565b60405180910390fd5b80600f60006101000a81548160ff02191690831515021790555050565b60006110a8826126ca565b600001519050919050565b600f60009054906101000a900460ff16611102576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f990614141565b60405180910390fd5b6005811115611146576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113d90613fe1565b60405180910390fd5b6103e881611152610bf1565b61115c9190614301565b111561119d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119490614041565b60405180910390fd5b600581600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546111ea9190614301565b111561122b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122290613ec1565b60405180910390fd5b80600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461127a9190614301565b9250508190555061128b3382612891565b50565b8060038190555050565b6112a0611e05565b73ffffffffffffffffffffffffffffffffffffffff166112be6115fc565b73ffffffffffffffffffffffffffffffffffffffff1614611314576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130b90613f61565b60405180910390fd5b80600d8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561138f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138690613f21565b60405180910390fd5b600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b61140f611e05565b73ffffffffffffffffffffffffffffffffffffffff1661142d6115fc565b73ffffffffffffffffffffffffffffffffffffffff1614611483576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147a90613f61565b60405180910390fd5b61148d60006128af565b565b611497611e05565b73ffffffffffffffffffffffffffffffffffffffff166114b56115fc565b73ffffffffffffffffffffffffffffffffffffffff161461150b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150290613f61565b60405180910390fd5b600d5481611517610bf1565b6115219190614301565b1115611562576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155990614041565b60405180910390fd5b61156c8282612891565b5050565b611578611e05565b73ffffffffffffffffffffffffffffffffffffffff166115966115fc565b73ffffffffffffffffffffffffffffffffffffffff16146115ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e390613f61565b60405180910390fd5b80600c8190555050565b600c5481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61162d61335d565b611636826126ca565b9050919050565b60606005805461164c9061455a565b80601f01602080910402602001604051908101604052809291908181526020018280546116789061455a565b80156116c55780601f1061169a576101008083540402835291602001916116c5565b820191906000526020600020905b8154815290600101906020018083116116a857829003601f168201915b5050505050905090565b8060028190555050565b600a81111561171d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611714906140a1565b60405180910390fd5b600d5481611729610bf1565b6117339190614301565b1115611774576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176b90614041565b60405180910390fd5b80600c546117829190614388565b3410156117c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117bb906140e1565b60405180910390fd5b6117ce3382612891565b50565b6117d9611e05565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611847576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183e90613fa1565b60405180910390fd5b8060096000611854611e05565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611901611e05565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516119469190613dc4565b60405180910390a35050565b600f60009054906101000a900460ff1681565b61196d611e05565b73ffffffffffffffffffffffffffffffffffffffff1661198b6115fc565b73ffffffffffffffffffffffffffffffffffffffff16146119e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d890613f61565b60405180910390fd5b6002600b541415611a27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1e90614161565b60405180910390fd5b6002600b8190555060003373ffffffffffffffffffffffffffffffffffffffff1647604051611a5590613d48565b60006040518083038185875af1925050503d8060008114611a92576040519150601f19603f3d011682016040523d82523d6000602084013e611a97565b606091505b5050905080611adb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad290614021565b60405180910390fd5b506001600b81905550565b611af1848484611ebf565b611afd84848484612973565b611b3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3390614061565b60405180910390fd5b50505050565b6060611b4d82611df7565b611b8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8390613f81565b60405180910390fd5b6000611b96612b0a565b90506000815111611bb65760405180602001604052806000815250611be1565b80611bc084612b9c565b604051602001611bd1929190613d24565b6040516020818303038152906040525b915050919050565b600a5481565b6000611bfa82612cfd565b9050919050565b6000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611c9d611e05565b73ffffffffffffffffffffffffffffffffffffffff16611cbb6115fc565b73ffffffffffffffffffffffffffffffffffffffff1614611d11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0890613f61565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611d81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7890613e21565b60405180910390fd5b611d8a816128af565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600060015482109050919050565b600033905090565b826008600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000611eca826126ca565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16611ef1611e05565b73ffffffffffffffffffffffffffffffffffffffff161480611f4d5750611f16611e05565b73ffffffffffffffffffffffffffffffffffffffff16611f3584610a53565b73ffffffffffffffffffffffffffffffffffffffff16145b80611f695750611f688260000151611f63611e05565b611c01565b5b905080611fab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa290613fc1565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff161461201d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201490613f41565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561208d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208490613e81565b60405180910390fd5b61209a8585856001612de6565b6120aa6000848460000151611e0d565b6001600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff1661211891906143e2565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff166121bc91906142bb565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506006600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555090505060006001846122c29190614301565b9050600073ffffffffffffffffffffffffffffffffffffffff166006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156124085761233881611df7565b15612407576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506006600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46124708686866001612dec565b505050505050565b6000600a549050600082116124c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124b990613f01565b60405180910390fd5b6000600183836124d29190614301565b6124dc9190614416565b905060016002546124ed9190614416565b8111156125065760016002546125039190614416565b90505b61250f81611df7565b61254e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161254590614121565b60405180910390fd5b60008290505b8181116126b157600073ffffffffffffffffffffffffffffffffffffffff166006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561269e5760006125d1826126ca565b90506040518060400160405280826000015173ffffffffffffffffffffffffffffffffffffffff168152602001826020015167ffffffffffffffff168152506006600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050505b80806126a9906145bd565b915050612554565b506001816126bf9190614301565b600a81905550505050565b6126d261335d565b6126db82611df7565b61271a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161271190613e41565b60405180910390fd5b60006003548310612742576001600354846127359190614416565b61273f9190614301565b90505b60008390505b818110612850576000600660008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461283c5780935050505061288c565b50808061284890614530565b915050612748565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161288390614181565b60405180910390fd5b919050565b6128ab828260405180602001604052806000815250612df2565b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006129948473ffffffffffffffffffffffffffffffffffffffff166132b4565b15612afd578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026129bd611e05565b8786866040518563ffffffff1660e01b81526004016129df9493929190613d78565b602060405180830381600087803b1580156129f957600080fd5b505af1925050508015612a2a57506040513d601f19601f82011682018060405250810190612a279190613700565b60015b612aad573d8060008114612a5a576040519150601f19603f3d011682016040523d82523d6000602084013e612a5f565b606091505b50600081511415612aa5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a9c90614061565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612b02565b600190505b949350505050565b606060108054612b199061455a565b80601f0160208091040260200160405190810160405280929190818152602001828054612b459061455a565b8015612b925780601f10612b6757610100808354040283529160200191612b92565b820191906000526020600020905b815481529060010190602001808311612b7557829003601f168201915b5050505050905090565b60606000821415612be4576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612cf8565b600082905060005b60008214612c16578080612bff906145bd565b915050600a82612c0f9190614357565b9150612bec565b60008167ffffffffffffffff811115612c3257612c316146f3565b5b6040519080825280601f01601f191660200182016040528015612c645781602001600182028036833780820191505090505b5090505b60008514612cf157600182612c7d9190614416565b9150600a85612c8c9190614606565b6030612c989190614301565b60f81b818381518110612cae57612cad6146c4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612cea9190614357565b9450612c68565b8093505050505b919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612d6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d6590613ea1565b60405180910390fd5b600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b50505050565b50505050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612e69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e60906140c1565b60405180910390fd5b612e7281611df7565b15612eb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ea990614081565b60405180910390fd5b600354831115612ef7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eee906141c1565b60405180910390fd5b612f046000858386612de6565b6000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16815250509050604051806040016040528085836000015161300191906142bb565b6fffffffffffffffffffffffffffffffff16815260200185836020015161302891906142bb565b6fffffffffffffffffffffffffffffffff16815250600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506006600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b8581101561329757818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46132376000888488612973565b613276576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161326d90614061565b60405180910390fd5b8180613281906145bd565b925050808061328f906145bd565b9150506131c6565b50806001819055506132ac6000878588612dec565b505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b8280546132e39061455a565b90600052602060002090601f016020900481019282613305576000855561334c565b82601f1061331e57803560ff191683800117855561334c565b8280016001018555821561334c579182015b8281111561334b578235825591602001919060010190613330565b5b5090506133599190613397565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b808211156133b0576000816000905550600101613398565b5090565b60006133c76133c28461423c565b614217565b9050828152602081018484840111156133e3576133e2614731565b5b6133ee8482856144ee565b509392505050565b60008135905061340581614f1d565b92915050565b60008135905061341a81614f34565b92915050565b60008135905061342f81614f4b565b92915050565b60008151905061344481614f4b565b92915050565b600082601f83011261345f5761345e614727565b5b813561346f8482602086016133b4565b91505092915050565b60008083601f84011261348e5761348d614727565b5b8235905067ffffffffffffffff8111156134ab576134aa614722565b5b6020830191508360018202830111156134c7576134c661472c565b5b9250929050565b6000813590506134dd81614f62565b92915050565b6000602082840312156134f9576134f861473b565b5b6000613507848285016133f6565b91505092915050565b600080604083850312156135275761352661473b565b5b6000613535858286016133f6565b9250506020613546858286016133f6565b9150509250929050565b6000806000606084860312156135695761356861473b565b5b6000613577868287016133f6565b9350506020613588868287016133f6565b9250506040613599868287016134ce565b9150509250925092565b600080600080608085870312156135bd576135bc61473b565b5b60006135cb878288016133f6565b94505060206135dc878288016133f6565b93505060406135ed878288016134ce565b925050606085013567ffffffffffffffff81111561360e5761360d614736565b5b61361a8782880161344a565b91505092959194509250565b6000806040838503121561363d5761363c61473b565b5b600061364b858286016133f6565b925050602061365c8582860161340b565b9150509250929050565b6000806040838503121561367d5761367c61473b565b5b600061368b858286016133f6565b925050602061369c858286016134ce565b9150509250929050565b6000602082840312156136bc576136bb61473b565b5b60006136ca8482850161340b565b91505092915050565b6000602082840312156136e9576136e861473b565b5b60006136f784828501613420565b91505092915050565b6000602082840312156137165761371561473b565b5b600061372484828501613435565b91505092915050565b600080602083850312156137445761374361473b565b5b600083013567ffffffffffffffff81111561376257613761614736565b5b61376e85828601613478565b92509250509250929050565b6000602082840312156137905761378f61473b565b5b600061379e848285016134ce565b91505092915050565b6137b08161444a565b82525050565b6137bf8161444a565b82525050565b6137ce8161445c565b82525050565b60006137df8261426d565b6137e98185614283565b93506137f98185602086016144fd565b61380281614740565b840191505092915050565b600061381882614278565b613822818561429f565b93506138328185602086016144fd565b61383b81614740565b840191505092915050565b600061385182614278565b61385b81856142b0565b935061386b8185602086016144fd565b80840191505092915050565b600061388460228361429f565b915061388f82614751565b604082019050919050565b60006138a760268361429f565b91506138b2826147a0565b604082019050919050565b60006138ca602a8361429f565b91506138d5826147ef565b604082019050919050565b60006138ed60238361429f565b91506138f88261483e565b604082019050919050565b600061391060258361429f565b915061391b8261488d565b604082019050919050565b600061393360318361429f565b915061393e826148dc565b604082019050919050565b600061395660208361429f565b91506139618261492b565b602082019050919050565b600061397960398361429f565b915061398482614954565b604082019050919050565b600061399c60188361429f565b91506139a7826149a3565b602082019050919050565b60006139bf602b8361429f565b91506139ca826149cc565b604082019050919050565b60006139e260268361429f565b91506139ed82614a1b565b604082019050919050565b6000613a0560208361429f565b9150613a1082614a6a565b602082019050919050565b6000613a28602f8361429f565b9150613a3382614a93565b604082019050919050565b6000613a4b601a8361429f565b9150613a5682614ae2565b602082019050919050565b6000613a6e60328361429f565b9150613a7982614b0b565b604082019050919050565b6000613a9160158361429f565b9150613a9c82614b5a565b602082019050919050565b6000613ab460228361429f565b9150613abf82614b83565b604082019050919050565b6000613ad7600083614294565b9150613ae282614bd2565b600082019050919050565b6000613afa60108361429f565b9150613b0582614bd5565b602082019050919050565b6000613b1d60088361429f565b9150613b2882614bfe565b602082019050919050565b6000613b4060338361429f565b9150613b4b82614c27565b604082019050919050565b6000613b63601d8361429f565b9150613b6e82614c76565b602082019050919050565b6000613b86601e8361429f565b9150613b9182614c9f565b602082019050919050565b6000613ba960218361429f565b9150613bb482614cc8565b604082019050919050565b6000613bcc600e8361429f565b9150613bd782614d17565b602082019050919050565b6000613bef602e8361429f565b9150613bfa82614d40565b604082019050919050565b6000613c1260268361429f565b9150613c1d82614d8f565b604082019050919050565b6000613c3560138361429f565b9150613c4082614dde565b602082019050919050565b6000613c58601f8361429f565b9150613c6382614e07565b602082019050919050565b6000613c7b602f8361429f565b9150613c8682614e30565b604082019050919050565b6000613c9e602d8361429f565b9150613ca982614e7f565b604082019050919050565b6000613cc160228361429f565b9150613ccc82614ece565b604082019050919050565b604082016000820151613ced60008501826137a7565b506020820151613d006020850182613d15565b50505050565b613d0f816144d0565b82525050565b613d1e816144da565b82525050565b6000613d308285613846565b9150613d3c8284613846565b91508190509392505050565b6000613d5382613aca565b9150819050919050565b6000602082019050613d7260008301846137b6565b92915050565b6000608082019050613d8d60008301876137b6565b613d9a60208301866137b6565b613da76040830185613d06565b8181036060830152613db981846137d4565b905095945050505050565b6000602082019050613dd960008301846137c5565b92915050565b60006020820190508181036000830152613df9818461380d565b905092915050565b60006020820190508181036000830152613e1a81613877565b9050919050565b60006020820190508181036000830152613e3a8161389a565b9050919050565b60006020820190508181036000830152613e5a816138bd565b9050919050565b60006020820190508181036000830152613e7a816138e0565b9050919050565b60006020820190508181036000830152613e9a81613903565b9050919050565b60006020820190508181036000830152613eba81613926565b9050919050565b60006020820190508181036000830152613eda81613949565b9050919050565b60006020820190508181036000830152613efa8161396c565b9050919050565b60006020820190508181036000830152613f1a8161398f565b9050919050565b60006020820190508181036000830152613f3a816139b2565b9050919050565b60006020820190508181036000830152613f5a816139d5565b9050919050565b60006020820190508181036000830152613f7a816139f8565b9050919050565b60006020820190508181036000830152613f9a81613a1b565b9050919050565b60006020820190508181036000830152613fba81613a3e565b9050919050565b60006020820190508181036000830152613fda81613a61565b9050919050565b60006020820190508181036000830152613ffa81613a84565b9050919050565b6000602082019050818103600083015261401a81613aa7565b9050919050565b6000602082019050818103600083015261403a81613aed565b9050919050565b6000602082019050818103600083015261405a81613b10565b9050919050565b6000602082019050818103600083015261407a81613b33565b9050919050565b6000602082019050818103600083015261409a81613b56565b9050919050565b600060208201905081810360008301526140ba81613b79565b9050919050565b600060208201905081810360008301526140da81613b9c565b9050919050565b600060208201905081810360008301526140fa81613bbf565b9050919050565b6000602082019050818103600083015261411a81613be2565b9050919050565b6000602082019050818103600083015261413a81613c05565b9050919050565b6000602082019050818103600083015261415a81613c28565b9050919050565b6000602082019050818103600083015261417a81613c4b565b9050919050565b6000602082019050818103600083015261419a81613c6e565b9050919050565b600060208201905081810360008301526141ba81613c91565b9050919050565b600060208201905081810360008301526141da81613cb4565b9050919050565b60006040820190506141f66000830184613cd7565b92915050565b60006020820190506142116000830184613d06565b92915050565b6000614221614232565b905061422d828261458c565b919050565b6000604051905090565b600067ffffffffffffffff821115614257576142566146f3565b5b61426082614740565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006142c682614494565b91506142d183614494565b9250826fffffffffffffffffffffffffffffffff038211156142f6576142f5614637565b5b828201905092915050565b600061430c826144d0565b9150614317836144d0565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561434c5761434b614637565b5b828201905092915050565b6000614362826144d0565b915061436d836144d0565b92508261437d5761437c614666565b5b828204905092915050565b6000614393826144d0565b915061439e836144d0565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156143d7576143d6614637565b5b828202905092915050565b60006143ed82614494565b91506143f883614494565b92508282101561440b5761440a614637565b5b828203905092915050565b6000614421826144d0565b915061442c836144d0565b92508282101561443f5761443e614637565b5b828203905092915050565b6000614455826144b0565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b82818337600083830152505050565b60005b8381101561451b578082015181840152602081019050614500565b8381111561452a576000848401525b50505050565b600061453b826144d0565b9150600082141561454f5761454e614637565b5b600182039050919050565b6000600282049050600182168061457257607f821691505b6020821081141561458657614585614695565b5b50919050565b61459582614740565b810181811067ffffffffffffffff821117156145b4576145b36146f3565b5b80604052505050565b60006145c8826144d0565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156145fb576145fa614637565b5b600182019050919050565b6000614611826144d0565b915061461c836144d0565b92508261462c5761462b614666565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206e756d626572206d696e74656420717565727920666f7260008201527f20746865207a65726f2061646472657373000000000000000000000000000000602082015250565b7f43616e74206d696e74206d6f7265207468616e2035207065722077616c6c6574600082015250565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b7f7175616e74697479206d757374206265206e6f6e7a65726f0000000000000000600082015250565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f43616e74206d696e74206d6f7265207468616e20350000000000000000000000600082015250565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f536f6c64206f7574000000000000000000000000000000000000000000000000600082015250565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b7f455243373231413a20746f6b656e20616c7265616479206d696e746564000000600082015250565b7f43616e74206d696e74206d6f7265207468616e203130206174206f6e63650000600082015250565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f7420656e6f75676820457468000000000000000000000000000000000000600082015250565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b7f6e6f7420656e6f756768206d696e7465642079657420666f722074686973206360008201527f6c65616e75700000000000000000000000000000000000000000000000000000602082015250565b7f53616c65206861736e2774207374617274656400000000000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b7f455243373231413a207175616e7469747920746f206d696e7420746f6f20686960008201527f6768000000000000000000000000000000000000000000000000000000000000602082015250565b614f268161444a565b8114614f3157600080fd5b50565b614f3d8161445c565b8114614f4857600080fd5b50565b614f5481614468565b8114614f5f57600080fd5b50565b614f6b816144d0565b8114614f7657600080fd5b5056fea26469706673582212209a1cda0702ad2ae7fba2be675b783097c151fc64a3b9cef8e6496e8d6537c14f64736f6c63430008070033

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

000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000001b3900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : maxBatchSize_ (uint256): 10
Arg [1] : collectionSize_ (uint256): 6969
Arg [2] : amountForAuctionAndDev_ (uint256): 0
Arg [3] : amountForDevs_ (uint256): 0

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [1] : 0000000000000000000000000000000000000000000000000000000000001b39
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

42927:2956:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28015:370;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29741:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31266:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30829:379;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26576:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43401:41;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32116:142;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45496:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27207:744;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32321:157;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26739:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45203:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43488:81;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29564:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44004:395;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26304:88;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43677:85;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28441:211;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42030:103;;;;;;;;;;;;;:::i;:::-;;44405:181;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43577:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43321:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41379:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45733:147;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29896:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26398:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44733:293;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31534:274;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43449:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45309:181;;;;;;;;;;;;;:::i;:::-;;32541:311;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30057:394;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36956:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45620:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31871:186;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42288:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28015:370;28142:4;28187:25;28172:40;;;:11;:40;;;;:99;;;;28238:33;28223:48;;;:11;:48;;;;28172:99;:160;;;;28297:35;28282:50;;;:11;:50;;;;28172:160;:207;;;;28343:36;28367:11;28343:23;:36::i;:::-;28172:207;28158:221;;28015:370;;;:::o;29741:94::-;29795:13;29824:5;29817:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29741:94;:::o;31266:204::-;31334:7;31358:16;31366:7;31358;:16::i;:::-;31350:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;31440:15;:24;31456:7;31440:24;;;;;;;;;;;;;;;;;;;;;31433:31;;31266:204;;;:::o;30829:379::-;30898:13;30914:24;30930:7;30914:15;:24::i;:::-;30898:40;;30959:5;30953:11;;:2;:11;;;;30945:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;31044:5;31028:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;31053:37;31070:5;31077:12;:10;:12::i;:::-;31053:16;:37::i;:::-;31028:62;31012:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;31174:28;31183:2;31187:7;31196:5;31174:8;:28::i;:::-;30891:317;30829:379;;:::o;26576:94::-;26629:7;26652:12;;26645:19;;26576:94;:::o;43401:41::-;;;;;;;;;;;;;;;;;:::o;32116:142::-;32224:28;32234:4;32240:2;32244:7;32224:9;:28::i;:::-;32116:142;;;:::o;45496:118::-;41610:12;:10;:12::i;:::-;41599:23;;:7;:5;:7::i;:::-;:23;;;41591:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;22171:1:::1;22769:7;;:19;;22761:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;22171:1;22902:7;:18;;;;45580:28:::2;45599:8;45580:18;:28::i;:::-;22127:1:::1;23081:7;:22;;;;45496:118:::0;:::o;27207:744::-;27316:7;27351:16;27361:5;27351:9;:16::i;:::-;27343:5;:24;27335:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;27413:22;27438:13;:11;:13::i;:::-;27413:38;;27458:19;27488:25;27538:9;27533:350;27557:14;27553:1;:18;27533:350;;;27587:31;27621:11;:14;27633:1;27621:14;;;;;;;;;;;27587:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27674:1;27648:28;;:9;:14;;;:28;;;27644:89;;27709:9;:14;;;27689:34;;27644:89;27766:5;27745:26;;:17;:26;;;27741:135;;;27803:5;27788:11;:20;27784:59;;;27830:1;27823:8;;;;;;;;;27784:59;27853:13;;;;;:::i;:::-;;;;27741:135;27578:305;27573:3;;;;;:::i;:::-;;;;27533:350;;;;27889:56;;;;;;;;;;:::i;:::-;;;;;;;;27207:744;;;;;:::o;32321:157::-;32433:39;32450:4;32456:2;32460:7;32433:39;;;;;;;;;;;;:16;:39::i;:::-;32321:157;;;:::o;26739:177::-;26806:7;26838:13;:11;:13::i;:::-;26830:5;:21;26822:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;26905:5;26898:12;;26739:177;;;:::o;45203:100::-;41610:12;:10;:12::i;:::-;41599:23;;:7;:5;:7::i;:::-;:23;;;41591:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45290:7:::1;;45274:13;:23;;;;;;;:::i;:::-;;45203:100:::0;;:::o;43488:81::-;41610:12;:10;:12::i;:::-;41599:23;;:7;:5;:7::i;:::-;:23;;;41591:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43558:5:::1;43546:9;;:17;;;;;;;;;;;;;;;;;;43488:81:::0;:::o;29564:118::-;29628:7;29651:20;29663:7;29651:11;:20::i;:::-;:25;;;29644:32;;29564:118;;;:::o;44004:395::-;44081:9;;;;;;;;;;;44073:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;44141:1;44129:8;:13;;44121:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;44211:4;44199:8;44183:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:32;;44175:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;44276:1;44264:8;44243:6;:18;44250:10;44243:18;;;;;;;;;;;;;;;;:29;;;;:::i;:::-;:34;;44235:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;44343:8;44321:6;:18;44328:10;44321:18;;;;;;;;;;;;;;;;:30;;;;;;;:::i;:::-;;;;;;;;44362:31;44372:10;44384:8;44362:9;:31::i;:::-;44004:395;:::o;26304:88::-;26378:8;26363:12;:23;;;;26304:88;:::o;43677:85::-;41610:12;:10;:12::i;:::-;41599:23;;:7;:5;:7::i;:::-;:23;;;41591:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43750:6:::1;43738:9;:18;;;;43677:85:::0;:::o;28441:211::-;28505:7;28546:1;28529:19;;:5;:19;;;;28521:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;28618:12;:19;28631:5;28618:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;28610:36;;28603:43;;28441:211;;;:::o;42030:103::-;41610:12;:10;:12::i;:::-;41599:23;;:7;:5;:7::i;:::-;:23;;;41591:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42095:30:::1;42122:1;42095:18;:30::i;:::-;42030:103::o:0;44405:181::-;41610:12;:10;:12::i;:::-;41599:23;;:7;:5;:7::i;:::-;:23;;;41591:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44528:9:::1;;44516:8;44500:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:37;;44492:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;44557:23;44567:2;44571:8;44557:9;:23::i;:::-;44405:181:::0;;:::o;43577:94::-;41610:12;:10;:12::i;:::-;41599:23;;:7;:5;:7::i;:::-;:23;;;41591:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43660:5:::1;43643:14;:22;;;;43577:94:::0;:::o;43321:42::-;;;;:::o;41379:87::-;41425:7;41452:6;;;;;;;;;;;41445:13;;41379:87;:::o;45733:147::-;45814:21;;:::i;:::-;45854:20;45866:7;45854:11;:20::i;:::-;45847:27;;45733:147;;;:::o;29896:98::-;29952:13;29981:7;29974:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29896:98;:::o;26398:110::-;26485:17;26468:14;:34;;;;26398:110;:::o;44733:293::-;44808:2;44796:8;:14;;44788:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;44888:9;;44876:8;44860:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:37;;44852:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;44955:8;44938:14;;:25;;;;:::i;:::-;44925:9;:38;;44917:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;44989:31;44999:10;45011:8;44989:9;:31::i;:::-;44733:293;:::o;31534:274::-;31637:12;:10;:12::i;:::-;31625:24;;:8;:24;;;;31617:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;31734:8;31689:18;:32;31708:12;:10;:12::i;:::-;31689:32;;;;;;;;;;;;;;;:42;31722:8;31689:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;31783:8;31754:48;;31769:12;:10;:12::i;:::-;31754:48;;;31793:8;31754:48;;;;;;:::i;:::-;;;;;;;;31534:274;;:::o;43449:29::-;;;;;;;;;;;;;:::o;45309:181::-;41610:12;:10;:12::i;:::-;41599:23;;:7;:5;:7::i;:::-;:23;;;41591:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;22171:1:::1;22769:7;;:19;;22761:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;22171:1;22902:7;:18;;;;45374:12:::2;45392:10;:15;;45415:21;45392:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45373:68;;;45456:7;45448:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;45366:124;22127:1:::1;23081:7;:22;;;;45309:181::o:0;32541:311::-;32678:28;32688:4;32694:2;32698:7;32678:9;:28::i;:::-;32729:48;32752:4;32758:2;32762:7;32771:5;32729:22;:48::i;:::-;32713:133;;;;;;;;;;;;:::i;:::-;;;;;;;;;32541:311;;;;:::o;30057:394::-;30155:13;30196:16;30204:7;30196;:16::i;:::-;30180:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;30286:21;30310:10;:8;:10::i;:::-;30286:34;;30365:1;30347:7;30341:21;:25;:104;;;;;;;;;;;;;;;;;30402:7;30411:18;:7;:16;:18::i;:::-;30385:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;30341:104;30327:118;;;30057:394;;;:::o;36956:43::-;;;;:::o;45620:107::-;45678:7;45701:20;45715:5;45701:13;:20::i;:::-;45694:27;;45620:107;;;:::o;31871:186::-;31993:4;32016:18;:25;32035:5;32016:25;;;;;;;;;;;;;;;:35;32042:8;32016:35;;;;;;;;;;;;;;;;;;;;;;;;;32009:42;;31871:186;;;;:::o;42288:201::-;41610:12;:10;:12::i;:::-;41599:23;;:7;:5;:7::i;:::-;:23;;;41591:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42397:1:::1;42377:22;;:8;:22;;;;42369:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;42453:28;42472:8;42453:18;:28::i;:::-;42288:201:::0;:::o;13440:157::-;13525:4;13564:25;13549:40;;;:11;:40;;;;13542:47;;13440:157;;;:::o;33091:105::-;33148:4;33178:12;;33168:7;:22;33161:29;;33091:105;;;:::o;23797:98::-;23850:7;23877:10;23870:17;;23797:98;:::o;36778:172::-;36902:2;36875:15;:24;36891:7;36875:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;36936:7;36932:2;36916:28;;36925:5;36916:28;;;;;;;;;;;;36778:172;;;:::o;35143:1529::-;35240:35;35278:20;35290:7;35278:11;:20::i;:::-;35240:58;;35307:22;35349:13;:18;;;35333:34;;:12;:10;:12::i;:::-;:34;;;:81;;;;35402:12;:10;:12::i;:::-;35378:36;;:20;35390:7;35378:11;:20::i;:::-;:36;;;35333:81;:142;;;;35425:50;35442:13;:18;;;35462:12;:10;:12::i;:::-;35425:16;:50::i;:::-;35333:142;35307:169;;35501:17;35485:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;35633:4;35611:26;;:13;:18;;;:26;;;35595:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;35722:1;35708:16;;:2;:16;;;;35700:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;35775:43;35797:4;35803:2;35807:7;35816:1;35775:21;:43::i;:::-;35875:49;35892:1;35896:7;35905:13;:18;;;35875:8;:49::i;:::-;35963:1;35933:12;:18;35946:4;35933:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;35999:1;35971:12;:16;35984:2;35971:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;36030:43;;;;;;;;36045:2;36030:43;;;;;;36056:15;36030:43;;;;;36007:11;:20;36019:7;36007:20;;;;;;;;;;;:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36301:19;36333:1;36323:7;:11;;;;:::i;:::-;36301:33;;36386:1;36345:43;;:11;:24;36357:11;36345:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;36341:236;;;36403:20;36411:11;36403:7;:20::i;:::-;36399:171;;;36463:97;;;;;;;;36490:13;:18;;;36463:97;;;;;;36521:13;:28;;;36463:97;;;;;36436:11;:24;36448:11;36436:24;;;;;;;;;;;:124;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36399:171;36341:236;36609:7;36605:2;36590:27;;36599:4;36590:27;;;;;;;;;;;;36624:42;36645:4;36651:2;36655:7;36664:1;36624:20;:42::i;:::-;35233:1439;;;35143:1529;;;:::o;37104:846::-;37166:25;37194:24;;37166:52;;37244:1;37233:8;:12;37225:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;37281:16;37331:1;37320:8;37300:17;:28;;;;:::i;:::-;:32;;;;:::i;:::-;37281:51;;37371:1;37354:14;;:18;;;;:::i;:::-;37343:8;:29;37339:81;;;37411:1;37394:14;;:18;;;;:::i;:::-;37383:29;;37339:81;37535:17;37543:8;37535:7;:17::i;:::-;37527:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;37607:9;37619:17;37607:29;;37602:297;37643:8;37638:1;:13;37602:297;;37702:1;37671:33;;:11;:14;37683:1;37671:14;;;;;;;;;;;:19;;;;;;;;;;;;:33;;;37667:225;;;37717:31;37751:14;37763:1;37751:11;:14::i;:::-;37717:48;;37793:89;;;;;;;;37820:9;:14;;;37793:89;;;;;;37847:9;:24;;;37793:89;;;;;37776:11;:14;37788:1;37776:14;;;;;;;;;;;:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37706:186;37667:225;37653:3;;;;;:::i;:::-;;;;37602:297;;;;37943:1;37932:8;:12;;;;:::i;:::-;37905:24;:39;;;;37159:791;;37104:846;:::o;28904:606::-;28980:21;;:::i;:::-;29021:16;29029:7;29021;:16::i;:::-;29013:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;29093:26;29141:12;;29130:7;:23;29126:93;;29210:1;29195:12;;29185:7;:22;;;;:::i;:::-;:26;;;;:::i;:::-;29164:47;;29126:93;29232:12;29247:7;29232:22;;29227:212;29264:18;29256:4;:26;29227:212;;29301:31;29335:11;:17;29347:4;29335:17;;;;;;;;;;;29301:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29391:1;29365:28;;:9;:14;;;:28;;;29361:71;;29413:9;29406:16;;;;;;;29361:71;29292:147;29284:6;;;;;:::i;:::-;;;;29227:212;;;;29447:57;;;;;;;;;;:::i;:::-;;;;;;;;28904:606;;;;:::o;33202:98::-;33267:27;33277:2;33281:8;33267:27;;;;;;;;;;;;:9;:27::i;:::-;33202:98;;:::o;42649:191::-;42723:16;42742:6;;;;;;;;;;;42723:25;;42768:8;42759:6;;:17;;;;;;;;;;;;;;;;;;42823:8;42792:40;;42813:8;42792:40;;;;;;;;;;;;42712:128;42649:191;:::o;38493:690::-;38630:4;38647:15;:2;:13;;;:15::i;:::-;38643:535;;;38702:2;38686:36;;;38723:12;:10;:12::i;:::-;38737:4;38743:7;38752:5;38686:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;38673:464;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38934:1;38917:6;:13;:18;38913:215;;;38950:61;;;;;;;;;;:::i;:::-;;;;;;;;38913:215;39096:6;39090:13;39081:6;39077:2;39073:15;39066:38;38673:464;38818:45;;;38808:55;;;:6;:55;;;;38801:62;;;;;38643:535;39166:4;39159:11;;38493:690;;;;;;;:::o;45089:108::-;45149:13;45178;45171:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45089:108;:::o;365:723::-;421:13;651:1;642:5;:10;638:53;;;669:10;;;;;;;;;;;;;;;;;;;;;638:53;701:12;716:5;701:20;;732:14;757:78;772:1;764:4;:9;757:78;;790:8;;;;;:::i;:::-;;;;821:2;813:10;;;;;:::i;:::-;;;757:78;;;845:19;877:6;867:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;845:39;;895:154;911:1;902:5;:10;895:154;;939:1;929:11;;;;;:::i;:::-;;;1006:2;998:5;:10;;;;:::i;:::-;985:2;:24;;;;:::i;:::-;972:39;;955:6;962;955:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1035:2;1026:11;;;;;:::i;:::-;;;895:154;;;1073:6;1059:21;;;;;365:723;;;;:::o;28658:240::-;28719:7;28768:1;28751:19;;:5;:19;;;;28735:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;28859:12;:19;28872:5;28859:19;;;;;;;;;;;;;;;:32;;;;;;;;;;;;28851:41;;28844:48;;28658:240;;;:::o;39645:141::-;;;;;:::o;40172:140::-;;;;;:::o;33639:1272::-;33744:20;33767:12;;33744:35;;33808:1;33794:16;;:2;:16;;;;33786:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;33985:21;33993:12;33985:7;:21::i;:::-;33984:22;33976:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;34067:12;;34055:8;:24;;34047:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;34127:61;34157:1;34161:2;34165:12;34179:8;34127:21;:61::i;:::-;34197:30;34230:12;:16;34243:2;34230:16;;;;;;;;;;;;;;;34197:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34272:119;;;;;;;;34322:8;34292:11;:19;;;:39;;;;:::i;:::-;34272:119;;;;;;34375:8;34340:11;:24;;;:44;;;;:::i;:::-;34272:119;;;;;34253:12;:16;34266:2;34253:16;;;;;;;;;;;;;;;:138;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34426:43;;;;;;;;34441:2;34426:43;;;;;;34452:15;34426:43;;;;;34398:11;:25;34410:12;34398:25;;;;;;;;;;;:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34478:20;34501:12;34478:35;;34527:9;34522:281;34546:8;34542:1;:12;34522:281;;;34600:12;34596:2;34575:38;;34592:1;34575:38;;;;;;;;;;;;34640:59;34671:1;34675:2;34679:12;34693:5;34640:22;:59::i;:::-;34622:150;;;;;;;;;;;;:::i;:::-;;;;;;;;;34781:14;;;;;:::i;:::-;;;;34556:3;;;;;:::i;:::-;;;;34522:281;;;;34826:12;34811;:27;;;;34845:60;34874:1;34878:2;34882:12;34896:8;34845:20;:60::i;:::-;33737:1174;;;33639:1272;;;:::o;3357:326::-;3417:4;3674:1;3652:7;:19;;;:23;3645:30;;3357:326;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:139::-;469:5;507:6;494:20;485:29;;523:33;550:5;523:33;:::i;:::-;423:139;;;;:::o;568:133::-;611:5;649:6;636:20;627:29;;665:30;689:5;665:30;:::i;:::-;568:133;;;;:::o;707:137::-;752:5;790:6;777:20;768:29;;806:32;832:5;806:32;:::i;:::-;707:137;;;;:::o;850:141::-;906:5;937:6;931:13;922:22;;953:32;979:5;953:32;:::i;:::-;850:141;;;;:::o;1010:338::-;1065:5;1114:3;1107:4;1099:6;1095:17;1091:27;1081:122;;1122:79;;:::i;:::-;1081:122;1239:6;1226:20;1264:78;1338:3;1330:6;1323:4;1315:6;1311:17;1264:78;:::i;:::-;1255:87;;1071:277;1010:338;;;;:::o;1368:553::-;1426:8;1436:6;1486:3;1479:4;1471:6;1467:17;1463:27;1453:122;;1494:79;;:::i;:::-;1453:122;1607:6;1594:20;1584:30;;1637:18;1629:6;1626:30;1623:117;;;1659:79;;:::i;:::-;1623:117;1773:4;1765:6;1761:17;1749:29;;1827:3;1819:4;1811:6;1807:17;1797:8;1793:32;1790:41;1787:128;;;1834:79;;:::i;:::-;1787:128;1368:553;;;;;:::o;1927:139::-;1973:5;2011:6;1998:20;1989:29;;2027:33;2054:5;2027:33;:::i;:::-;1927:139;;;;:::o;2072:329::-;2131:6;2180:2;2168:9;2159:7;2155:23;2151:32;2148:119;;;2186:79;;:::i;:::-;2148:119;2306:1;2331:53;2376:7;2367:6;2356:9;2352:22;2331:53;:::i;:::-;2321:63;;2277:117;2072:329;;;;:::o;2407:474::-;2475:6;2483;2532:2;2520:9;2511:7;2507:23;2503:32;2500:119;;;2538:79;;:::i;:::-;2500:119;2658:1;2683:53;2728:7;2719:6;2708:9;2704:22;2683:53;:::i;:::-;2673:63;;2629:117;2785:2;2811:53;2856:7;2847:6;2836:9;2832:22;2811:53;:::i;:::-;2801:63;;2756:118;2407:474;;;;;:::o;2887:619::-;2964:6;2972;2980;3029:2;3017:9;3008:7;3004:23;3000:32;2997:119;;;3035:79;;:::i;:::-;2997:119;3155:1;3180:53;3225:7;3216:6;3205:9;3201:22;3180:53;:::i;:::-;3170:63;;3126:117;3282:2;3308:53;3353:7;3344:6;3333:9;3329:22;3308:53;:::i;:::-;3298:63;;3253:118;3410:2;3436:53;3481:7;3472:6;3461:9;3457:22;3436:53;:::i;:::-;3426:63;;3381:118;2887:619;;;;;:::o;3512:943::-;3607:6;3615;3623;3631;3680:3;3668:9;3659:7;3655:23;3651:33;3648:120;;;3687:79;;:::i;:::-;3648:120;3807:1;3832:53;3877:7;3868:6;3857:9;3853:22;3832:53;:::i;:::-;3822:63;;3778:117;3934:2;3960:53;4005:7;3996:6;3985:9;3981:22;3960:53;:::i;:::-;3950:63;;3905:118;4062:2;4088:53;4133:7;4124:6;4113:9;4109:22;4088:53;:::i;:::-;4078:63;;4033:118;4218:2;4207:9;4203:18;4190:32;4249:18;4241:6;4238:30;4235:117;;;4271:79;;:::i;:::-;4235:117;4376:62;4430:7;4421:6;4410:9;4406:22;4376:62;:::i;:::-;4366:72;;4161:287;3512:943;;;;;;;:::o;4461:468::-;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:50;4904:7;4895:6;4884:9;4880:22;4862:50;:::i;:::-;4852:60;;4807:115;4461:468;;;;;:::o;4935:474::-;5003:6;5011;5060:2;5048:9;5039:7;5035:23;5031:32;5028:119;;;5066:79;;:::i;:::-;5028:119;5186:1;5211:53;5256:7;5247:6;5236:9;5232:22;5211:53;:::i;:::-;5201:63;;5157:117;5313:2;5339:53;5384:7;5375:6;5364:9;5360:22;5339:53;:::i;:::-;5329:63;;5284:118;4935:474;;;;;:::o;5415:323::-;5471:6;5520:2;5508:9;5499:7;5495:23;5491:32;5488:119;;;5526:79;;:::i;:::-;5488:119;5646:1;5671:50;5713:7;5704:6;5693:9;5689:22;5671:50;:::i;:::-;5661:60;;5617:114;5415:323;;;;:::o;5744:327::-;5802:6;5851:2;5839:9;5830:7;5826:23;5822:32;5819:119;;;5857:79;;:::i;:::-;5819:119;5977:1;6002:52;6046:7;6037:6;6026:9;6022:22;6002:52;:::i;:::-;5992:62;;5948:116;5744:327;;;;:::o;6077:349::-;6146:6;6195:2;6183:9;6174:7;6170:23;6166:32;6163:119;;;6201:79;;:::i;:::-;6163:119;6321:1;6346:63;6401:7;6392:6;6381:9;6377:22;6346:63;:::i;:::-;6336:73;;6292:127;6077:349;;;;:::o;6432:529::-;6503:6;6511;6560:2;6548:9;6539:7;6535:23;6531:32;6528:119;;;6566:79;;:::i;:::-;6528:119;6714:1;6703:9;6699:17;6686:31;6744:18;6736:6;6733:30;6730:117;;;6766:79;;:::i;:::-;6730:117;6879:65;6936:7;6927:6;6916:9;6912:22;6879:65;:::i;:::-;6861:83;;;;6657:297;6432:529;;;;;:::o;6967:329::-;7026:6;7075:2;7063:9;7054:7;7050:23;7046:32;7043:119;;;7081:79;;:::i;:::-;7043:119;7201:1;7226:53;7271:7;7262:6;7251:9;7247:22;7226:53;:::i;:::-;7216:63;;7172:117;6967:329;;;;:::o;7302:108::-;7379:24;7397:5;7379:24;:::i;:::-;7374:3;7367:37;7302:108;;:::o;7416:118::-;7503:24;7521:5;7503:24;:::i;:::-;7498:3;7491:37;7416:118;;:::o;7540:109::-;7621:21;7636:5;7621:21;:::i;:::-;7616:3;7609:34;7540:109;;:::o;7655:360::-;7741:3;7769:38;7801:5;7769:38;:::i;:::-;7823:70;7886:6;7881:3;7823:70;:::i;:::-;7816:77;;7902:52;7947:6;7942:3;7935:4;7928:5;7924:16;7902:52;:::i;:::-;7979:29;8001:6;7979:29;:::i;:::-;7974:3;7970:39;7963:46;;7745:270;7655:360;;;;:::o;8021:364::-;8109:3;8137:39;8170:5;8137:39;:::i;:::-;8192:71;8256:6;8251:3;8192:71;:::i;:::-;8185:78;;8272:52;8317:6;8312:3;8305:4;8298:5;8294:16;8272:52;:::i;:::-;8349:29;8371:6;8349:29;:::i;:::-;8344:3;8340:39;8333:46;;8113:272;8021:364;;;;:::o;8391:377::-;8497:3;8525:39;8558:5;8525:39;:::i;:::-;8580:89;8662:6;8657:3;8580:89;:::i;:::-;8573:96;;8678:52;8723:6;8718:3;8711:4;8704:5;8700:16;8678:52;:::i;:::-;8755:6;8750:3;8746:16;8739:23;;8501:267;8391:377;;;;:::o;8774:366::-;8916:3;8937:67;9001:2;8996:3;8937:67;:::i;:::-;8930:74;;9013:93;9102:3;9013:93;:::i;:::-;9131:2;9126:3;9122:12;9115:19;;8774:366;;;:::o;9146:::-;9288:3;9309:67;9373:2;9368:3;9309:67;:::i;:::-;9302:74;;9385:93;9474:3;9385:93;:::i;:::-;9503:2;9498:3;9494:12;9487:19;;9146:366;;;:::o;9518:::-;9660:3;9681:67;9745:2;9740:3;9681:67;:::i;:::-;9674:74;;9757:93;9846:3;9757:93;:::i;:::-;9875:2;9870:3;9866:12;9859:19;;9518:366;;;:::o;9890:::-;10032:3;10053:67;10117:2;10112:3;10053:67;:::i;:::-;10046:74;;10129:93;10218:3;10129:93;:::i;:::-;10247:2;10242:3;10238:12;10231:19;;9890:366;;;:::o;10262:::-;10404:3;10425:67;10489:2;10484:3;10425:67;:::i;:::-;10418:74;;10501:93;10590:3;10501:93;:::i;:::-;10619:2;10614:3;10610:12;10603:19;;10262:366;;;:::o;10634:::-;10776:3;10797:67;10861:2;10856:3;10797:67;:::i;:::-;10790:74;;10873:93;10962:3;10873:93;:::i;:::-;10991:2;10986:3;10982:12;10975:19;;10634:366;;;:::o;11006:::-;11148:3;11169:67;11233:2;11228:3;11169:67;:::i;:::-;11162:74;;11245:93;11334:3;11245:93;:::i;:::-;11363:2;11358:3;11354:12;11347:19;;11006:366;;;:::o;11378:::-;11520:3;11541:67;11605:2;11600:3;11541:67;:::i;:::-;11534:74;;11617:93;11706:3;11617:93;:::i;:::-;11735:2;11730:3;11726:12;11719:19;;11378:366;;;:::o;11750:::-;11892:3;11913:67;11977:2;11972:3;11913:67;:::i;:::-;11906:74;;11989:93;12078:3;11989:93;:::i;:::-;12107:2;12102:3;12098:12;12091:19;;11750:366;;;:::o;12122:::-;12264:3;12285:67;12349:2;12344:3;12285:67;:::i;:::-;12278:74;;12361:93;12450:3;12361:93;:::i;:::-;12479:2;12474:3;12470:12;12463:19;;12122:366;;;:::o;12494:::-;12636:3;12657:67;12721:2;12716:3;12657:67;:::i;:::-;12650:74;;12733:93;12822:3;12733:93;:::i;:::-;12851:2;12846:3;12842:12;12835:19;;12494:366;;;:::o;12866:::-;13008:3;13029:67;13093:2;13088:3;13029:67;:::i;:::-;13022:74;;13105:93;13194:3;13105:93;:::i;:::-;13223:2;13218:3;13214:12;13207:19;;12866:366;;;:::o;13238:::-;13380:3;13401:67;13465:2;13460:3;13401:67;:::i;:::-;13394:74;;13477:93;13566:3;13477:93;:::i;:::-;13595:2;13590:3;13586:12;13579:19;;13238:366;;;:::o;13610:::-;13752:3;13773:67;13837:2;13832:3;13773:67;:::i;:::-;13766:74;;13849:93;13938:3;13849:93;:::i;:::-;13967:2;13962:3;13958:12;13951:19;;13610:366;;;:::o;13982:::-;14124:3;14145:67;14209:2;14204:3;14145:67;:::i;:::-;14138:74;;14221:93;14310:3;14221:93;:::i;:::-;14339:2;14334:3;14330:12;14323:19;;13982:366;;;:::o;14354:::-;14496:3;14517:67;14581:2;14576:3;14517:67;:::i;:::-;14510:74;;14593:93;14682:3;14593:93;:::i;:::-;14711:2;14706:3;14702:12;14695:19;;14354:366;;;:::o;14726:::-;14868:3;14889:67;14953:2;14948:3;14889:67;:::i;:::-;14882:74;;14965:93;15054:3;14965:93;:::i;:::-;15083:2;15078:3;15074:12;15067:19;;14726:366;;;:::o;15098:398::-;15257:3;15278:83;15359:1;15354:3;15278:83;:::i;:::-;15271:90;;15370:93;15459:3;15370:93;:::i;:::-;15488:1;15483:3;15479:11;15472:18;;15098:398;;;:::o;15502:366::-;15644:3;15665:67;15729:2;15724:3;15665:67;:::i;:::-;15658:74;;15741:93;15830:3;15741:93;:::i;:::-;15859:2;15854:3;15850:12;15843:19;;15502:366;;;:::o;15874:365::-;16016:3;16037:66;16101:1;16096:3;16037:66;:::i;:::-;16030:73;;16112:93;16201:3;16112:93;:::i;:::-;16230:2;16225:3;16221:12;16214:19;;15874:365;;;:::o;16245:366::-;16387:3;16408:67;16472:2;16467:3;16408:67;:::i;:::-;16401:74;;16484:93;16573:3;16484:93;:::i;:::-;16602:2;16597:3;16593:12;16586:19;;16245:366;;;:::o;16617:::-;16759:3;16780:67;16844:2;16839:3;16780:67;:::i;:::-;16773:74;;16856:93;16945:3;16856:93;:::i;:::-;16974:2;16969:3;16965:12;16958:19;;16617:366;;;:::o;16989:::-;17131:3;17152:67;17216:2;17211:3;17152:67;:::i;:::-;17145:74;;17228:93;17317:3;17228:93;:::i;:::-;17346:2;17341:3;17337:12;17330:19;;16989:366;;;:::o;17361:::-;17503:3;17524:67;17588:2;17583:3;17524:67;:::i;:::-;17517:74;;17600:93;17689:3;17600:93;:::i;:::-;17718:2;17713:3;17709:12;17702:19;;17361:366;;;:::o;17733:::-;17875:3;17896:67;17960:2;17955:3;17896:67;:::i;:::-;17889:74;;17972:93;18061:3;17972:93;:::i;:::-;18090:2;18085:3;18081:12;18074:19;;17733:366;;;:::o;18105:::-;18247:3;18268:67;18332:2;18327:3;18268:67;:::i;:::-;18261:74;;18344:93;18433:3;18344:93;:::i;:::-;18462:2;18457:3;18453:12;18446:19;;18105:366;;;:::o;18477:::-;18619:3;18640:67;18704:2;18699:3;18640:67;:::i;:::-;18633:74;;18716:93;18805:3;18716:93;:::i;:::-;18834:2;18829:3;18825:12;18818:19;;18477:366;;;:::o;18849:::-;18991:3;19012:67;19076:2;19071:3;19012:67;:::i;:::-;19005:74;;19088:93;19177:3;19088:93;:::i;:::-;19206:2;19201:3;19197:12;19190:19;;18849:366;;;:::o;19221:::-;19363:3;19384:67;19448:2;19443:3;19384:67;:::i;:::-;19377:74;;19460:93;19549:3;19460:93;:::i;:::-;19578:2;19573:3;19569:12;19562:19;;19221:366;;;:::o;19593:::-;19735:3;19756:67;19820:2;19815:3;19756:67;:::i;:::-;19749:74;;19832:93;19921:3;19832:93;:::i;:::-;19950:2;19945:3;19941:12;19934:19;;19593:366;;;:::o;19965:::-;20107:3;20128:67;20192:2;20187:3;20128:67;:::i;:::-;20121:74;;20204:93;20293:3;20204:93;:::i;:::-;20322:2;20317:3;20313:12;20306:19;;19965:366;;;:::o;20337:::-;20479:3;20500:67;20564:2;20559:3;20500:67;:::i;:::-;20493:74;;20576:93;20665:3;20576:93;:::i;:::-;20694:2;20689:3;20685:12;20678:19;;20337:366;;;:::o;20779:527::-;20938:4;20933:3;20929:14;21025:4;21018:5;21014:16;21008:23;21044:63;21101:4;21096:3;21092:14;21078:12;21044:63;:::i;:::-;20953:164;21209:4;21202:5;21198:16;21192:23;21228:61;21283:4;21278:3;21274:14;21260:12;21228:61;:::i;:::-;21127:172;20907:399;20779:527;;:::o;21312:118::-;21399:24;21417:5;21399:24;:::i;:::-;21394:3;21387:37;21312:118;;:::o;21436:105::-;21511:23;21528:5;21511:23;:::i;:::-;21506:3;21499:36;21436:105;;:::o;21547:435::-;21727:3;21749:95;21840:3;21831:6;21749:95;:::i;:::-;21742:102;;21861:95;21952:3;21943:6;21861:95;:::i;:::-;21854:102;;21973:3;21966:10;;21547:435;;;;;:::o;21988:379::-;22172:3;22194:147;22337:3;22194:147;:::i;:::-;22187:154;;22358:3;22351:10;;21988:379;;;:::o;22373:222::-;22466:4;22504:2;22493:9;22489:18;22481:26;;22517:71;22585:1;22574:9;22570:17;22561:6;22517:71;:::i;:::-;22373:222;;;;:::o;22601:640::-;22796:4;22834:3;22823:9;22819:19;22811:27;;22848:71;22916:1;22905:9;22901:17;22892:6;22848:71;:::i;:::-;22929:72;22997:2;22986:9;22982:18;22973:6;22929:72;:::i;:::-;23011;23079:2;23068:9;23064:18;23055:6;23011:72;:::i;:::-;23130:9;23124:4;23120:20;23115:2;23104:9;23100:18;23093:48;23158:76;23229:4;23220:6;23158:76;:::i;:::-;23150:84;;22601:640;;;;;;;:::o;23247:210::-;23334:4;23372:2;23361:9;23357:18;23349:26;;23385:65;23447:1;23436:9;23432:17;23423:6;23385:65;:::i;:::-;23247:210;;;;:::o;23463:313::-;23576:4;23614:2;23603:9;23599:18;23591:26;;23663:9;23657:4;23653:20;23649:1;23638:9;23634:17;23627:47;23691:78;23764:4;23755:6;23691:78;:::i;:::-;23683:86;;23463:313;;;;:::o;23782:419::-;23948:4;23986:2;23975:9;23971:18;23963:26;;24035:9;24029:4;24025:20;24021:1;24010:9;24006:17;23999:47;24063:131;24189:4;24063:131;:::i;:::-;24055:139;;23782:419;;;:::o;24207:::-;24373:4;24411:2;24400:9;24396:18;24388:26;;24460:9;24454:4;24450:20;24446:1;24435:9;24431:17;24424:47;24488:131;24614:4;24488:131;:::i;:::-;24480:139;;24207:419;;;:::o;24632:::-;24798:4;24836:2;24825:9;24821:18;24813:26;;24885:9;24879:4;24875:20;24871:1;24860:9;24856:17;24849:47;24913:131;25039:4;24913:131;:::i;:::-;24905:139;;24632:419;;;:::o;25057:::-;25223:4;25261:2;25250:9;25246:18;25238:26;;25310:9;25304:4;25300:20;25296:1;25285:9;25281:17;25274:47;25338:131;25464:4;25338:131;:::i;:::-;25330:139;;25057:419;;;:::o;25482:::-;25648:4;25686:2;25675:9;25671:18;25663:26;;25735:9;25729:4;25725:20;25721:1;25710:9;25706:17;25699:47;25763:131;25889:4;25763:131;:::i;:::-;25755:139;;25482:419;;;:::o;25907:::-;26073:4;26111:2;26100:9;26096:18;26088:26;;26160:9;26154:4;26150:20;26146:1;26135:9;26131:17;26124:47;26188:131;26314:4;26188:131;:::i;:::-;26180:139;;25907:419;;;:::o;26332:::-;26498:4;26536:2;26525:9;26521:18;26513:26;;26585:9;26579:4;26575:20;26571:1;26560:9;26556:17;26549:47;26613:131;26739:4;26613:131;:::i;:::-;26605:139;;26332:419;;;:::o;26757:::-;26923:4;26961:2;26950:9;26946:18;26938:26;;27010:9;27004:4;27000:20;26996:1;26985:9;26981:17;26974:47;27038:131;27164:4;27038:131;:::i;:::-;27030:139;;26757:419;;;:::o;27182:::-;27348:4;27386:2;27375:9;27371:18;27363:26;;27435:9;27429:4;27425:20;27421:1;27410:9;27406:17;27399:47;27463:131;27589:4;27463:131;:::i;:::-;27455:139;;27182:419;;;:::o;27607:::-;27773:4;27811:2;27800:9;27796:18;27788:26;;27860:9;27854:4;27850:20;27846:1;27835:9;27831:17;27824:47;27888:131;28014:4;27888:131;:::i;:::-;27880:139;;27607:419;;;:::o;28032:::-;28198:4;28236:2;28225:9;28221:18;28213:26;;28285:9;28279:4;28275:20;28271:1;28260:9;28256:17;28249:47;28313:131;28439:4;28313:131;:::i;:::-;28305:139;;28032:419;;;:::o;28457:::-;28623:4;28661:2;28650:9;28646:18;28638:26;;28710:9;28704:4;28700:20;28696:1;28685:9;28681:17;28674:47;28738:131;28864:4;28738:131;:::i;:::-;28730:139;;28457:419;;;:::o;28882:::-;29048:4;29086:2;29075:9;29071:18;29063:26;;29135:9;29129:4;29125:20;29121:1;29110:9;29106:17;29099:47;29163:131;29289:4;29163:131;:::i;:::-;29155:139;;28882:419;;;:::o;29307:::-;29473:4;29511:2;29500:9;29496:18;29488:26;;29560:9;29554:4;29550:20;29546:1;29535:9;29531:17;29524:47;29588:131;29714:4;29588:131;:::i;:::-;29580:139;;29307:419;;;:::o;29732:::-;29898:4;29936:2;29925:9;29921:18;29913:26;;29985:9;29979:4;29975:20;29971:1;29960:9;29956:17;29949:47;30013:131;30139:4;30013:131;:::i;:::-;30005:139;;29732:419;;;:::o;30157:::-;30323:4;30361:2;30350:9;30346:18;30338:26;;30410:9;30404:4;30400:20;30396:1;30385:9;30381:17;30374:47;30438:131;30564:4;30438:131;:::i;:::-;30430:139;;30157:419;;;:::o;30582:::-;30748:4;30786:2;30775:9;30771:18;30763:26;;30835:9;30829:4;30825:20;30821:1;30810:9;30806:17;30799:47;30863:131;30989:4;30863:131;:::i;:::-;30855:139;;30582:419;;;:::o;31007:::-;31173:4;31211:2;31200:9;31196:18;31188:26;;31260:9;31254:4;31250:20;31246:1;31235:9;31231:17;31224:47;31288:131;31414:4;31288:131;:::i;:::-;31280:139;;31007:419;;;:::o;31432:::-;31598:4;31636:2;31625:9;31621:18;31613:26;;31685:9;31679:4;31675:20;31671:1;31660:9;31656:17;31649:47;31713:131;31839:4;31713:131;:::i;:::-;31705:139;;31432:419;;;:::o;31857:::-;32023:4;32061:2;32050:9;32046:18;32038:26;;32110:9;32104:4;32100:20;32096:1;32085:9;32081:17;32074:47;32138:131;32264:4;32138:131;:::i;:::-;32130:139;;31857:419;;;:::o;32282:::-;32448:4;32486:2;32475:9;32471:18;32463:26;;32535:9;32529:4;32525:20;32521:1;32510:9;32506:17;32499:47;32563:131;32689:4;32563:131;:::i;:::-;32555:139;;32282:419;;;:::o;32707:::-;32873:4;32911:2;32900:9;32896:18;32888:26;;32960:9;32954:4;32950:20;32946:1;32935:9;32931:17;32924:47;32988:131;33114:4;32988:131;:::i;:::-;32980:139;;32707:419;;;:::o;33132:::-;33298:4;33336:2;33325:9;33321:18;33313:26;;33385:9;33379:4;33375:20;33371:1;33360:9;33356:17;33349:47;33413:131;33539:4;33413:131;:::i;:::-;33405:139;;33132:419;;;:::o;33557:::-;33723:4;33761:2;33750:9;33746:18;33738:26;;33810:9;33804:4;33800:20;33796:1;33785:9;33781:17;33774:47;33838:131;33964:4;33838:131;:::i;:::-;33830:139;;33557:419;;;:::o;33982:::-;34148:4;34186:2;34175:9;34171:18;34163:26;;34235:9;34229:4;34225:20;34221:1;34210:9;34206:17;34199:47;34263:131;34389:4;34263:131;:::i;:::-;34255:139;;33982:419;;;:::o;34407:::-;34573:4;34611:2;34600:9;34596:18;34588:26;;34660:9;34654:4;34650:20;34646:1;34635:9;34631:17;34624:47;34688:131;34814:4;34688:131;:::i;:::-;34680:139;;34407:419;;;:::o;34832:::-;34998:4;35036:2;35025:9;35021:18;35013:26;;35085:9;35079:4;35075:20;35071:1;35060:9;35056:17;35049:47;35113:131;35239:4;35113:131;:::i;:::-;35105:139;;34832:419;;;:::o;35257:::-;35423:4;35461:2;35450:9;35446:18;35438:26;;35510:9;35504:4;35500:20;35496:1;35485:9;35481:17;35474:47;35538:131;35664:4;35538:131;:::i;:::-;35530:139;;35257:419;;;:::o;35682:::-;35848:4;35886:2;35875:9;35871:18;35863:26;;35935:9;35929:4;35925:20;35921:1;35910:9;35906:17;35899:47;35963:131;36089:4;35963:131;:::i;:::-;35955:139;;35682:419;;;:::o;36107:::-;36273:4;36311:2;36300:9;36296:18;36288:26;;36360:9;36354:4;36350:20;36346:1;36335:9;36331:17;36324:47;36388:131;36514:4;36388:131;:::i;:::-;36380:139;;36107:419;;;:::o;36532:::-;36698:4;36736:2;36725:9;36721:18;36713:26;;36785:9;36779:4;36775:20;36771:1;36760:9;36756:17;36749:47;36813:131;36939:4;36813:131;:::i;:::-;36805:139;;36532:419;;;:::o;36957:346::-;37112:4;37150:2;37139:9;37135:18;37127:26;;37163:133;37293:1;37282:9;37278:17;37269:6;37163:133;:::i;:::-;36957:346;;;;:::o;37309:222::-;37402:4;37440:2;37429:9;37425:18;37417:26;;37453:71;37521:1;37510:9;37506:17;37497:6;37453:71;:::i;:::-;37309:222;;;;:::o;37537:129::-;37571:6;37598:20;;:::i;:::-;37588:30;;37627:33;37655:4;37647:6;37627:33;:::i;:::-;37537:129;;;:::o;37672:75::-;37705:6;37738:2;37732:9;37722:19;;37672:75;:::o;37753:307::-;37814:4;37904:18;37896:6;37893:30;37890:56;;;37926:18;;:::i;:::-;37890:56;37964:29;37986:6;37964:29;:::i;:::-;37956:37;;38048:4;38042;38038:15;38030:23;;37753:307;;;:::o;38066:98::-;38117:6;38151:5;38145:12;38135:22;;38066:98;;;:::o;38170:99::-;38222:6;38256:5;38250:12;38240:22;;38170:99;;;:::o;38275:168::-;38358:11;38392:6;38387:3;38380:19;38432:4;38427:3;38423:14;38408:29;;38275:168;;;;:::o;38449:147::-;38550:11;38587:3;38572:18;;38449:147;;;;:::o;38602:169::-;38686:11;38720:6;38715:3;38708:19;38760:4;38755:3;38751:14;38736:29;;38602:169;;;;:::o;38777:148::-;38879:11;38916:3;38901:18;;38777:148;;;;:::o;38931:273::-;38971:3;38990:20;39008:1;38990:20;:::i;:::-;38985:25;;39024:20;39042:1;39024:20;:::i;:::-;39019:25;;39146:1;39110:34;39106:42;39103:1;39100:49;39097:75;;;39152:18;;:::i;:::-;39097:75;39196:1;39193;39189:9;39182:16;;38931:273;;;;:::o;39210:305::-;39250:3;39269:20;39287:1;39269:20;:::i;:::-;39264:25;;39303:20;39321:1;39303:20;:::i;:::-;39298:25;;39457:1;39389:66;39385:74;39382:1;39379:81;39376:107;;;39463:18;;:::i;:::-;39376:107;39507:1;39504;39500:9;39493:16;;39210:305;;;;:::o;39521:185::-;39561:1;39578:20;39596:1;39578:20;:::i;:::-;39573:25;;39612:20;39630:1;39612:20;:::i;:::-;39607:25;;39651:1;39641:35;;39656:18;;:::i;:::-;39641:35;39698:1;39695;39691:9;39686:14;;39521:185;;;;:::o;39712:348::-;39752:7;39775:20;39793:1;39775:20;:::i;:::-;39770:25;;39809:20;39827:1;39809:20;:::i;:::-;39804:25;;39997:1;39929:66;39925:74;39922:1;39919:81;39914:1;39907:9;39900:17;39896:105;39893:131;;;40004:18;;:::i;:::-;39893:131;40052:1;40049;40045:9;40034:20;;39712:348;;;;:::o;40066:191::-;40106:4;40126:20;40144:1;40126:20;:::i;:::-;40121:25;;40160:20;40178:1;40160:20;:::i;:::-;40155:25;;40199:1;40196;40193:8;40190:34;;;40204:18;;:::i;:::-;40190:34;40249:1;40246;40242:9;40234:17;;40066:191;;;;:::o;40263:::-;40303:4;40323:20;40341:1;40323:20;:::i;:::-;40318:25;;40357:20;40375:1;40357:20;:::i;:::-;40352:25;;40396:1;40393;40390:8;40387:34;;;40401:18;;:::i;:::-;40387:34;40446:1;40443;40439:9;40431:17;;40263:191;;;;:::o;40460:96::-;40497:7;40526:24;40544:5;40526:24;:::i;:::-;40515:35;;40460:96;;;:::o;40562:90::-;40596:7;40639:5;40632:13;40625:21;40614:32;;40562:90;;;:::o;40658:149::-;40694:7;40734:66;40727:5;40723:78;40712:89;;40658:149;;;:::o;40813:118::-;40850:7;40890:34;40883:5;40879:46;40868:57;;40813:118;;;:::o;40937:126::-;40974:7;41014:42;41007:5;41003:54;40992:65;;40937:126;;;:::o;41069:77::-;41106:7;41135:5;41124:16;;41069:77;;;:::o;41152:101::-;41188:7;41228:18;41221:5;41217:30;41206:41;;41152:101;;;:::o;41259:154::-;41343:6;41338:3;41333;41320:30;41405:1;41396:6;41391:3;41387:16;41380:27;41259:154;;;:::o;41419:307::-;41487:1;41497:113;41511:6;41508:1;41505:13;41497:113;;;41596:1;41591:3;41587:11;41581:18;41577:1;41572:3;41568:11;41561:39;41533:2;41530:1;41526:10;41521:15;;41497:113;;;41628:6;41625:1;41622:13;41619:101;;;41708:1;41699:6;41694:3;41690:16;41683:27;41619:101;41468:258;41419:307;;;:::o;41732:171::-;41771:3;41794:24;41812:5;41794:24;:::i;:::-;41785:33;;41840:4;41833:5;41830:15;41827:41;;;41848:18;;:::i;:::-;41827:41;41895:1;41888:5;41884:13;41877:20;;41732:171;;;:::o;41909:320::-;41953:6;41990:1;41984:4;41980:12;41970:22;;42037:1;42031:4;42027:12;42058:18;42048:81;;42114:4;42106:6;42102:17;42092:27;;42048:81;42176:2;42168:6;42165:14;42145:18;42142:38;42139:84;;;42195:18;;:::i;:::-;42139:84;41960:269;41909:320;;;:::o;42235:281::-;42318:27;42340:4;42318:27;:::i;:::-;42310:6;42306:40;42448:6;42436:10;42433:22;42412:18;42400:10;42397:34;42394:62;42391:88;;;42459:18;;:::i;:::-;42391:88;42499:10;42495:2;42488:22;42278:238;42235:281;;:::o;42522:233::-;42561:3;42584:24;42602:5;42584:24;:::i;:::-;42575:33;;42630:66;42623:5;42620:77;42617:103;;;42700:18;;:::i;:::-;42617:103;42747:1;42740:5;42736:13;42729:20;;42522:233;;;:::o;42761:176::-;42793:1;42810:20;42828:1;42810:20;:::i;:::-;42805:25;;42844:20;42862:1;42844:20;:::i;:::-;42839:25;;42883:1;42873:35;;42888:18;;:::i;:::-;42873:35;42929:1;42926;42922:9;42917:14;;42761:176;;;;:::o;42943:180::-;42991:77;42988:1;42981:88;43088:4;43085:1;43078:15;43112:4;43109:1;43102:15;43129:180;43177:77;43174:1;43167:88;43274:4;43271:1;43264:15;43298:4;43295:1;43288:15;43315:180;43363:77;43360:1;43353:88;43460:4;43457:1;43450:15;43484:4;43481:1;43474:15;43501:180;43549:77;43546:1;43539:88;43646:4;43643:1;43636:15;43670:4;43667:1;43660:15;43687:180;43735:77;43732:1;43725:88;43832:4;43829:1;43822:15;43856:4;43853:1;43846:15;43873:117;43982:1;43979;43972:12;43996:117;44105:1;44102;44095:12;44119:117;44228:1;44225;44218:12;44242:117;44351:1;44348;44341:12;44365:117;44474:1;44471;44464:12;44488:117;44597:1;44594;44587:12;44611:102;44652:6;44703:2;44699:7;44694:2;44687:5;44683:14;44679:28;44669:38;;44611:102;;;:::o;44719:221::-;44859:34;44855:1;44847:6;44843:14;44836:58;44928:4;44923:2;44915:6;44911:15;44904:29;44719:221;:::o;44946:225::-;45086:34;45082:1;45074:6;45070:14;45063:58;45155:8;45150:2;45142:6;45138:15;45131:33;44946:225;:::o;45177:229::-;45317:34;45313:1;45305:6;45301:14;45294:58;45386:12;45381:2;45373:6;45369:15;45362:37;45177:229;:::o;45412:222::-;45552:34;45548:1;45540:6;45536:14;45529:58;45621:5;45616:2;45608:6;45604:15;45597:30;45412:222;:::o;45640:224::-;45780:34;45776:1;45768:6;45764:14;45757:58;45849:7;45844:2;45836:6;45832:15;45825:32;45640:224;:::o;45870:236::-;46010:34;46006:1;45998:6;45994:14;45987:58;46079:19;46074:2;46066:6;46062:15;46055:44;45870:236;:::o;46112:182::-;46252:34;46248:1;46240:6;46236:14;46229:58;46112:182;:::o;46300:244::-;46440:34;46436:1;46428:6;46424:14;46417:58;46509:27;46504:2;46496:6;46492:15;46485:52;46300:244;:::o;46550:174::-;46690:26;46686:1;46678:6;46674:14;46667:50;46550:174;:::o;46730:230::-;46870:34;46866:1;46858:6;46854:14;46847:58;46939:13;46934:2;46926:6;46922:15;46915:38;46730:230;:::o;46966:225::-;47106:34;47102:1;47094:6;47090:14;47083:58;47175:8;47170:2;47162:6;47158:15;47151:33;46966:225;:::o;47197:182::-;47337:34;47333:1;47325:6;47321:14;47314:58;47197:182;:::o;47385:234::-;47525:34;47521:1;47513:6;47509:14;47502:58;47594:17;47589:2;47581:6;47577:15;47570:42;47385:234;:::o;47625:176::-;47765:28;47761:1;47753:6;47749:14;47742:52;47625:176;:::o;47807:237::-;47947:34;47943:1;47935:6;47931:14;47924:58;48016:20;48011:2;48003:6;47999:15;47992:45;47807:237;:::o;48050:171::-;48190:23;48186:1;48178:6;48174:14;48167:47;48050:171;:::o;48227:221::-;48367:34;48363:1;48355:6;48351:14;48344:58;48436:4;48431:2;48423:6;48419:15;48412:29;48227:221;:::o;48454:114::-;;:::o;48574:166::-;48714:18;48710:1;48702:6;48698:14;48691:42;48574:166;:::o;48746:158::-;48886:10;48882:1;48874:6;48870:14;48863:34;48746:158;:::o;48910:238::-;49050:34;49046:1;49038:6;49034:14;49027:58;49119:21;49114:2;49106:6;49102:15;49095:46;48910:238;:::o;49154:179::-;49294:31;49290:1;49282:6;49278:14;49271:55;49154:179;:::o;49339:180::-;49479:32;49475:1;49467:6;49463:14;49456:56;49339:180;:::o;49525:220::-;49665:34;49661:1;49653:6;49649:14;49642:58;49734:3;49729:2;49721:6;49717:15;49710:28;49525:220;:::o;49751:164::-;49891:16;49887:1;49879:6;49875:14;49868:40;49751:164;:::o;49921:233::-;50061:34;50057:1;50049:6;50045:14;50038:58;50130:16;50125:2;50117:6;50113:15;50106:41;49921:233;:::o;50160:225::-;50300:34;50296:1;50288:6;50284:14;50277:58;50369:8;50364:2;50356:6;50352:15;50345:33;50160:225;:::o;50391:169::-;50531:21;50527:1;50519:6;50515:14;50508:45;50391:169;:::o;50566:181::-;50706:33;50702:1;50694:6;50690:14;50683:57;50566:181;:::o;50753:234::-;50893:34;50889:1;50881:6;50877:14;50870:58;50962:17;50957:2;50949:6;50945:15;50938:42;50753:234;:::o;50993:232::-;51133:34;51129:1;51121:6;51117:14;51110:58;51202:15;51197:2;51189:6;51185:15;51178:40;50993:232;:::o;51231:221::-;51371:34;51367:1;51359:6;51355:14;51348:58;51440:4;51435:2;51427:6;51423:15;51416:29;51231:221;:::o;51458:122::-;51531:24;51549:5;51531:24;:::i;:::-;51524:5;51521:35;51511:63;;51570:1;51567;51560:12;51511:63;51458:122;:::o;51586:116::-;51656:21;51671:5;51656:21;:::i;:::-;51649:5;51646:32;51636:60;;51692:1;51689;51682:12;51636:60;51586:116;:::o;51708:120::-;51780:23;51797:5;51780:23;:::i;:::-;51773:5;51770:34;51760:62;;51818:1;51815;51808:12;51760:62;51708:120;:::o;51834:122::-;51907:24;51925:5;51907:24;:::i;:::-;51900:5;51897:35;51887:63;;51946:1;51943;51936:12;51887:63;51834:122;:::o

Swarm Source

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