Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
855 TDT
Holders
90
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
15 TDTLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
ToddlerTurtles
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-05-23 */ /** * */ ////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } /** * */ ////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; ////import "../../utils/introspection/IERC165.sol"; /** * @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`. * * 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; /** * @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 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 the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @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); } /** * */ ////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; ////import "../IERC721.sol"; /** * @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); } /** * */ ////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * */ ////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; ////import "../IERC721.sol"; /** * @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); } /** * */ ////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT // OpenZeppelin Contracts v4.4.1 (interfaces/IERC721Receiver.sol) pragma solidity ^0.8.0; ////import "../token/ERC721/IERC721Receiver.sol"; /** * */ ////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT // 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); } } } } /** * */ ////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT // OpenZeppelin Contracts v4.4.1 (interfaces/IERC721Metadata.sol) pragma solidity ^0.8.0; ////import "../token/ERC721/extensions/IERC721Metadata.sol"; /** * */ ////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT // OpenZeppelin Contracts v4.4.1 (interfaces/IERC721.sol) pragma solidity ^0.8.0; ////import "../token/ERC721/IERC721.sol"; /** * */ ////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; ////import "./IERC165.sol"; /** * @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; } } /** * */ ////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT // 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; } } /** * */ ////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT // OpenZeppelin Contracts v4.4.1 (interfaces/IERC721Enumerable.sol) pragma solidity ^0.8.0; ////import "../token/ERC721/extensions/IERC721Enumerable.sol"; /** * */ ////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT pragma solidity ^0.8.0; ////import "@openzeppelin/contracts/utils/Context.sol"; ////import "@openzeppelin/contracts/utils/introspection/ERC165.sol"; ////import "@openzeppelin/contracts/interfaces/IERC721.sol"; ////import "@openzeppelin/contracts/interfaces/IERC721Metadata.sol"; ////import "@openzeppelin/contracts/utils/Address.sol"; ////import "@openzeppelin/contracts/interfaces/IERC721Receiver.sol"; /************************* * @author: Squeebo * * @license: BSD-3-Clause * **************************/ abstract contract ERC721B is Context, ERC165, IERC721, IERC721Metadata { using Address for address; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address address[] internal _owners; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); uint count = 0; uint length = _owners.length; for( uint i = 0; i < length; ++i ){ if( owner == _owners[i] ){ ++count; } } delete length; return count; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721B.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return tokenId < _owners.length && _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721B.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _owners.push(to); emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721B.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _owners[tokenId] = address(0); emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721B.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721B.ownerOf(tokenId), to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } /** * */ ////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; ////import "../utils/Context.sol"; /** * @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); } } /** * */ ////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT pragma solidity ^0.8.0; ////import "./ERC721B.sol"; ////import "@openzeppelin/contracts/interfaces/IERC721Enumerable.sol"; /************************* * @author: Squeebo * * @license: BSD-3-Clause * **************************/ /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721EnumerableB is ERC721B, IERC721Enumerable { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721B) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256 tokenId) { require(index < ERC721B.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); uint count; uint length = _owners.length; for( uint i; i < length; ++i ){ if( owner == _owners[i] ){ if( count == index ){ delete count; delete length; return i; } else ++count; } } delete count; delete length; require(false, "ERC721Enumerable: owner index out of bounds"); } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _owners.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721EnumerableB.totalSupply(), "ERC721Enumerable: global index out of bounds"); return index; } } /** * */ ////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT pragma solidity ^0.8.0; ////import "@openzeppelin/contracts/access/Ownable.sol"; /************************* * @author: Squeebo * * @license: BSD-3-Clause * **************************/ contract Delegated is Ownable{ mapping(address => bool) internal _delegates; constructor(){ _delegates[owner()] = true; } modifier onlyDelegates { require(_delegates[msg.sender], "Invalid delegate" ); _; } //onlyOwner function isDelegate( address addr ) external view onlyOwner returns ( bool ){ return _delegates[addr]; } function setDelegate( address addr, bool isDelegate_ ) external onlyOwner{ _delegates[addr] = isDelegate_; } } /** * */ ////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT // 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); } } /** * */ ////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT pragma solidity ^0.8.7; ////import "@openzeppelin/contracts/utils/Strings.sol"; ////import "./Delegated.sol"; ////import "./ERC721EnumerableB.sol"; /**************************************** * @author: Squeebo * * @team: X-11 * **************************************** * Blimpie-ERC721 provides low-gas * * mints + transfers * ****************************************/ contract ToddlerTurtles is Delegated, ERC721EnumerableB { using Strings for uint; uint public MAX_SUPPLY = 9999; bool public isActive = false; uint public maxOrder = 15; string private _baseTokenURI = ''; string private _tokenURISuffix = ''; mapping(address => uint[]) private _balances; mapping(address => uint) private _minted; constructor() Delegated() ERC721B("Toddler Turtles", "TDT") { } //external fallback() external payable {} receive() external payable {} function mint( uint quantity ) external payable { require( isActive, "Sale is not active" ); require( quantity <= maxOrder, "Order too big" ); require( _minted[msg.sender] + quantity <= maxOrder, "Minted max" ); uint256 supply = totalSupply(); require( supply + quantity <= MAX_SUPPLY, "Mint/order exceeds supply" ); _minted[msg.sender] += quantity; for(uint i = 0; i < quantity; ++i){ _safeMint( msg.sender, supply++, "" ); } } //external delegated function gift(uint[] calldata quantity, address[] calldata recipient) external onlyDelegates{ require(quantity.length == recipient.length, "Must provide equal quantities and recipients" ); uint totalQuantity = 0; uint256 supply = totalSupply(); for(uint i = 0; i < quantity.length; ++i){ totalQuantity += quantity[i]; } require( supply + totalQuantity <= MAX_SUPPLY, "Mint/order exceeds supply" ); delete totalQuantity; for(uint i = 0; i < recipient.length; ++i){ for(uint j = 0; j < quantity[i]; ++j){ _safeMint( recipient[i], supply++, "Sent with love" ); } } } function setActive(bool isActive_) external onlyDelegates{ if( isActive != isActive_ ) isActive = isActive_; } function setMaxOrder(uint maxOrder_) external onlyDelegates{ if( maxOrder != maxOrder_ ) maxOrder = maxOrder_; } function setBaseURI(string calldata _newBaseURI, string calldata _newSuffix) external onlyDelegates{ _baseTokenURI = _newBaseURI; _tokenURISuffix = _newSuffix; } //external owner function setMaxSupply(uint maxSupply) external onlyOwner{ if( MAX_SUPPLY != maxSupply ){ require(maxSupply >= totalSupply(), "Specified supply is lower than current balance" ); MAX_SUPPLY = maxSupply; } } //public function balanceOf(address owner) public view virtual override(ERC721B) returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner].length; } function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256 tokenId) { require(index < ERC721B.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _balances[owner][index]; } function tokenURI(uint tokenId) external view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); return string(abi.encodePacked(_baseTokenURI, tokenId.toString(), _tokenURISuffix)); } //internal function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal override virtual { address zero = address(0); if( from != zero || to == zero ){ //find this token and remove it uint length = _balances[from].length; for( uint i; i < length; ++i ){ if( _balances[from][i] == tokenId ){ _balances[from][i] = _balances[from][length - 1]; _balances[from].pop(); break; } } delete length; } if( from == zero || to != zero ){ _balances[to].push( tokenId ); } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"quantity","type":"uint256[]"},{"internalType":"address[]","name":"recipient","type":"address[]"}],"name":"gift","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"isDelegate","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxOrder","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":[{"internalType":"bool","name":"isActive_","type":"bool"}],"name":"setActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"},{"internalType":"string","name":"_newSuffix","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"bool","name":"isDelegate_","type":"bool"}],"name":"setDelegate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxOrder_","type":"uint256"}],"name":"setMaxOrder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxSupply","type":"uint256"}],"name":"setMaxSupply","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":"tokenId","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"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
61270f6007556008805460ff19169055600f60095560a06040819052600060808190526200003091600a9162000187565b506040805160208101918290526000908190526200005191600b9162000187565b503480156200005f57600080fd5b506040518060400160405280600f81526020016e546f64646c657220547572746c657360881b8152506040518060400160405280600381526020016215111560ea1b815250620000be620000b86200013360201b60201c565b62000137565b6001806000620000d66000546001600160a01b031690565b6001600160a01b03168152602080820192909252604001600020805460ff191692151592909217909155825162000114916002919085019062000187565b5080516200012a90600390602084019062000187565b5050506200026a565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b82805462000195906200022d565b90600052602060002090601f016020900481019282620001b9576000855562000204565b82601f10620001d457805160ff191683800117855562000204565b8280016001018555821562000204579182015b8281111562000204578251825591602001919060010190620001e7565b506200021292915062000216565b5090565b5b8082111562000212576000815560010162000217565b600181811c908216806200024257607f821691505b602082108114156200026457634e487b7160e01b600052602260045260246000fd5b50919050565b61248d806200027a6000396000f3fe6080604052600436106101b85760003560e01c80636790a9de116100eb578063a0712d681161008f578063c87b56dd11610061578063c87b56dd146104f4578063dde3d31314610514578063e985e9c514610534578063f2fde38b1461057d57005b8063a0712d6814610481578063a22cb46514610494578063acec338a146104b4578063b88d4fde146104d457005b8063715018a6116100c8578063715018a6146104195780638da5cb5b1461042e57806395d89b411461044c57806396ea3a471461046157005b80636790a9de146103b95780636f8b44b0146103d957806370a08231146103f957005b806322f3e2d41161015d57806342842e0e1161012f57806342842e0e146103395780634a994eef146103595780634f6ccce7146103795780636352211e1461039957005b806322f3e2d4146102c957806323b872dd146102e35780632f745c591461030357806332cb6b0c1461032357005b80630777962711610196578063077796271461023c578063081812fc1461025c578063095ea7b31461029457806318160ddd146102b457005b8062451026146101c157806301ffc9a7146101ea57806306fdde031461021a57005b366101bf57005b005b3480156101cd57600080fd5b506101d760095481565b6040519081526020015b60405180910390f35b3480156101f657600080fd5b5061020a610205366004611fb2565b61059d565b60405190151581526020016101e1565b34801561022657600080fd5b5061022f6105c8565b6040516101e1919061219b565b34801561024857600080fd5b5061020a610257366004611d6a565b61065a565b34801561026857600080fd5b5061027c61027736600461204c565b6106b1565b6040516001600160a01b0390911681526020016101e1565b3480156102a057600080fd5b506101bf6102af366004611f01565b610739565b3480156102c057600080fd5b506004546101d7565b3480156102d557600080fd5b5060085461020a9060ff1681565b3480156102ef57600080fd5b506101bf6102fe366004611dbf565b61084f565b34801561030f57600080fd5b506101d761031e366004611f01565b610880565b34801561032f57600080fd5b506101d760075481565b34801561034557600080fd5b506101bf610354366004611dbf565b61092a565b34801561036557600080fd5b506101bf610374366004611ed7565b610945565b34801561038557600080fd5b506101d761039436600461204c565b61099a565b3480156103a557600080fd5b5061027c6103b436600461204c565b610a0c565b3480156103c557600080fd5b506101bf6103d4366004611fec565b610a98565b3480156103e557600080fd5b506101bf6103f436600461204c565b610ae7565b34801561040557600080fd5b506101d7610414366004611d6a565b610b8c565b34801561042557600080fd5b506101bf610bd0565b34801561043a57600080fd5b506000546001600160a01b031661027c565b34801561045857600080fd5b5061022f610c06565b34801561046d57600080fd5b506101bf61047c366004611f2b565b610c15565b6101bf61048f36600461204c565b610e0d565b3480156104a057600080fd5b506101bf6104af366004611ed7565b610fb9565b3480156104c057600080fd5b506101bf6104cf366004611f97565b61107e565b3480156104e057600080fd5b506101bf6104ef366004611dfb565b6110d0565b34801561050057600080fd5b5061022f61050f36600461204c565b611108565b34801561052057600080fd5b506101bf61052f36600461204c565b6111ac565b34801561054057600080fd5b5061020a61054f366004611d8c565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b34801561058957600080fd5b506101bf610598366004611d6a565b6111e9565b60006001600160e01b0319821663780e9d6360e01b14806105c257506105c282611281565b92915050565b6060600280546105d790612369565b80601f016020809104026020016040519081016040528092919081815260200182805461060390612369565b80156106505780601f1061062557610100808354040283529160200191610650565b820191906000526020600020905b81548152906001019060200180831161063357829003601f168201915b5050505050905090565b600080546001600160a01b0316331461068e5760405162461bcd60e51b815260040161068590612274565b60405180910390fd5b506001600160a01b03811660009081526001602052604090205460ff165b919050565b60006106bc826112d1565b61071d5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610685565b506000908152600560205260409020546001600160a01b031690565b600061074482610a0c565b9050806001600160a01b0316836001600160a01b031614156107b25760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610685565b336001600160a01b03821614806107ce57506107ce813361054f565b6108405760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610685565b61084a838361131b565b505050565b6108593382611389565b6108755760405162461bcd60e51b8152600401610685906122a9565b61084a838383611473565b600061088b836115d4565b82106108ed5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610685565b6001600160a01b0383166000908152600c6020526040902080548390811061091757610917612415565b9060005260206000200154905092915050565b61084a838383604051806020016040528060008152506110d0565b6000546001600160a01b0316331461096f5760405162461bcd60e51b815260040161068590612274565b6001600160a01b03919091166000908152600160205260409020805460ff1916911515919091179055565b60006109a560045490565b8210610a085760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610685565b5090565b60008060048381548110610a2257610a22612415565b6000918252602090912001546001600160a01b03169050806105c25760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610685565b3360009081526001602052604090205460ff16610ac75760405162461bcd60e51b8152600401610685906121ae565b610ad3600a8585611c25565b50610ae0600b8383611c25565b5050505050565b6000546001600160a01b03163314610b115760405162461bcd60e51b815260040161068590612274565b8060075414610b8957600454811015610b835760405162461bcd60e51b815260206004820152602e60248201527f53706563696669656420737570706c79206973206c6f776572207468616e206360448201526d757272656e742062616c616e636560901b6064820152608401610685565b60078190555b50565b60006001600160a01b038216610bb45760405162461bcd60e51b81526004016106859061222a565b506001600160a01b03166000908152600c602052604090205490565b6000546001600160a01b03163314610bfa5760405162461bcd60e51b815260040161068590612274565b610c046000611663565b565b6060600380546105d790612369565b3360009081526001602052604090205460ff16610c445760405162461bcd60e51b8152600401610685906121ae565b828114610ca85760405162461bcd60e51b815260206004820152602c60248201527f4d7573742070726f7669646520657175616c207175616e74697469657320616e60448201526b6420726563697069656e747360a01b6064820152608401610685565b600080610cb460045490565b905060005b85811015610cf757868682818110610cd357610cd3612415565b9050602002013583610ce591906122fa565b9250610cf0816123a4565b9050610cb9565b50600754610d0583836122fa565b1115610d4f5760405162461bcd60e51b81526020600482015260196024820152784d696e742f6f72646572206578636565647320737570706c7960381b6044820152606401610685565b6000915060005b83811015610e045760005b878783818110610d7357610d73612415565b90506020020135811015610df357610de3868684818110610d9657610d96612415565b9050602002016020810190610dab9190611d6a565b84610db5816123a4565b95506040518060400160405280600e81526020016d53656e742077697468206c6f766560901b8152506116b3565b610dec816123a4565b9050610d61565b50610dfd816123a4565b9050610d56565b50505050505050565b60085460ff16610e545760405162461bcd60e51b815260206004820152601260248201527153616c65206973206e6f742061637469766560701b6044820152606401610685565b600954811115610e965760405162461bcd60e51b815260206004820152600d60248201526c4f7264657220746f6f2062696760981b6044820152606401610685565b600954336000908152600d6020526040902054610eb49083906122fa565b1115610eef5760405162461bcd60e51b815260206004820152600a60248201526909ad2dce8cac840dac2f60b31b6044820152606401610685565b6000610efa60045490565b600754909150610f0a83836122fa565b1115610f545760405162461bcd60e51b81526020600482015260196024820152784d696e742f6f72646572206578636565647320737570706c7960381b6044820152606401610685565b336000908152600d602052604081208054849290610f739084906122fa565b90915550600090505b8281101561084a57610fa93383610f92816123a4565b9450604051806020016040528060008152506116b3565b610fb2816123a4565b9050610f7c565b6001600160a01b0382163314156110125760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610685565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b3360009081526001602052604090205460ff166110ad5760405162461bcd60e51b8152600401610685906121ae565b60085460ff16151581151514610b89576008805482151560ff1990911617905550565b6110da3383611389565b6110f65760405162461bcd60e51b8152600401610685906122a9565b611102848484846116e6565b50505050565b6060611113826112d1565b6111775760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610685565b600a61118283611719565b600b6040516020016111969392919061212b565b6040516020818303038152906040529050919050565b3360009081526001602052604090205460ff166111db5760405162461bcd60e51b8152600401610685906121ae565b8060095414610b8957600955565b6000546001600160a01b031633146112135760405162461bcd60e51b815260040161068590612274565b6001600160a01b0381166112785760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610685565b610b8981611663565b60006001600160e01b031982166380ac58cd60e01b14806112b257506001600160e01b03198216635b5e139f60e01b145b806105c257506301ffc9a760e01b6001600160e01b03198316146105c2565b600454600090821080156105c2575060006001600160a01b0316600483815481106112fe576112fe612415565b6000918252602090912001546001600160a01b0316141592915050565b600081815260056020526040902080546001600160a01b0319166001600160a01b038416908117909155819061135082610a0c565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611394826112d1565b6113f55760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610685565b600061140083610a0c565b9050806001600160a01b0316846001600160a01b0316148061143b5750836001600160a01b0316611430846106b1565b6001600160a01b0316145b8061146b57506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661148682610a0c565b6001600160a01b0316146114ee5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610685565b6001600160a01b0382166115505760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610685565b61155b838383611817565b61156660008261131b565b816004828154811061157a5761157a612415565b6000918252602082200180546001600160a01b0319166001600160a01b03938416179055604051839285811692908716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9190a4505050565b60006001600160a01b0382166115fc5760405162461bcd60e51b81526004016106859061222a565b600454600090815b8181101561165a576004818154811061161f5761161f612415565b6000918252602090912001546001600160a01b038681169116141561164a57611647836123a4565b92505b611653816123a4565b9050611604565b50909392505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6116bd83836119e4565b6116ca6000848484611b18565b61084a5760405162461bcd60e51b8152600401610685906121d8565b6116f1848484611473565b6116fd84848484611b18565b6111025760405162461bcd60e51b8152600401610685906121d8565b60608161173d5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156117675780611751816123a4565b91506117609050600a83612312565b9150611741565b60008167ffffffffffffffff8111156117825761178261242b565b6040519080825280601f01601f1916602001820160405280156117ac576020820181803683370190505b5090505b841561146b576117c1600183612326565b91506117ce600a866123bf565b6117d99060306122fa565b60f81b8183815181106117ee576117ee612415565b60200101906001600160f81b031916908160001a905350611810600a86612312565b94506117b0565b60006001600160a01b0384161515806118415750806001600160a01b0316836001600160a01b0316145b1561197e576001600160a01b0384166000908152600c6020526040812054905b8181101561197b576001600160a01b0386166000908152600c6020526040902080548591908390811061189657611896612415565b9060005260206000200154141561196b576001600160a01b0386166000908152600c602052604090206118ca600184612326565b815481106118da576118da612415565b9060005260206000200154600c6000886001600160a01b03166001600160a01b03168152602001908152602001600020828154811061191b5761191b612415565b60009182526020808320909101929092556001600160a01b0388168152600c90915260409020805480611950576119506123ff565b6001900381819060005260206000200160009055905561197b565b611974816123a4565b9050611861565b50505b806001600160a01b0316846001600160a01b031614806119b05750806001600160a01b0316836001600160a01b031614155b1561110257506001600160a01b03919091166000908152600c60209081526040822080546001810182559083529120015550565b6001600160a01b038216611a3a5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610685565b611a43816112d1565b15611a905760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610685565b611a9c60008383611817565b6004805460018101825560009182527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b0180546001600160a01b0319166001600160a01b0385169081179091556040518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001600160a01b0384163b15611c1a57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611b5c90339089908890889060040161215e565b602060405180830381600087803b158015611b7657600080fd5b505af1925050508015611ba6575060408051601f3d908101601f19168201909252611ba391810190611fcf565b60015b611c00573d808015611bd4576040519150601f19603f3d011682016040523d82523d6000602084013e611bd9565b606091505b508051611bf85760405162461bcd60e51b8152600401610685906121d8565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061146b565b506001949350505050565b828054611c3190612369565b90600052602060002090601f016020900481019282611c535760008555611c99565b82601f10611c6c5782800160ff19823516178555611c99565b82800160010185558215611c99579182015b82811115611c99578235825591602001919060010190611c7e565b50610a089291505b80821115610a085760008155600101611ca1565b80356001600160a01b03811681146106ac57600080fd5b60008083601f840112611cde57600080fd5b50813567ffffffffffffffff811115611cf657600080fd5b6020830191508360208260051b8501011115611d1157600080fd5b9250929050565b803580151581146106ac57600080fd5b60008083601f840112611d3a57600080fd5b50813567ffffffffffffffff811115611d5257600080fd5b602083019150836020828501011115611d1157600080fd5b600060208284031215611d7c57600080fd5b611d8582611cb5565b9392505050565b60008060408385031215611d9f57600080fd5b611da883611cb5565b9150611db660208401611cb5565b90509250929050565b600080600060608486031215611dd457600080fd5b611ddd84611cb5565b9250611deb60208501611cb5565b9150604084013590509250925092565b60008060008060808587031215611e1157600080fd5b611e1a85611cb5565b9350611e2860208601611cb5565b925060408501359150606085013567ffffffffffffffff80821115611e4c57600080fd5b818701915087601f830112611e6057600080fd5b813581811115611e7257611e7261242b565b604051601f8201601f19908116603f01168101908382118183101715611e9a57611e9a61242b565b816040528281528a6020848701011115611eb357600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b60008060408385031215611eea57600080fd5b611ef383611cb5565b9150611db660208401611d18565b60008060408385031215611f1457600080fd5b611f1d83611cb5565b946020939093013593505050565b60008060008060408587031215611f4157600080fd5b843567ffffffffffffffff80821115611f5957600080fd5b611f6588838901611ccc565b90965094506020870135915080821115611f7e57600080fd5b50611f8b87828801611ccc565b95989497509550505050565b600060208284031215611fa957600080fd5b611d8582611d18565b600060208284031215611fc457600080fd5b8135611d8581612441565b600060208284031215611fe157600080fd5b8151611d8581612441565b6000806000806040858703121561200257600080fd5b843567ffffffffffffffff8082111561201a57600080fd5b61202688838901611d28565b9096509450602087013591508082111561203f57600080fd5b50611f8b87828801611d28565b60006020828403121561205e57600080fd5b5035919050565b6000815180845261207d81602086016020860161233d565b601f01601f19169290920160200192915050565b8054600090600181811c90808316806120ab57607f831692505b60208084108214156120cd57634e487b7160e01b600052602260045260246000fd5b8180156120e157600181146120f25761211f565b60ff1986168952848901965061211f565b60008881526020902060005b868110156121175781548b8201529085019083016120fe565b505084890196505b50505050505092915050565b60006121378286612091565b845161214781836020890161233d565b61215381830186612091565b979650505050505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061219190830184612065565b9695505050505050565b602081526000611d856020830184612065565b60208082526010908201526f496e76616c69642064656c656761746560801b604082015260600190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6000821982111561230d5761230d6123d3565b500190565b600082612321576123216123e9565b500490565b600082821015612338576123386123d3565b500390565b60005b83811015612358578181015183820152602001612340565b838111156111025750506000910152565b600181811c9082168061237d57607f821691505b6020821081141561239e57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156123b8576123b86123d3565b5060010190565b6000826123ce576123ce6123e9565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610b8957600080fdfea2646970667358221220038a15899a4c34cbef7290079771f9b3d6672b53dac371aa60e00287b823870364736f6c63430008070033
Deployed Bytecode
0x6080604052600436106101b85760003560e01c80636790a9de116100eb578063a0712d681161008f578063c87b56dd11610061578063c87b56dd146104f4578063dde3d31314610514578063e985e9c514610534578063f2fde38b1461057d57005b8063a0712d6814610481578063a22cb46514610494578063acec338a146104b4578063b88d4fde146104d457005b8063715018a6116100c8578063715018a6146104195780638da5cb5b1461042e57806395d89b411461044c57806396ea3a471461046157005b80636790a9de146103b95780636f8b44b0146103d957806370a08231146103f957005b806322f3e2d41161015d57806342842e0e1161012f57806342842e0e146103395780634a994eef146103595780634f6ccce7146103795780636352211e1461039957005b806322f3e2d4146102c957806323b872dd146102e35780632f745c591461030357806332cb6b0c1461032357005b80630777962711610196578063077796271461023c578063081812fc1461025c578063095ea7b31461029457806318160ddd146102b457005b8062451026146101c157806301ffc9a7146101ea57806306fdde031461021a57005b366101bf57005b005b3480156101cd57600080fd5b506101d760095481565b6040519081526020015b60405180910390f35b3480156101f657600080fd5b5061020a610205366004611fb2565b61059d565b60405190151581526020016101e1565b34801561022657600080fd5b5061022f6105c8565b6040516101e1919061219b565b34801561024857600080fd5b5061020a610257366004611d6a565b61065a565b34801561026857600080fd5b5061027c61027736600461204c565b6106b1565b6040516001600160a01b0390911681526020016101e1565b3480156102a057600080fd5b506101bf6102af366004611f01565b610739565b3480156102c057600080fd5b506004546101d7565b3480156102d557600080fd5b5060085461020a9060ff1681565b3480156102ef57600080fd5b506101bf6102fe366004611dbf565b61084f565b34801561030f57600080fd5b506101d761031e366004611f01565b610880565b34801561032f57600080fd5b506101d760075481565b34801561034557600080fd5b506101bf610354366004611dbf565b61092a565b34801561036557600080fd5b506101bf610374366004611ed7565b610945565b34801561038557600080fd5b506101d761039436600461204c565b61099a565b3480156103a557600080fd5b5061027c6103b436600461204c565b610a0c565b3480156103c557600080fd5b506101bf6103d4366004611fec565b610a98565b3480156103e557600080fd5b506101bf6103f436600461204c565b610ae7565b34801561040557600080fd5b506101d7610414366004611d6a565b610b8c565b34801561042557600080fd5b506101bf610bd0565b34801561043a57600080fd5b506000546001600160a01b031661027c565b34801561045857600080fd5b5061022f610c06565b34801561046d57600080fd5b506101bf61047c366004611f2b565b610c15565b6101bf61048f36600461204c565b610e0d565b3480156104a057600080fd5b506101bf6104af366004611ed7565b610fb9565b3480156104c057600080fd5b506101bf6104cf366004611f97565b61107e565b3480156104e057600080fd5b506101bf6104ef366004611dfb565b6110d0565b34801561050057600080fd5b5061022f61050f36600461204c565b611108565b34801561052057600080fd5b506101bf61052f36600461204c565b6111ac565b34801561054057600080fd5b5061020a61054f366004611d8c565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b34801561058957600080fd5b506101bf610598366004611d6a565b6111e9565b60006001600160e01b0319821663780e9d6360e01b14806105c257506105c282611281565b92915050565b6060600280546105d790612369565b80601f016020809104026020016040519081016040528092919081815260200182805461060390612369565b80156106505780601f1061062557610100808354040283529160200191610650565b820191906000526020600020905b81548152906001019060200180831161063357829003601f168201915b5050505050905090565b600080546001600160a01b0316331461068e5760405162461bcd60e51b815260040161068590612274565b60405180910390fd5b506001600160a01b03811660009081526001602052604090205460ff165b919050565b60006106bc826112d1565b61071d5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610685565b506000908152600560205260409020546001600160a01b031690565b600061074482610a0c565b9050806001600160a01b0316836001600160a01b031614156107b25760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610685565b336001600160a01b03821614806107ce57506107ce813361054f565b6108405760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610685565b61084a838361131b565b505050565b6108593382611389565b6108755760405162461bcd60e51b8152600401610685906122a9565b61084a838383611473565b600061088b836115d4565b82106108ed5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610685565b6001600160a01b0383166000908152600c6020526040902080548390811061091757610917612415565b9060005260206000200154905092915050565b61084a838383604051806020016040528060008152506110d0565b6000546001600160a01b0316331461096f5760405162461bcd60e51b815260040161068590612274565b6001600160a01b03919091166000908152600160205260409020805460ff1916911515919091179055565b60006109a560045490565b8210610a085760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610685565b5090565b60008060048381548110610a2257610a22612415565b6000918252602090912001546001600160a01b03169050806105c25760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610685565b3360009081526001602052604090205460ff16610ac75760405162461bcd60e51b8152600401610685906121ae565b610ad3600a8585611c25565b50610ae0600b8383611c25565b5050505050565b6000546001600160a01b03163314610b115760405162461bcd60e51b815260040161068590612274565b8060075414610b8957600454811015610b835760405162461bcd60e51b815260206004820152602e60248201527f53706563696669656420737570706c79206973206c6f776572207468616e206360448201526d757272656e742062616c616e636560901b6064820152608401610685565b60078190555b50565b60006001600160a01b038216610bb45760405162461bcd60e51b81526004016106859061222a565b506001600160a01b03166000908152600c602052604090205490565b6000546001600160a01b03163314610bfa5760405162461bcd60e51b815260040161068590612274565b610c046000611663565b565b6060600380546105d790612369565b3360009081526001602052604090205460ff16610c445760405162461bcd60e51b8152600401610685906121ae565b828114610ca85760405162461bcd60e51b815260206004820152602c60248201527f4d7573742070726f7669646520657175616c207175616e74697469657320616e60448201526b6420726563697069656e747360a01b6064820152608401610685565b600080610cb460045490565b905060005b85811015610cf757868682818110610cd357610cd3612415565b9050602002013583610ce591906122fa565b9250610cf0816123a4565b9050610cb9565b50600754610d0583836122fa565b1115610d4f5760405162461bcd60e51b81526020600482015260196024820152784d696e742f6f72646572206578636565647320737570706c7960381b6044820152606401610685565b6000915060005b83811015610e045760005b878783818110610d7357610d73612415565b90506020020135811015610df357610de3868684818110610d9657610d96612415565b9050602002016020810190610dab9190611d6a565b84610db5816123a4565b95506040518060400160405280600e81526020016d53656e742077697468206c6f766560901b8152506116b3565b610dec816123a4565b9050610d61565b50610dfd816123a4565b9050610d56565b50505050505050565b60085460ff16610e545760405162461bcd60e51b815260206004820152601260248201527153616c65206973206e6f742061637469766560701b6044820152606401610685565b600954811115610e965760405162461bcd60e51b815260206004820152600d60248201526c4f7264657220746f6f2062696760981b6044820152606401610685565b600954336000908152600d6020526040902054610eb49083906122fa565b1115610eef5760405162461bcd60e51b815260206004820152600a60248201526909ad2dce8cac840dac2f60b31b6044820152606401610685565b6000610efa60045490565b600754909150610f0a83836122fa565b1115610f545760405162461bcd60e51b81526020600482015260196024820152784d696e742f6f72646572206578636565647320737570706c7960381b6044820152606401610685565b336000908152600d602052604081208054849290610f739084906122fa565b90915550600090505b8281101561084a57610fa93383610f92816123a4565b9450604051806020016040528060008152506116b3565b610fb2816123a4565b9050610f7c565b6001600160a01b0382163314156110125760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610685565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b3360009081526001602052604090205460ff166110ad5760405162461bcd60e51b8152600401610685906121ae565b60085460ff16151581151514610b89576008805482151560ff1990911617905550565b6110da3383611389565b6110f65760405162461bcd60e51b8152600401610685906122a9565b611102848484846116e6565b50505050565b6060611113826112d1565b6111775760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610685565b600a61118283611719565b600b6040516020016111969392919061212b565b6040516020818303038152906040529050919050565b3360009081526001602052604090205460ff166111db5760405162461bcd60e51b8152600401610685906121ae565b8060095414610b8957600955565b6000546001600160a01b031633146112135760405162461bcd60e51b815260040161068590612274565b6001600160a01b0381166112785760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610685565b610b8981611663565b60006001600160e01b031982166380ac58cd60e01b14806112b257506001600160e01b03198216635b5e139f60e01b145b806105c257506301ffc9a760e01b6001600160e01b03198316146105c2565b600454600090821080156105c2575060006001600160a01b0316600483815481106112fe576112fe612415565b6000918252602090912001546001600160a01b0316141592915050565b600081815260056020526040902080546001600160a01b0319166001600160a01b038416908117909155819061135082610a0c565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611394826112d1565b6113f55760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610685565b600061140083610a0c565b9050806001600160a01b0316846001600160a01b0316148061143b5750836001600160a01b0316611430846106b1565b6001600160a01b0316145b8061146b57506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661148682610a0c565b6001600160a01b0316146114ee5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610685565b6001600160a01b0382166115505760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610685565b61155b838383611817565b61156660008261131b565b816004828154811061157a5761157a612415565b6000918252602082200180546001600160a01b0319166001600160a01b03938416179055604051839285811692908716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9190a4505050565b60006001600160a01b0382166115fc5760405162461bcd60e51b81526004016106859061222a565b600454600090815b8181101561165a576004818154811061161f5761161f612415565b6000918252602090912001546001600160a01b038681169116141561164a57611647836123a4565b92505b611653816123a4565b9050611604565b50909392505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6116bd83836119e4565b6116ca6000848484611b18565b61084a5760405162461bcd60e51b8152600401610685906121d8565b6116f1848484611473565b6116fd84848484611b18565b6111025760405162461bcd60e51b8152600401610685906121d8565b60608161173d5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156117675780611751816123a4565b91506117609050600a83612312565b9150611741565b60008167ffffffffffffffff8111156117825761178261242b565b6040519080825280601f01601f1916602001820160405280156117ac576020820181803683370190505b5090505b841561146b576117c1600183612326565b91506117ce600a866123bf565b6117d99060306122fa565b60f81b8183815181106117ee576117ee612415565b60200101906001600160f81b031916908160001a905350611810600a86612312565b94506117b0565b60006001600160a01b0384161515806118415750806001600160a01b0316836001600160a01b0316145b1561197e576001600160a01b0384166000908152600c6020526040812054905b8181101561197b576001600160a01b0386166000908152600c6020526040902080548591908390811061189657611896612415565b9060005260206000200154141561196b576001600160a01b0386166000908152600c602052604090206118ca600184612326565b815481106118da576118da612415565b9060005260206000200154600c6000886001600160a01b03166001600160a01b03168152602001908152602001600020828154811061191b5761191b612415565b60009182526020808320909101929092556001600160a01b0388168152600c90915260409020805480611950576119506123ff565b6001900381819060005260206000200160009055905561197b565b611974816123a4565b9050611861565b50505b806001600160a01b0316846001600160a01b031614806119b05750806001600160a01b0316836001600160a01b031614155b1561110257506001600160a01b03919091166000908152600c60209081526040822080546001810182559083529120015550565b6001600160a01b038216611a3a5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610685565b611a43816112d1565b15611a905760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610685565b611a9c60008383611817565b6004805460018101825560009182527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b0180546001600160a01b0319166001600160a01b0385169081179091556040518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001600160a01b0384163b15611c1a57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611b5c90339089908890889060040161215e565b602060405180830381600087803b158015611b7657600080fd5b505af1925050508015611ba6575060408051601f3d908101601f19168201909252611ba391810190611fcf565b60015b611c00573d808015611bd4576040519150601f19603f3d011682016040523d82523d6000602084013e611bd9565b606091505b508051611bf85760405162461bcd60e51b8152600401610685906121d8565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061146b565b506001949350505050565b828054611c3190612369565b90600052602060002090601f016020900481019282611c535760008555611c99565b82601f10611c6c5782800160ff19823516178555611c99565b82800160010185558215611c99579182015b82811115611c99578235825591602001919060010190611c7e565b50610a089291505b80821115610a085760008155600101611ca1565b80356001600160a01b03811681146106ac57600080fd5b60008083601f840112611cde57600080fd5b50813567ffffffffffffffff811115611cf657600080fd5b6020830191508360208260051b8501011115611d1157600080fd5b9250929050565b803580151581146106ac57600080fd5b60008083601f840112611d3a57600080fd5b50813567ffffffffffffffff811115611d5257600080fd5b602083019150836020828501011115611d1157600080fd5b600060208284031215611d7c57600080fd5b611d8582611cb5565b9392505050565b60008060408385031215611d9f57600080fd5b611da883611cb5565b9150611db660208401611cb5565b90509250929050565b600080600060608486031215611dd457600080fd5b611ddd84611cb5565b9250611deb60208501611cb5565b9150604084013590509250925092565b60008060008060808587031215611e1157600080fd5b611e1a85611cb5565b9350611e2860208601611cb5565b925060408501359150606085013567ffffffffffffffff80821115611e4c57600080fd5b818701915087601f830112611e6057600080fd5b813581811115611e7257611e7261242b565b604051601f8201601f19908116603f01168101908382118183101715611e9a57611e9a61242b565b816040528281528a6020848701011115611eb357600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b60008060408385031215611eea57600080fd5b611ef383611cb5565b9150611db660208401611d18565b60008060408385031215611f1457600080fd5b611f1d83611cb5565b946020939093013593505050565b60008060008060408587031215611f4157600080fd5b843567ffffffffffffffff80821115611f5957600080fd5b611f6588838901611ccc565b90965094506020870135915080821115611f7e57600080fd5b50611f8b87828801611ccc565b95989497509550505050565b600060208284031215611fa957600080fd5b611d8582611d18565b600060208284031215611fc457600080fd5b8135611d8581612441565b600060208284031215611fe157600080fd5b8151611d8581612441565b6000806000806040858703121561200257600080fd5b843567ffffffffffffffff8082111561201a57600080fd5b61202688838901611d28565b9096509450602087013591508082111561203f57600080fd5b50611f8b87828801611d28565b60006020828403121561205e57600080fd5b5035919050565b6000815180845261207d81602086016020860161233d565b601f01601f19169290920160200192915050565b8054600090600181811c90808316806120ab57607f831692505b60208084108214156120cd57634e487b7160e01b600052602260045260246000fd5b8180156120e157600181146120f25761211f565b60ff1986168952848901965061211f565b60008881526020902060005b868110156121175781548b8201529085019083016120fe565b505084890196505b50505050505092915050565b60006121378286612091565b845161214781836020890161233d565b61215381830186612091565b979650505050505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061219190830184612065565b9695505050505050565b602081526000611d856020830184612065565b60208082526010908201526f496e76616c69642064656c656761746560801b604082015260600190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6000821982111561230d5761230d6123d3565b500190565b600082612321576123216123e9565b500490565b600082821015612338576123386123d3565b500390565b60005b83811015612358578181015183820152602001612340565b838111156111025750506000910152565b600181811c9082168061237d57607f821691505b6020821081141561239e57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156123b8576123b86123d3565b5060010190565b6000826123ce576123ce6123e9565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610b8957600080fdfea2646970667358221220038a15899a4c34cbef7290079771f9b3d6672b53dac371aa60e00287b823870364736f6c63430008070033
Deployed Bytecode Sourcemap
40146:3644:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40303:27;;;;;;;;;;;;;;;;;;;18636:25:1;;;18624:2;18609:18;40303:27:0;;;;;;;;35362:216;;;;;;;;;;-1:-1:-1;35362:216:0;;;;;:::i;:::-;;:::i;:::-;;;8477:14:1;;8470:22;8452:41;;8440:2;8425:18;35362:216:0;8312:187:1;22932:91:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;37203:109::-;;;;;;;;;;-1:-1:-1;37203:109:0;;;;;:::i;:::-;;:::i;23640:206::-;;;;;;;;;;-1:-1:-1;23640:206:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;7775:32:1;;;7757:51;;7745:2;7730:18;23640:206:0;7611:203:1;23225:361:0;;;;;;;;;;-1:-1:-1;23225:361:0;;;;;:::i;:::-;;:::i;36272:101::-;;;;;;;;;;-1:-1:-1;36354:7:0;:14;36272:101;;40269:30;;;;;;;;;;-1:-1:-1;40269:30:0;;;;;;;;24451:297;;;;;;;;;;-1:-1:-1;24451:297:0;;;;;:::i;:::-;;:::i;42700:247::-;;;;;;;;;;-1:-1:-1;42700:247:0;;;;;:::i;:::-;;:::i;40234:29::-;;;;;;;;;;;;;;;;24807:155;;;;;;;;;;-1:-1:-1;24807:155:0;;;;;:::i;:::-;;:::i;37318:113::-;;;;;;;;;;-1:-1:-1;37318:113:0;;;;;:::i;:::-;;:::i;36438:207::-;;;;;;;;;;-1:-1:-1;36438:207:0;;;;;:::i;:::-;;:::i;22659:218::-;;;;;;;;;;-1:-1:-1;22659:218:0;;;;;:::i;:::-;;:::i;42057:169::-;;;;;;;;;;-1:-1:-1;42057:169:0;;;;;:::i;:::-;;:::i;42250:220::-;;;;;;;;;;-1:-1:-1;42250:220:0;;;;;:::i;:::-;;:::i;42486:209::-;;;;;;;;;;-1:-1:-1;42486:209:0;;;;;:::i;:::-;;:::i;33870:103::-;;;;;;;;;;;;;:::i;33219:87::-;;;;;;;;;;-1:-1:-1;33265:7:0;33292:6;-1:-1:-1;;;;;33292:6:0;33219:87;;23080:95;;;;;;;;;;;;;:::i;41189:613::-;;;;;;;;;;-1:-1:-1;41189:613:0;;;;;:::i;:::-;;:::i;40664:497::-;;;;;;:::i;:::-;;:::i;23906:274::-;;;;;;;;;;-1:-1:-1;23906:274:0;;;;;:::i;:::-;;:::i;41807:119::-;;;;;;;;;;-1:-1:-1;41807:119:0;;;;;:::i;:::-;;:::i;25021:286::-;;;;;;;;;;-1:-1:-1;25021:286:0;;;;;:::i;:::-;;:::i;42952:261::-;;;;;;;;;;-1:-1:-1;42952:261:0;;;;;:::i;:::-;;:::i;41931:121::-;;;;;;;;;;-1:-1:-1;41931:121:0;;;;;:::i;:::-;;:::i;24239:155::-;;;;;;;;;;-1:-1:-1;24239:155:0;;;;;:::i;:::-;-1:-1:-1;;;;;24354:25:0;;;24336:4;24354:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;24239:155;34128:201;;;;;;;;;;-1:-1:-1;34128:201:0;;;;;:::i;:::-;;:::i;35362:216::-;35465:4;-1:-1:-1;;;;;;35483:50:0;;-1:-1:-1;;;35483:50:0;;:90;;;35537:36;35561:11;35537:23;:36::i;:::-;35476:97;35362:216;-1:-1:-1;;35362:216:0:o;22932:91::-;22986:13;23013:5;23006:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22932:91;:::o;37203:109::-;37273:4;33292:6;;-1:-1:-1;;;;;33292:6:0;20145:10;33439:23;33431:68;;;;-1:-1:-1;;;33431:68:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;;37290:16:0;::::1;;::::0;;;:10:::1;:16;::::0;;;;;::::1;;33510:1;37203:109:::0;;;:::o;23640:206::-;23716:7;23738:16;23746:7;23738;:16::i;:::-;23730:73;;;;-1:-1:-1;;;23730:73:0;;15092:2:1;23730:73:0;;;15074:21:1;15131:2;15111:18;;;15104:30;15170:34;15150:18;;;15143:62;-1:-1:-1;;;15221:18:1;;;15214:42;15273:19;;23730:73:0;14890:408:1;23730:73:0;-1:-1:-1;23817:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;23817:24:0;;23640:206::o;23225:361::-;23300:13;23316:24;23332:7;23316:15;:24::i;:::-;23300:40;;23359:5;-1:-1:-1;;;;;23353:11:0;:2;-1:-1:-1;;;;;23353:11:0;;;23345:57;;;;-1:-1:-1;;;23345:57:0;;16692:2:1;23345:57:0;;;16674:21:1;16731:2;16711:18;;;16704:30;16770:34;16750:18;;;16743:62;-1:-1:-1;;;16821:18:1;;;16814:31;16862:19;;23345:57:0;16490:397:1;23345:57:0;20145:10;-1:-1:-1;;;;;23422:21:0;;;;:62;;-1:-1:-1;23447:37:0;23464:5;20145:10;24239:155;:::i;23447:37::-;23409:144;;;;-1:-1:-1;;;23409:144:0;;13143:2:1;23409:144:0;;;13125:21:1;13182:2;13162:18;;;13155:30;13221:34;13201:18;;;13194:62;13292:26;13272:18;;;13265:54;13336:19;;23409:144:0;12941:420:1;23409:144:0;23560:21;23569:2;23573:7;23560:8;:21::i;:::-;23295:291;23225:361;;:::o;24451:297::-;24613:41;20145:10;24646:7;24613:18;:41::i;:::-;24605:103;;;;-1:-1:-1;;;24605:103:0;;;;;;;:::i;:::-;24715:28;24725:4;24731:2;24735:7;24715:9;:28::i;42700:247::-;42797:15;42835:24;42853:5;42835:17;:24::i;:::-;42827:5;:32;42819:88;;;;-1:-1:-1;;;42819:88:0;;9275:2:1;42819:88:0;;;9257:21:1;9314:2;9294:18;;;9287:30;9353:34;9333:18;;;9326:62;-1:-1:-1;;;9404:18:1;;;9397:41;9455:19;;42819:88:0;9073:407:1;42819:88:0;-1:-1:-1;;;;;42919:16:0;;;;;;:9;:16;;;;;:23;;42936:5;;42919:23;;;;;;:::i;:::-;;;;;;;;;42912:30;;42700:247;;;;:::o;24807:155::-;24918:39;24935:4;24941:2;24945:7;24918:39;;;;;;;;;;;;:16;:39::i;37318:113::-;33265:7;33292:6;-1:-1:-1;;;;;33292:6:0;20145:10;33439:23;33431:68;;;;-1:-1:-1;;;33431:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;37395:16:0;;;::::1;;::::0;;;:10:::1;:16;::::0;;;;:30;;-1:-1:-1;;37395:30:0::1;::::0;::::1;;::::0;;;::::1;::::0;;37318:113::o;36438:207::-;36513:7;36543:31;36354:7;:14;;36272:101;36543:31;36535:5;:39;36527:96;;;;-1:-1:-1;;;36527:96:0;;17512:2:1;36527:96:0;;;17494:21:1;17551:2;17531:18;;;17524:30;17590:34;17570:18;;;17563:62;-1:-1:-1;;;17641:18:1;;;17634:42;17693:19;;36527:96:0;17310:408:1;36527:96:0;-1:-1:-1;36635:5:0;36438:207::o;22659:218::-;22731:7;22745:13;22761:7;22769;22761:16;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;22761:16:0;;-1:-1:-1;22790:19:0;22782:73;;;;-1:-1:-1;;;22782:73:0;;13979:2:1;22782:73:0;;;13961:21:1;14018:2;13998:18;;;13991:30;14057:34;14037:18;;;14030:62;-1:-1:-1;;;14108:18:1;;;14101:39;14157:19;;22782:73:0;13777:405:1;42057:169:0;37138:10;37127:22;;;;:10;:22;;;;;;;;37119:52;;;;-1:-1:-1;;;37119:52:0;;;;;;;:::i;:::-;42161:27:::1;:13;42177:11:::0;;42161:27:::1;:::i;:::-;-1:-1:-1::0;42193:28:0::1;:15;42211:10:::0;;42193:28:::1;:::i;:::-;;42057:169:::0;;;;:::o;42250:220::-;33265:7;33292:6;-1:-1:-1;;;;;33292:6:0;20145:10;33439:23;33431:68;;;;-1:-1:-1;;;33431:68:0;;;;;;;:::i;:::-;42329:9:::1;42315:10;;:23;42311:155;;36354:7:::0;:14;42354:9:::1;:26;;42346:86;;;::::0;-1:-1:-1;;;42346:86:0;;10870:2:1;42346:86:0::1;::::0;::::1;10852:21:1::0;10909:2;10889:18;;;10882:30;10948:34;10928:18;;;10921:62;-1:-1:-1;;;10999:18:1;;;10992:44;11053:19;;42346:86:0::1;10668:410:1::0;42346:86:0::1;42438:10;:22:::0;;;42311:155:::1;42250:220:::0;:::o;42486:209::-;42567:7;-1:-1:-1;;;;;42589:19:0;;42581:74;;;;-1:-1:-1;;;42581:74:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;42667:16:0;;;;;:9;:16;;;;;:23;;42486:209::o;33870:103::-;33265:7;33292:6;-1:-1:-1;;;;;33292:6:0;20145:10;33439:23;33431:68;;;;-1:-1:-1;;;33431:68:0;;;;;;;:::i;:::-;33935:30:::1;33962:1;33935:18;:30::i;:::-;33870:103::o:0;23080:95::-;23136:13;23163:7;23156:14;;;;;:::i;41189:613::-;37138:10;37127:22;;;;:10;:22;;;;;;;;37119:52;;;;-1:-1:-1;;;37119:52:0;;;;;;;:::i;:::-;41294:35;;::::1;41286:93;;;::::0;-1:-1:-1;;;41286:93:0;;17925:2:1;41286:93:0::1;::::0;::::1;17907:21:1::0;17964:2;17944:18;;;17937:30;18003:34;17983:18;;;17976:62;-1:-1:-1;;;18054:18:1;;;18047:42;18106:19;;41286:93:0::1;17723:408:1::0;41286:93:0::1;41386:18;41413:14:::0;41430:13:::1;36354:7:::0;:14;;36272:101;41430:13:::1;41413:30;;41452:6;41448:81;41464:19:::0;;::::1;41448:81;;;41512:8;;41521:1;41512:11;;;;;;;:::i;:::-;;;;;;;41495:28;;;;;:::i;:::-;::::0;-1:-1:-1;41485:3:0::1;::::0;::::1;:::i;:::-;;;41448:81;;;-1:-1:-1::0;41568:10:0::1;::::0;41542:22:::1;41551:13:::0;41542:6;:22:::1;:::i;:::-;:36;;41533:76;;;::::0;-1:-1:-1;;;41533:76:0;;18338:2:1;41533:76:0::1;::::0;::::1;18320:21:1::0;18377:2;18357:18;;;18350:30;-1:-1:-1;;;18396:18:1;;;18389:55;18461:18;;41533:76:0::1;18136:349:1::0;41533:76:0::1;41614:20;;;41645:6;41641:157;41657:20:::0;;::::1;41641:157;;;41693:6;41689:104;41709:8;;41718:1;41709:11;;;;;;;:::i;:::-;;;;;;;41705:1;:15;41689:104;;;41733:53;41744:9;;41754:1;41744:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;41758:8:::0;::::1;::::0;::::1;:::i;:::-;;;41733:53;;;;;;;;;;;;;-1:-1:-1::0;;;41733:53:0::1;;::::0;:9:::1;:53::i;:::-;41722:3;::::0;::::1;:::i;:::-;;;41689:104;;;-1:-1:-1::0;41679:3:0::1;::::0;::::1;:::i;:::-;;;41641:157;;;;41281:521;;41189:613:::0;;;;:::o;40664:497::-;40726:8;;;;40717:53;;;;-1:-1:-1;;;40717:53:0;;12044:2:1;40717:53:0;;;12026:21:1;12083:2;12063:18;;;12056:30;-1:-1:-1;;;12102:18:1;;;12095:48;12160:18;;40717:53:0;11842:342:1;40717:53:0;40796:8;;40784;:20;;40775:69;;;;-1:-1:-1;;;40775:69:0;;14389:2:1;40775:69:0;;;14371:21:1;14428:2;14408:18;;;14401:30;-1:-1:-1;;;14447:18:1;;;14440:43;14500:18;;40775:69:0;14187:337:1;40775:69:0;40892:8;;40866:10;40858:19;;;;:7;:19;;;;;;:30;;40880:8;;40858:30;:::i;:::-;:42;;40849:67;;;;-1:-1:-1;;;40849:67:0;;12804:2:1;40849:67:0;;;12786:21:1;12843:2;12823:18;;;12816:30;-1:-1:-1;;;12862:18:1;;;12855:40;12912:18;;40849:67:0;12602:334:1;40849:67:0;40923:14;40940:13;36354:7;:14;;36272:101;40940:13;40988:10;;40923:30;;-1:-1:-1;40967:17:0;40976:8;40923:30;40967:17;:::i;:::-;:31;;40958:71;;;;-1:-1:-1;;;40958:71:0;;18338:2:1;40958:71:0;;;18320:21:1;18377:2;18357:18;;;18350:30;-1:-1:-1;;;18396:18:1;;;18389:55;18461:18;;40958:71:0;18136:349:1;40958:71:0;41044:10;41036:19;;;;:7;:19;;;;;:31;;41059:8;;41036:19;:31;;41059:8;;41036:31;:::i;:::-;;;;-1:-1:-1;41078:6:0;;-1:-1:-1;41074:83:0;41094:8;41090:1;:12;41074:83;;;41114:37;41125:10;41137:8;;;;:::i;:::-;;;41114:37;;;;;;;;;;;;:9;:37::i;:::-;41104:3;;;:::i;:::-;;;41074:83;;23906:274;-1:-1:-1;;;;;24003:24:0;;20145:10;24003:24;;23995:62;;;;-1:-1:-1;;;23995:62:0;;11690:2:1;23995:62:0;;;11672:21:1;11729:2;11709:18;;;11702:30;11768:27;11748:18;;;11741:55;11813:18;;23995:62:0;11488:349:1;23995:62:0;20145:10;24064:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;24064:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;24064:53:0;;;;;;;;;;24127:48;;8452:41:1;;;24064:42:0;;20145:10;24127:48;;8425:18:1;24127:48:0;;;;;;;23906:274;;:::o;41807:119::-;37138:10;37127:22;;;;:10;:22;;;;;;;;37119:52;;;;-1:-1:-1;;;37119:52:0;;;;;;;:::i;:::-;41873:8:::1;::::0;::::1;;:21;;::::0;::::1;;;41869:52;;41901:8;:20:::0;;;::::1;;-1:-1:-1::0;;41901:20:0;;::::1;;::::0;;41807:119;:::o;25021:286::-;25163:41;20145:10;25196:7;25163:18;:41::i;:::-;25155:103;;;;-1:-1:-1;;;25155:103:0;;;;;;;:::i;:::-;25263:39;25277:4;25283:2;25287:7;25296:5;25263:13;:39::i;:::-;25021:286;;;;:::o;42952:261::-;43024:13;43052:16;43060:7;43052;:16::i;:::-;43044:76;;;;-1:-1:-1;;;43044:76:0;;16276:2:1;43044:76:0;;;16258:21:1;16315:2;16295:18;;;16288:30;16354:34;16334:18;;;16327:62;-1:-1:-1;;;16405:18:1;;;16398:45;16460:19;;43044:76:0;16074:411:1;43044:76:0;43156:13;43171:18;:7;:16;:18::i;:::-;43191:15;43139:68;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;43125:83;;42952:261;;;:::o;41931:121::-;37138:10;37127:22;;;;:10;:22;;;;;;;;37119:52;;;;-1:-1:-1;;;37119:52:0;;;;;;;:::i;:::-;42011:9:::1;41999:8;;:21;41995:52;;42027:8;:20:::0;41931:121::o;34128:201::-;33265:7;33292:6;-1:-1:-1;;;;;33292:6:0;20145:10;33439:23;33431:68;;;;-1:-1:-1;;;33431:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;34217:22:0;::::1;34209:73;;;::::0;-1:-1:-1;;;34209:73:0;;10106:2:1;34209:73:0::1;::::0;::::1;10088:21:1::0;10145:2;10125:18;;;10118:30;10184:34;10164:18;;;10157:62;-1:-1:-1;;;10235:18:1;;;10228:36;10281:19;;34209:73:0::1;9904:402:1::0;34209:73:0::1;34293:28;34312:8;34293:18;:28::i;21936:269::-:0;22038:4;-1:-1:-1;;;;;;22060:40:0;;-1:-1:-1;;;22060:40:0;;:96;;-1:-1:-1;;;;;;;22108:48:0;;-1:-1:-1;;;22108:48:0;22060:96;:140;;;-1:-1:-1;;;;;;;;;;19289:40:0;;;22164:36;19180:157;26691:146;26784:7;:14;26756:4;;26774:24;;:58;;;;;26830:1;-1:-1:-1;;;;;26802:30:0;:7;26810;26802:16;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;26802:16:0;:30;;26767:65;26691:146;-1:-1:-1;;26691:146:0:o;30145:160::-;30214:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;30214:29:0;-1:-1:-1;;;;;30214:29:0;;;;;;;;:24;;30262;30214;30262:15;:24::i;:::-;-1:-1:-1;;;;;30253:47:0;;;;;;;;;;;30145:160;;:::o;26980:328::-;27073:4;27092:16;27100:7;27092;:16::i;:::-;27084:73;;;;-1:-1:-1;;;27084:73:0;;12391:2:1;27084:73:0;;;12373:21:1;12430:2;12410:18;;;12403:30;12469:34;12449:18;;;12442:62;-1:-1:-1;;;12520:18:1;;;12513:42;12572:19;;27084:73:0;12189:408:1;27084:73:0;27162:13;27178:24;27194:7;27178:15;:24::i;:::-;27162:40;;27226:5;-1:-1:-1;;;;;27215:16:0;:7;-1:-1:-1;;;;;27215:16:0;;:51;;;;27259:7;-1:-1:-1;;;;;27235:31:0;:20;27247:7;27235:11;:20::i;:::-;-1:-1:-1;;;;;27235:31:0;;27215:51;:87;;;-1:-1:-1;;;;;;24354:25:0;;;24336:4;24354:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;27270:32;27207:96;26980:328;-1:-1:-1;;;;26980:328:0:o;29594:451::-;29727:4;-1:-1:-1;;;;;29699:32:0;:24;29715:7;29699:15;:24::i;:::-;-1:-1:-1;;;;;29699:32:0;;29691:86;;;;-1:-1:-1;;;29691:86:0;;15866:2:1;29691:86:0;;;15848:21:1;15905:2;15885:18;;;15878:30;15944:34;15924:18;;;15917:62;-1:-1:-1;;;15995:18:1;;;15988:39;16044:19;;29691:86:0;15664:405:1;29691:86:0;-1:-1:-1;;;;;29790:16:0;;29782:65;;;;-1:-1:-1;;;29782:65:0;;11285:2:1;29782:65:0;;;11267:21:1;11324:2;11304:18;;;11297:30;11363:34;11343:18;;;11336:62;-1:-1:-1;;;11414:18:1;;;11407:34;11458:19;;29782:65:0;11083:400:1;29782:65:0;29854:39;29875:4;29881:2;29885:7;29854:20;:39::i;:::-;29946:29;29963:1;29967:7;29946:8;:29::i;:::-;29999:2;29980:7;29988;29980:16;;;;;;;;:::i;:::-;;;;;;;;;:21;;-1:-1:-1;;;;;;29980:21:0;-1:-1:-1;;;;;29980:21:0;;;;;;30013:27;;30032:7;;30013:27;;;;;;;;;;29980:16;30013:27;29594:451;;;:::o;22257:352::-;22329:7;-1:-1:-1;;;;;22351:19:0;;22343:74;;;;-1:-1:-1;;;22343:74:0;;;;;;;:::i;:::-;22457:7;:14;22424:10;;;22476:92;22497:6;22493:1;:10;22476:92;;;22530:7;22538:1;22530:10;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;22521:19:0;;;22530:10;;22521:19;22517:46;;;22548:7;;;:::i;:::-;;;22517:46;22505:3;;;:::i;:::-;;;22476:92;;;-1:-1:-1;22599:5:0;;22257:352;-1:-1:-1;;;22257:352:0:o;34489:191::-;34563:16;34582:6;;-1:-1:-1;;;;;34599:17:0;;;-1:-1:-1;;;;;;34599:17:0;;;;;;34632:40;;34582:6;;;;;;;34632:40;;34563:16;34632:40;34552:128;34489:191;:::o;27932:261::-;28035:18;28041:2;28045:7;28035:5;:18::i;:::-;28071:54;28102:1;28106:2;28110:7;28119:5;28071:22;:54::i;:::-;28058:130;;;;-1:-1:-1;;;28058:130:0;;;;;;;:::i;26132:273::-;26256:28;26266:4;26272:2;26276:7;26256:9;:28::i;:::-;26297:48;26320:4;26326:2;26330:7;26339:5;26297:22;:48::i;:::-;26289:111;;;;-1:-1:-1;;;26289:111:0;;;;;;;:::i;37843:723::-;37899:13;38120:10;38116:53;;-1:-1:-1;;38147:10:0;;;;;;;;;;;;-1:-1:-1;;;38147:10:0;;;;;37843:723::o;38116:53::-;38194:5;38179:12;38235:78;38242:9;;38235:78;;38268:8;;;;:::i;:::-;;-1:-1:-1;38291:10:0;;-1:-1:-1;38299:2:0;38291:10;;:::i;:::-;;;38235:78;;;38323:19;38355:6;38345:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38345:17:0;;38323:39;;38373:154;38380:10;;38373:154;;38407:11;38417:1;38407:11;;:::i;:::-;;-1:-1:-1;38476:10:0;38484:2;38476:5;:10;:::i;:::-;38463:24;;:2;:24;:::i;:::-;38450:39;;38433:6;38440;38433:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;38433:56:0;;;;;;;;-1:-1:-1;38504:11:0;38513:2;38504:11;;:::i;:::-;;;38373:154;;43231:556;43348:12;-1:-1:-1;;;;;43382:12:0;;;;;:26;;;43404:4;-1:-1:-1;;;;;43398:10:0;:2;-1:-1:-1;;;;;43398:10:0;;43382:26;43378:326;;;-1:-1:-1;;;;;43466:15:0;;43452:11;43466:15;;;:9;:15;;;;;:22;;43494:184;43511:6;43507:1;:10;43494:184;;;-1:-1:-1;;;;;43535:15:0;;;;;;:9;:15;;;;;:18;;43557:7;;43535:15;43551:1;;43535:18;;;;;;:::i;:::-;;;;;;;;;:29;43531:141;;;-1:-1:-1;;;;;43595:15:0;;;;;;:9;:15;;;;;43611:10;43620:1;43611:6;:10;:::i;:::-;43595:27;;;;;;;;:::i;:::-;;;;;;;;;43574:9;:15;43584:4;-1:-1:-1;;;;;43574:15:0;-1:-1:-1;;;;;43574:15:0;;;;;;;;;;;;43590:1;43574:18;;;;;;;;:::i;:::-;;;;;;;;;;;;:48;;;;-1:-1:-1;;;;;43630:15:0;;;;:9;:15;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;43659:5;;43531:141;43519:3;;;:::i;:::-;;;43494:184;;;-1:-1:-1;;43378:326:0;43722:4;-1:-1:-1;;;;;43714:12:0;:4;-1:-1:-1;;;;;43714:12:0;;:26;;;;43736:4;-1:-1:-1;;;;;43730:10:0;:2;-1:-1:-1;;;;;43730:10:0;;;43714:26;43710:73;;;-1:-1:-1;;;;;;43748:13:0;;;;;;;;:9;:13;;;;;;;:29;;;;;;;;;;;;;;-1:-1:-1;43231:556:0:o;28490:313::-;-1:-1:-1;;;;;28564:16:0;;28556:61;;;;-1:-1:-1;;;28556:61:0;;14731:2:1;28556:61:0;;;14713:21:1;;;14750:18;;;14743:30;14809:34;14789:18;;;14782:62;14861:18;;28556:61:0;14529:356:1;28556:61:0;28631:16;28639:7;28631;:16::i;:::-;28630:17;28622:58;;;;-1:-1:-1;;;28622:58:0;;10513:2:1;28622:58:0;;;10495:21:1;10552:2;10532:18;;;10525:30;10591;10571:18;;;10564:58;10639:18;;28622:58:0;10311:352:1;28622:58:0;28687:45;28716:1;28720:2;28724:7;28687:20;:45::i;:::-;28737:7;:16;;;;;;;-1:-1:-1;28737:16:0;;;;;;;-1:-1:-1;;;;;;28737:16:0;-1:-1:-1;;;;;28737:16:0;;;;;;;;28765:33;;28790:7;;-1:-1:-1;28765:33:0;;-1:-1:-1;;28765:33:0;28490:313;;:::o;30839:604::-;30967:4;-1:-1:-1;;;;;30982:13:0;;10789:19;:23;30978:461;;31009:72;;-1:-1:-1;;;31009:72:0;;-1:-1:-1;;;;;31009:36:0;;;;;:72;;20145:10;;31060:4;;31066:7;;31075:5;;31009:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31009:72:0;;;;;;;;-1:-1:-1;;31009:72:0;;;;;;;;;;;;:::i;:::-;;;31005:400;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31218:13:0;;31214:185;;31246:60;;-1:-1:-1;;;31246:60:0;;;;;;;:::i;31214:185::-;31376:6;31370:13;31361:6;31357:2;31353:15;31346:38;31005:400;-1:-1:-1;;;;;;31120:51:0;-1:-1:-1;;;31120:51:0;;-1:-1:-1;31113:58:0;;30978:461;-1:-1:-1;31429:4:0;30839:604;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:173:1;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;192:367;255:8;265:6;319:3;312:4;304:6;300:17;296:27;286:55;;337:1;334;327:12;286:55;-1:-1:-1;360:20:1;;403:18;392:30;;389:50;;;435:1;432;425:12;389:50;472:4;464:6;460:17;448:29;;532:3;525:4;515:6;512:1;508:14;500:6;496:27;492:38;489:47;486:67;;;549:1;546;539:12;486:67;192:367;;;;;:::o;564:160::-;629:20;;685:13;;678:21;668:32;;658:60;;714:1;711;704:12;729:348;781:8;791:6;845:3;838:4;830:6;826:17;822:27;812:55;;863:1;860;853:12;812:55;-1:-1:-1;886:20:1;;929:18;918:30;;915:50;;;961:1;958;951:12;915:50;998:4;990:6;986:17;974:29;;1050:3;1043:4;1034:6;1026;1022:19;1018:30;1015:39;1012:59;;;1067:1;1064;1057:12;1082:186;1141:6;1194:2;1182:9;1173:7;1169:23;1165:32;1162:52;;;1210:1;1207;1200:12;1162:52;1233:29;1252:9;1233:29;:::i;:::-;1223:39;1082:186;-1:-1:-1;;;1082:186:1:o;1273:260::-;1341:6;1349;1402:2;1390:9;1381:7;1377:23;1373:32;1370:52;;;1418:1;1415;1408:12;1370:52;1441:29;1460:9;1441:29;:::i;:::-;1431:39;;1489:38;1523:2;1512:9;1508:18;1489:38;:::i;:::-;1479:48;;1273:260;;;;;:::o;1538:328::-;1615:6;1623;1631;1684:2;1672:9;1663:7;1659:23;1655:32;1652:52;;;1700:1;1697;1690:12;1652:52;1723:29;1742:9;1723:29;:::i;:::-;1713:39;;1771:38;1805:2;1794:9;1790:18;1771:38;:::i;:::-;1761:48;;1856:2;1845:9;1841:18;1828:32;1818:42;;1538:328;;;;;:::o;1871:1138::-;1966:6;1974;1982;1990;2043:3;2031:9;2022:7;2018:23;2014:33;2011:53;;;2060:1;2057;2050:12;2011:53;2083:29;2102:9;2083:29;:::i;:::-;2073:39;;2131:38;2165:2;2154:9;2150:18;2131:38;:::i;:::-;2121:48;;2216:2;2205:9;2201:18;2188:32;2178:42;;2271:2;2260:9;2256:18;2243:32;2294:18;2335:2;2327:6;2324:14;2321:34;;;2351:1;2348;2341:12;2321:34;2389:6;2378:9;2374:22;2364:32;;2434:7;2427:4;2423:2;2419:13;2415:27;2405:55;;2456:1;2453;2446:12;2405:55;2492:2;2479:16;2514:2;2510;2507:10;2504:36;;;2520:18;;:::i;:::-;2595:2;2589:9;2563:2;2649:13;;-1:-1:-1;;2645:22:1;;;2669:2;2641:31;2637:40;2625:53;;;2693:18;;;2713:22;;;2690:46;2687:72;;;2739:18;;:::i;:::-;2779:10;2775:2;2768:22;2814:2;2806:6;2799:18;2854:7;2849:2;2844;2840;2836:11;2832:20;2829:33;2826:53;;;2875:1;2872;2865:12;2826:53;2931:2;2926;2922;2918:11;2913:2;2905:6;2901:15;2888:46;2976:1;2971:2;2966;2958:6;2954:15;2950:24;2943:35;2997:6;2987:16;;;;;;;1871:1138;;;;;;;:::o;3014:254::-;3079:6;3087;3140:2;3128:9;3119:7;3115:23;3111:32;3108:52;;;3156:1;3153;3146:12;3108:52;3179:29;3198:9;3179:29;:::i;:::-;3169:39;;3227:35;3258:2;3247:9;3243:18;3227:35;:::i;3273:254::-;3341:6;3349;3402:2;3390:9;3381:7;3377:23;3373:32;3370:52;;;3418:1;3415;3408:12;3370:52;3441:29;3460:9;3441:29;:::i;:::-;3431:39;3517:2;3502:18;;;;3489:32;;-1:-1:-1;;;3273:254:1:o;3532:773::-;3654:6;3662;3670;3678;3731:2;3719:9;3710:7;3706:23;3702:32;3699:52;;;3747:1;3744;3737:12;3699:52;3787:9;3774:23;3816:18;3857:2;3849:6;3846:14;3843:34;;;3873:1;3870;3863:12;3843:34;3912:70;3974:7;3965:6;3954:9;3950:22;3912:70;:::i;:::-;4001:8;;-1:-1:-1;3886:96:1;-1:-1:-1;4089:2:1;4074:18;;4061:32;;-1:-1:-1;4105:16:1;;;4102:36;;;4134:1;4131;4124:12;4102:36;;4173:72;4237:7;4226:8;4215:9;4211:24;4173:72;:::i;:::-;3532:773;;;;-1:-1:-1;4264:8:1;-1:-1:-1;;;;3532:773:1:o;4310:180::-;4366:6;4419:2;4407:9;4398:7;4394:23;4390:32;4387:52;;;4435:1;4432;4425:12;4387:52;4458:26;4474:9;4458:26;:::i;4495:245::-;4553:6;4606:2;4594:9;4585:7;4581:23;4577:32;4574:52;;;4622:1;4619;4612:12;4574:52;4661:9;4648:23;4680:30;4704:5;4680:30;:::i;4745:249::-;4814:6;4867:2;4855:9;4846:7;4842:23;4838:32;4835:52;;;4883:1;4880;4873:12;4835:52;4915:9;4909:16;4934:30;4958:5;4934:30;:::i;4999:721::-;5091:6;5099;5107;5115;5168:2;5156:9;5147:7;5143:23;5139:32;5136:52;;;5184:1;5181;5174:12;5136:52;5224:9;5211:23;5253:18;5294:2;5286:6;5283:14;5280:34;;;5310:1;5307;5300:12;5280:34;5349:59;5400:7;5391:6;5380:9;5376:22;5349:59;:::i;:::-;5427:8;;-1:-1:-1;5323:85:1;-1:-1:-1;5515:2:1;5500:18;;5487:32;;-1:-1:-1;5531:16:1;;;5528:36;;;5560:1;5557;5550:12;5528:36;;5599:61;5652:7;5641:8;5630:9;5626:24;5599:61;:::i;5725:180::-;5784:6;5837:2;5825:9;5816:7;5812:23;5808:32;5805:52;;;5853:1;5850;5843:12;5805:52;-1:-1:-1;5876:23:1;;5725:180;-1:-1:-1;5725:180:1:o;5910:257::-;5951:3;5989:5;5983:12;6016:6;6011:3;6004:19;6032:63;6088:6;6081:4;6076:3;6072:14;6065:4;6058:5;6054:16;6032:63;:::i;:::-;6149:2;6128:15;-1:-1:-1;;6124:29:1;6115:39;;;;6156:4;6111:50;;5910:257;-1:-1:-1;;5910:257:1:o;6172:973::-;6257:12;;6222:3;;6312:1;6332:18;;;;6385;;;;6412:61;;6466:4;6458:6;6454:17;6444:27;;6412:61;6492:2;6540;6532:6;6529:14;6509:18;6506:38;6503:161;;;6586:10;6581:3;6577:20;6574:1;6567:31;6621:4;6618:1;6611:15;6649:4;6646:1;6639:15;6503:161;6680:18;6707:104;;;;6825:1;6820:319;;;;6673:466;;6707:104;-1:-1:-1;;6740:24:1;;6728:37;;6785:16;;;;-1:-1:-1;6707:104:1;;6820:319;18745:1;18738:14;;;18782:4;18769:18;;6914:1;6928:165;6942:6;6939:1;6936:13;6928:165;;;7020:14;;7007:11;;;7000:35;7063:16;;;;6957:10;;6928:165;;;6932:3;;7122:6;7117:3;7113:16;7106:23;;6673:466;;;;;;;6172:973;;;;:::o;7150:456::-;7371:3;7399:38;7433:3;7425:6;7399:38;:::i;:::-;7466:6;7460:13;7482:52;7527:6;7523:2;7516:4;7508:6;7504:17;7482:52;:::i;:::-;7550:50;7592:6;7588:2;7584:15;7576:6;7550:50;:::i;:::-;7543:57;7150:456;-1:-1:-1;;;;;;;7150:456:1:o;7819:488::-;-1:-1:-1;;;;;8088:15:1;;;8070:34;;8140:15;;8135:2;8120:18;;8113:43;8187:2;8172:18;;8165:34;;;8235:3;8230:2;8215:18;;8208:31;;;8013:4;;8256:45;;8281:19;;8273:6;8256:45;:::i;:::-;8248:53;7819:488;-1:-1:-1;;;;;;7819:488:1:o;8504:219::-;8653:2;8642:9;8635:21;8616:4;8673:44;8713:2;8702:9;8698:18;8690:6;8673:44;:::i;8728:340::-;8930:2;8912:21;;;8969:2;8949:18;;;8942:30;-1:-1:-1;;;9003:2:1;8988:18;;8981:46;9059:2;9044:18;;8728:340::o;9485:414::-;9687:2;9669:21;;;9726:2;9706:18;;;9699:30;9765:34;9760:2;9745:18;;9738:62;-1:-1:-1;;;9831:2:1;9816:18;;9809:48;9889:3;9874:19;;9485:414::o;13366:406::-;13568:2;13550:21;;;13607:2;13587:18;;;13580:30;13646:34;13641:2;13626:18;;13619:62;-1:-1:-1;;;13712:2:1;13697:18;;13690:40;13762:3;13747:19;;13366:406::o;15303:356::-;15505:2;15487:21;;;15524:18;;;15517:30;15583:34;15578:2;15563:18;;15556:62;15650:2;15635:18;;15303:356::o;16892:413::-;17094:2;17076:21;;;17133:2;17113:18;;;17106:30;17172:34;17167:2;17152:18;;17145:62;-1:-1:-1;;;17238:2:1;17223:18;;17216:47;17295:3;17280:19;;16892:413::o;18798:128::-;18838:3;18869:1;18865:6;18862:1;18859:13;18856:39;;;18875:18;;:::i;:::-;-1:-1:-1;18911:9:1;;18798:128::o;18931:120::-;18971:1;18997;18987:35;;19002:18;;:::i;:::-;-1:-1:-1;19036:9:1;;18931:120::o;19056:125::-;19096:4;19124:1;19121;19118:8;19115:34;;;19129:18;;:::i;:::-;-1:-1:-1;19166:9:1;;19056:125::o;19186:258::-;19258:1;19268:113;19282:6;19279:1;19276:13;19268:113;;;19358:11;;;19352:18;19339:11;;;19332:39;19304:2;19297:10;19268:113;;;19399:6;19396:1;19393:13;19390:48;;;-1:-1:-1;;19434:1:1;19416:16;;19409:27;19186:258::o;19449:380::-;19528:1;19524:12;;;;19571;;;19592:61;;19646:4;19638:6;19634:17;19624:27;;19592:61;19699:2;19691:6;19688:14;19668:18;19665:38;19662:161;;;19745:10;19740:3;19736:20;19733:1;19726:31;19780:4;19777:1;19770:15;19808:4;19805:1;19798:15;19662:161;;19449:380;;;:::o;19834:135::-;19873:3;-1:-1:-1;;19894:17:1;;19891:43;;;19914:18;;:::i;:::-;-1:-1:-1;19961:1:1;19950:13;;19834:135::o;19974:112::-;20006:1;20032;20022:35;;20037:18;;:::i;:::-;-1:-1:-1;20071:9:1;;19974:112::o;20091:127::-;20152:10;20147:3;20143:20;20140:1;20133:31;20183:4;20180:1;20173:15;20207:4;20204:1;20197:15;20223:127;20284:10;20279:3;20275:20;20272:1;20265:31;20315:4;20312:1;20305:15;20339:4;20336:1;20329:15;20355:127;20416:10;20411:3;20407:20;20404:1;20397:31;20447:4;20444:1;20437:15;20471:4;20468:1;20461:15;20487:127;20548:10;20543:3;20539:20;20536:1;20529:31;20579:4;20576:1;20569:15;20603:4;20600:1;20593:15;20619:127;20680:10;20675:3;20671:20;20668:1;20661:31;20711:4;20708:1;20701:15;20735:4;20732:1;20725:15;20751:131;-1:-1:-1;;;;;;20825:32:1;;20815:43;;20805:71;;20872:1;20869;20862:12
Swarm Source
ipfs://038a15899a4c34cbef7290079771f9b3d6672b53dac371aa60e00287b8238703
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.