ERC-721
Overview
Max Total Supply
836 AiDoodlesArt
Holders
422
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
2 AiDoodlesArtLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
AiDoodlesArt
Compiler Version
v0.8.14+commit.80d49f37
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-07-09 */ /** *Submitted for verification at Etherscan.io on 2022-07-02 */ // SPDX-License-Identifier: MIT // File: @openzeppelin/contracts/utils/Counters.sol // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.7.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 /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts (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); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * 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 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); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: address zero is not a valid owner"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: invalid token ID"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { _requireMinted(tokenId); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not token owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { _requireMinted(tokenId); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token 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: caller is not token owner nor approved"); _safeTransfer(from, to, tokenId, data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { address owner = ERC721.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits an {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits an {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Reverts if the `tokenId` has not been minted yet. */ function _requireMinted(uint256 tokenId) internal view virtual { require(_exists(tokenId), "ERC721: invalid token ID"); } /** * @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 { /// @solidity memory-safe-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // File: contracts/LowGas.sol pragma solidity >=0.7.0 <0.9.0; contract AiDoodlesArt is ERC721, Ownable { using Strings for uint256; using Counters for Counters.Counter; Counters.Counter private supply; string public uriPrefix = ""; string public uriSuffix = ".json"; string public hiddenMetadataUri; uint256 public cost = 0.0049 ether; uint256 public maxSupply = 10000; uint256 public freeSupplyLeft = 1000; uint256 public maxPaidMintAmountPerTx = 10; uint256 public maxFreeMintAmountPerTx = 3; uint256 public paidMintPerWallet = 20; uint256 public freeMintPerWallet = 3; mapping(address => uint256) public mintedList; mapping(address => uint256) public freeMintedList; bool public paused = false; bool public revealed = false; constructor() ERC721("Ai Doodles Art", "AiDoodlesArt") { setHiddenMetadataUri("ipfs://QmQ61RCgzuZ7FreoyzBu5yAdAYQAsWmTsTkXgQJJcsKHcR/hidden.json"); } function totalSupply() public view returns (uint256) { return supply.current(); } function mint(uint256 _mintAmount) public payable { require(!paused, "The contract is paused!"); if (msg.value > 0) { require(msg.value >= cost * _mintAmount, "Insufficient funds!"); require(supply.current() + _mintAmount <= maxSupply, "Max supply exceeded!"); require(_mintAmount <= maxPaidMintAmountPerTx, "Max 10 NFTs per transaction"); require(mintedList[msg.sender] + _mintAmount <= paidMintPerWallet, "Max NFTs per wallet"); mintedList[msg.sender] += _mintAmount; _mintLoop(msg.sender, _mintAmount); } else { require(supply.current() + _mintAmount <= maxSupply, "Max supply exceeded!"); require(freeSupplyLeft - _mintAmount >= 0, "Reached free mint supply"); require(freeMintedList[msg.sender] + _mintAmount <= freeMintPerWallet, "Max free NFTs per wallet"); freeMintedList[msg.sender] += _mintAmount; freeSupplyLeft = freeSupplyLeft - _mintAmount; _mintLoop(msg.sender, _mintAmount); } } function mintForAddress(uint256 _mintAmount, address _receiver) public onlyOwner { _mintLoop(_receiver, _mintAmount); } function walletOfOwner(address _owner) public view returns (uint256[] memory) { uint256 ownerTokenCount = balanceOf(_owner); uint256[] memory ownedTokenIds = new uint256[](ownerTokenCount); uint256 currentTokenId = 1; uint256 ownedTokenIndex = 0; while (ownedTokenIndex < ownerTokenCount && currentTokenId <= maxSupply) { address currentTokenOwner = ownerOf(currentTokenId); if (currentTokenOwner == _owner) { ownedTokenIds[ownedTokenIndex] = currentTokenId; ownedTokenIndex++; } currentTokenId++; } return ownedTokenIds; } function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) { require( _exists(_tokenId), "ERC721Metadata: URI query for nonexistent token" ); if (revealed == false) { return hiddenMetadataUri; } string memory currentBaseURI = _baseURI(); return bytes(currentBaseURI).length > 0 ? string(abi.encodePacked(currentBaseURI, _tokenId.toString(), uriSuffix)) : ""; } function setRevealed(bool _state) public onlyOwner { revealed = _state; } function setPaidMintPerWallet(uint256 _paidMintPerWallet) public onlyOwner { paidMintPerWallet = _paidMintPerWallet; } function setFreeMintPerWallet(uint256 _freeMintPerWallet) public onlyOwner { freeMintPerWallet = _freeMintPerWallet; } function setMaxPaidMintAmountPerTx(uint256 _maxPaidMintAmountPerTx) public onlyOwner { maxPaidMintAmountPerTx = _maxPaidMintAmountPerTx; } function setMaxFreeMintAmountPerTx(uint256 _maxFreeMintAmountPerTx) public onlyOwner { maxFreeMintAmountPerTx = _maxFreeMintAmountPerTx; } function setCost(uint256 _cost) public onlyOwner { cost = _cost; } function setfreeSupplyLeft(uint256 _freeSupplyLeft) public onlyOwner { freeSupplyLeft = _freeSupplyLeft; } function setHiddenMetadataUri(string memory _hiddenMetadataUri) public onlyOwner { hiddenMetadataUri = _hiddenMetadataUri; } function setUriPrefix(string memory _uriPrefix) public onlyOwner { uriPrefix = _uriPrefix; } function setUriSuffix(string memory _uriSuffix) public onlyOwner { uriSuffix = _uriSuffix; } function setPaused(bool _state) public onlyOwner { paused = _state; } function withdraw() public onlyOwner { (bool os, ) = payable(owner()).call{value: address(this).balance}(""); require(os); } function _mintLoop(address _receiver, uint256 _mintAmount) internal { for (uint256 i = 0; i < _mintAmount; i++) { supply.increment(); _safeMint(_receiver, supply.current()); } } function _baseURI() internal view virtual override returns (string memory) { return uriPrefix; } }
Contract Security Audit
- 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"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freeMintPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"freeMintedList","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freeSupplyLeft","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hiddenMetadataUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxFreeMintAmountPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPaidMintAmountPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"mintForAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintedList","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":"paidMintPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_freeMintPerWallet","type":"uint256"}],"name":"setFreeMintPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_hiddenMetadataUri","type":"string"}],"name":"setHiddenMetadataUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxFreeMintAmountPerTx","type":"uint256"}],"name":"setMaxFreeMintAmountPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxPaidMintAmountPerTx","type":"uint256"}],"name":"setMaxPaidMintAmountPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_paidMintPerWallet","type":"uint256"}],"name":"setPaidMintPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"setUriPrefix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriSuffix","type":"string"}],"name":"setUriSuffix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_freeSupplyLeft","type":"uint256"}],"name":"setfreeSupplyLeft","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uriPrefix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60a06040819052600060808190526200001b9160089162000223565b5060408051808201909152600580825264173539b7b760d91b60209092019182526200004a9160099162000223565b506611688627664000600b55612710600c556103e8600d55600a600e556003600f81905560146010819055601191909155805461ffff191690553480156200009157600080fd5b50604080518082018252600e81526d105a48111bdbd91b195cc8105c9d60921b60208083019182528351808501909452600c84526b105a511bdbd91b195cd05c9d60a21b908401528151919291620000ec9160009162000223565b5080516200010290600190602084019062000223565b5050506200011f620001196200014960201b60201c565b6200014d565b62000143604051806080016040528060418152602001620026e6604191396200019f565b62000305565b3390565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b620001a9620001c2565b8051620001be90600a90602084019062000223565b5050565b6006546001600160a01b03163314620002215760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640160405180910390fd5b565b8280546200023190620002c9565b90600052602060002090601f016020900481019282620002555760008555620002a0565b82601f106200027057805160ff1916838001178555620002a0565b82800160010185558215620002a0579182015b82811115620002a057825182559160200191906001019062000283565b50620002ae929150620002b2565b5090565b5b80821115620002ae5760008155600101620002b3565b600181811c90821680620002de57607f821691505b602082108103620002ff57634e487b7160e01b600052602260045260246000fd5b50919050565b6123d180620003156000396000f3fe60806040526004361061027c5760003560e01c806362b99ad41161014f578063b88d4fde116100c1578063e985e9c51161007a578063e985e9c51461075c578063efbd73f4146107a5578063efe0daf8146107c5578063f2fde38b146107db578063f3a07ff1146107fb578063fdf8bcdc1461081157600080fd5b8063b88d4fde146106b0578063c1ab22ec146106d0578063c68bd472146106e6578063c87b56dd14610706578063d5abeb0114610726578063e0a808531461073c57600080fd5b8063816877301161011357806381687730146106085780638da5cb5b1461063557806395d89b4114610653578063a0712d6814610668578063a22cb4651461067b578063a45ba8e71461069b57600080fd5b806362b99ad41461057e5780636352211e1461059357806370a08231146105b3578063715018a6146105d35780637ec4a659146105e857600080fd5b806323b872dd116101f357806344a0d68a116101ac57806344a0d68a146104da5780634fdd43cb146104fa578063518302271461051a5780635503a0e8146105395780635c975abb1461054e578063604906dc1461056857600080fd5b806323b872dd1461041857806330ff91c71461043857806332c32cb5146104585780633ccfd60b1461047857806342842e0e1461048d578063438b6300146104ad57600080fd5b8063081812fc11610245578063081812fc14610355578063095ea7b31461038d57806313faede6146103ad57806316ba10e0146103c357806316c38b3c146103e357806318160ddd1461040357600080fd5b806219fb7014610281578063013d4053146102c157806301ffc9a7146102e35780630426c1fa1461031357806306fdde0314610333575b600080fd5b34801561028d57600080fd5b506102ae61029c366004611d5b565b60136020526000908152604090205481565b6040519081526020015b60405180910390f35b3480156102cd57600080fd5b506102e16102dc366004611d76565b610827565b005b3480156102ef57600080fd5b506103036102fe366004611da5565b610834565b60405190151581526020016102b8565b34801561031f57600080fd5b506102e161032e366004611d76565b610886565b34801561033f57600080fd5b50610348610893565b6040516102b89190611e1a565b34801561036157600080fd5b50610375610370366004611d76565b610925565b6040516001600160a01b0390911681526020016102b8565b34801561039957600080fd5b506102e16103a8366004611e2d565b61094c565b3480156103b957600080fd5b506102ae600b5481565b3480156103cf57600080fd5b506102e16103de366004611ee3565b610a66565b3480156103ef57600080fd5b506102e16103fe366004611f3c565b610a85565b34801561040f57600080fd5b506102ae610aa0565b34801561042457600080fd5b506102e1610433366004611f57565b610ab0565b34801561044457600080fd5b506102e1610453366004611d76565b610ae1565b34801561046457600080fd5b506102e1610473366004611d76565b610aee565b34801561048457600080fd5b506102e1610afb565b34801561049957600080fd5b506102e16104a8366004611f57565b610b77565b3480156104b957600080fd5b506104cd6104c8366004611d5b565b610b92565b6040516102b89190611f93565b3480156104e657600080fd5b506102e16104f5366004611d76565b610c72565b34801561050657600080fd5b506102e1610515366004611ee3565b610c7f565b34801561052657600080fd5b5060145461030390610100900460ff1681565b34801561054557600080fd5b50610348610c9a565b34801561055a57600080fd5b506014546103039060ff1681565b34801561057457600080fd5b506102ae600f5481565b34801561058a57600080fd5b50610348610d28565b34801561059f57600080fd5b506103756105ae366004611d76565b610d35565b3480156105bf57600080fd5b506102ae6105ce366004611d5b565b610d95565b3480156105df57600080fd5b506102e1610e1b565b3480156105f457600080fd5b506102e1610603366004611ee3565b610e2f565b34801561061457600080fd5b506102ae610623366004611d5b565b60126020526000908152604090205481565b34801561064157600080fd5b506006546001600160a01b0316610375565b34801561065f57600080fd5b50610348610e4a565b6102e1610676366004611d76565b610e59565b34801561068757600080fd5b506102e1610696366004611fd7565b6111a9565b3480156106a757600080fd5b506103486111b4565b3480156106bc57600080fd5b506102e16106cb36600461200a565b6111c1565b3480156106dc57600080fd5b506102ae60115481565b3480156106f257600080fd5b506102e1610701366004611d76565b6111f9565b34801561071257600080fd5b50610348610721366004611d76565b611206565b34801561073257600080fd5b506102ae600c5481565b34801561074857600080fd5b506102e1610757366004611f3c565b61138a565b34801561076857600080fd5b50610303610777366004612086565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156107b157600080fd5b506102e16107c03660046120b0565b6113ac565b3480156107d157600080fd5b506102ae60105481565b3480156107e757600080fd5b506102e16107f6366004611d5b565b6113be565b34801561080757600080fd5b506102ae600e5481565b34801561081d57600080fd5b506102ae600d5481565b61082f611434565b600d55565b60006001600160e01b031982166380ac58cd60e01b148061086557506001600160e01b03198216635b5e139f60e01b145b8061088057506301ffc9a760e01b6001600160e01b03198316145b92915050565b61088e611434565b601155565b6060600080546108a2906120d3565b80601f01602080910402602001604051908101604052809291908181526020018280546108ce906120d3565b801561091b5780601f106108f05761010080835404028352916020019161091b565b820191906000526020600020905b8154815290600101906020018083116108fe57829003601f168201915b5050505050905090565b60006109308261148e565b506000908152600460205260409020546001600160a01b031690565b600061095782610d35565b9050806001600160a01b0316836001600160a01b0316036109c95760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b03821614806109e557506109e58133610777565b610a575760405162461bcd60e51b815260206004820152603e60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c000060648201526084016109c0565b610a6183836114ed565b505050565b610a6e611434565b8051610a81906009906020840190611ca6565b5050565b610a8d611434565b6014805460ff1916911515919091179055565b6000610aab60075490565b905090565b610aba338261155b565b610ad65760405162461bcd60e51b81526004016109c09061210d565b610a618383836115da565b610ae9611434565b601055565b610af6611434565b600f55565b610b03611434565b6000610b176006546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d8060008114610b61576040519150601f19603f3d011682016040523d82523d6000602084013e610b66565b606091505b5050905080610b7457600080fd5b50565b610a61838383604051806020016040528060008152506111c1565b60606000610b9f83610d95565b905060008167ffffffffffffffff811115610bbc57610bbc611e57565b604051908082528060200260200182016040528015610be5578160200160208202803683370190505b509050600160005b8381108015610bfe5750600c548211155b15610c68576000610c0e83610d35565b9050866001600160a01b0316816001600160a01b031603610c555782848381518110610c3c57610c3c61215b565b602090810291909101015281610c5181612187565b9250505b82610c5f81612187565b93505050610bed565b5090949350505050565b610c7a611434565b600b55565b610c87611434565b8051610a8190600a906020840190611ca6565b60098054610ca7906120d3565b80601f0160208091040260200160405190810160405280929190818152602001828054610cd3906120d3565b8015610d205780601f10610cf557610100808354040283529160200191610d20565b820191906000526020600020905b815481529060010190602001808311610d0357829003601f168201915b505050505081565b60088054610ca7906120d3565b6000818152600260205260408120546001600160a01b0316806108805760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b60448201526064016109c0565b60006001600160a01b038216610dff5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b60648201526084016109c0565b506001600160a01b031660009081526003602052604090205490565b610e23611434565b610e2d6000611776565b565b610e37611434565b8051610a81906008906020840190611ca6565b6060600180546108a2906120d3565b60145460ff1615610eac5760405162461bcd60e51b815260206004820152601760248201527f54686520636f6e7472616374206973207061757365642100000000000000000060448201526064016109c0565b34156110445780600b54610ec091906121a0565b341015610f055760405162461bcd60e51b8152602060048201526013602482015272496e73756666696369656e742066756e64732160681b60448201526064016109c0565b600c5481610f1260075490565b610f1c91906121bf565b1115610f615760405162461bcd60e51b81526020600482015260146024820152734d617820737570706c792065786365656465642160601b60448201526064016109c0565b600e54811115610fb35760405162461bcd60e51b815260206004820152601b60248201527f4d6178203130204e46547320706572207472616e73616374696f6e000000000060448201526064016109c0565b60105433600090815260126020526040902054610fd19083906121bf565b11156110155760405162461bcd60e51b815260206004820152601360248201527213585e081391951cc81c195c881dd85b1b195d606a1b60448201526064016109c0565b33600090815260126020526040812080548392906110349084906121bf565b90915550610b74905033826117c8565b600c548161105160075490565b61105b91906121bf565b11156110a05760405162461bcd60e51b81526020600482015260146024820152734d617820737570706c792065786365656465642160601b60448201526064016109c0565b600081600d546110b091906121d7565b10156110fe5760405162461bcd60e51b815260206004820152601860248201527f526561636865642066726565206d696e7420737570706c79000000000000000060448201526064016109c0565b6011543360009081526013602052604090205461111c9083906121bf565b111561116a5760405162461bcd60e51b815260206004820152601860248201527f4d61782066726565204e465473207065722077616c6c6574000000000000000060448201526064016109c0565b33600090815260136020526040812080548392906111899084906121bf565b9091555050600d5461119c9082906121d7565b600d55610b7433826117c8565b610a81338383611805565b600a8054610ca7906120d3565b6111cb338361155b565b6111e75760405162461bcd60e51b81526004016109c09061210d565b6111f3848484846118d3565b50505050565b611201611434565b600e55565b6000818152600260205260409020546060906001600160a01b03166112855760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016109c0565b601454610100900460ff16151560000361132b57600a80546112a6906120d3565b80601f01602080910402602001604051908101604052809291908181526020018280546112d2906120d3565b801561131f5780601f106112f45761010080835404028352916020019161131f565b820191906000526020600020905b81548152906001019060200180831161130257829003601f168201915b50505050509050919050565b6000611335611906565b905060008151116113555760405180602001604052806000815250611383565b8061135f84611915565b6009604051602001611373939291906121ee565b6040516020818303038152906040525b9392505050565b611392611434565b601480549115156101000261ff0019909216919091179055565b6113b4611434565b610a8181836117c8565b6113c6611434565b6001600160a01b03811661142b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109c0565b610b7481611776565b6006546001600160a01b03163314610e2d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109c0565b6000818152600260205260409020546001600160a01b0316610b745760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b60448201526064016109c0565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061152282610d35565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008061156783610d35565b9050806001600160a01b0316846001600160a01b031614806115ae57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b806115d25750836001600160a01b03166115c784610925565b6001600160a01b0316145b949350505050565b826001600160a01b03166115ed82610d35565b6001600160a01b0316146116515760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b60648201526084016109c0565b6001600160a01b0382166116b35760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016109c0565b6116be6000826114ed565b6001600160a01b03831660009081526003602052604081208054600192906116e79084906121d7565b90915550506001600160a01b03821660009081526003602052604081208054600192906117159084906121bf565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60005b81811015610a61576117e1600780546001019055565b6117f3836117ee60075490565b611a16565b806117fd81612187565b9150506117cb565b816001600160a01b0316836001600160a01b0316036118665760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016109c0565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6118de8484846115da565b6118ea84848484611a30565b6111f35760405162461bcd60e51b81526004016109c0906122b1565b6060600880546108a2906120d3565b60608160000361193c5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611966578061195081612187565b915061195f9050600a83612319565b9150611940565b60008167ffffffffffffffff81111561198157611981611e57565b6040519080825280601f01601f1916602001820160405280156119ab576020820181803683370190505b5090505b84156115d2576119c06001836121d7565b91506119cd600a8661232d565b6119d89060306121bf565b60f81b8183815181106119ed576119ed61215b565b60200101906001600160f81b031916908160001a905350611a0f600a86612319565b94506119af565b610a81828260405180602001604052806000815250611b31565b60006001600160a01b0384163b15611b2657604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611a74903390899088908890600401612341565b6020604051808303816000875af1925050508015611aaf575060408051601f3d908101601f19168201909252611aac9181019061237e565b60015b611b0c573d808015611add576040519150601f19603f3d011682016040523d82523d6000602084013e611ae2565b606091505b508051600003611b045760405162461bcd60e51b81526004016109c0906122b1565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506115d2565b506001949350505050565b611b3b8383611b64565b611b486000848484611a30565b610a615760405162461bcd60e51b81526004016109c0906122b1565b6001600160a01b038216611bba5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016109c0565b6000818152600260205260409020546001600160a01b031615611c1f5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016109c0565b6001600160a01b0382166000908152600360205260408120805460019290611c489084906121bf565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b828054611cb2906120d3565b90600052602060002090601f016020900481019282611cd45760008555611d1a565b82601f10611ced57805160ff1916838001178555611d1a565b82800160010185558215611d1a579182015b82811115611d1a578251825591602001919060010190611cff565b50611d26929150611d2a565b5090565b5b80821115611d265760008155600101611d2b565b80356001600160a01b0381168114611d5657600080fd5b919050565b600060208284031215611d6d57600080fd5b61138382611d3f565b600060208284031215611d8857600080fd5b5035919050565b6001600160e01b031981168114610b7457600080fd5b600060208284031215611db757600080fd5b813561138381611d8f565b60005b83811015611ddd578181015183820152602001611dc5565b838111156111f35750506000910152565b60008151808452611e06816020860160208601611dc2565b601f01601f19169290920160200192915050565b6020815260006113836020830184611dee565b60008060408385031215611e4057600080fd5b611e4983611d3f565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115611e8857611e88611e57565b604051601f8501601f19908116603f01168101908282118183101715611eb057611eb0611e57565b81604052809350858152868686011115611ec957600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215611ef557600080fd5b813567ffffffffffffffff811115611f0c57600080fd5b8201601f81018413611f1d57600080fd5b6115d284823560208401611e6d565b80358015158114611d5657600080fd5b600060208284031215611f4e57600080fd5b61138382611f2c565b600080600060608486031215611f6c57600080fd5b611f7584611d3f565b9250611f8360208501611d3f565b9150604084013590509250925092565b6020808252825182820181905260009190848201906040850190845b81811015611fcb57835183529284019291840191600101611faf565b50909695505050505050565b60008060408385031215611fea57600080fd5b611ff383611d3f565b915061200160208401611f2c565b90509250929050565b6000806000806080858703121561202057600080fd5b61202985611d3f565b935061203760208601611d3f565b925060408501359150606085013567ffffffffffffffff81111561205a57600080fd5b8501601f8101871361206b57600080fd5b61207a87823560208401611e6d565b91505092959194509250565b6000806040838503121561209957600080fd5b6120a283611d3f565b915061200160208401611d3f565b600080604083850312156120c357600080fd5b8235915061200160208401611d3f565b600181811c908216806120e757607f821691505b60208210810361210757634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252602e908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526d1c881b9bdc88185c1c1c9bdd995960921b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006001820161219957612199612171565b5060010190565b60008160001904831182151516156121ba576121ba612171565b500290565b600082198211156121d2576121d2612171565b500190565b6000828210156121e9576121e9612171565b500390565b6000845160206122018285838a01611dc2565b8551918401916122148184848a01611dc2565b8554920191600090600181811c908083168061223157607f831692505b858310810361224e57634e487b7160e01b85526022600452602485fd5b8080156122625760018114612273576122a0565b60ff198516885283880195506122a0565b60008b81526020902060005b858110156122985781548a82015290840190880161227f565b505083880195505b50939b9a5050505050505050505050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b634e487b7160e01b600052601260045260246000fd5b60008261232857612328612303565b500490565b60008261233c5761233c612303565b500690565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061237490830184611dee565b9695505050505050565b60006020828403121561239057600080fd5b815161138381611d8f56fea26469706673582212209236a28a44cda835aaf20a03a54f84930f4228222fe36be9111bdc3fa005bd1b64736f6c634300080e0033697066733a2f2f516d5136315243677a755a374672656f797a4275357941644159514173576d5473546b5867514a4a63734b4863522f68696464656e2e6a736f6e
Deployed Bytecode
0x60806040526004361061027c5760003560e01c806362b99ad41161014f578063b88d4fde116100c1578063e985e9c51161007a578063e985e9c51461075c578063efbd73f4146107a5578063efe0daf8146107c5578063f2fde38b146107db578063f3a07ff1146107fb578063fdf8bcdc1461081157600080fd5b8063b88d4fde146106b0578063c1ab22ec146106d0578063c68bd472146106e6578063c87b56dd14610706578063d5abeb0114610726578063e0a808531461073c57600080fd5b8063816877301161011357806381687730146106085780638da5cb5b1461063557806395d89b4114610653578063a0712d6814610668578063a22cb4651461067b578063a45ba8e71461069b57600080fd5b806362b99ad41461057e5780636352211e1461059357806370a08231146105b3578063715018a6146105d35780637ec4a659146105e857600080fd5b806323b872dd116101f357806344a0d68a116101ac57806344a0d68a146104da5780634fdd43cb146104fa578063518302271461051a5780635503a0e8146105395780635c975abb1461054e578063604906dc1461056857600080fd5b806323b872dd1461041857806330ff91c71461043857806332c32cb5146104585780633ccfd60b1461047857806342842e0e1461048d578063438b6300146104ad57600080fd5b8063081812fc11610245578063081812fc14610355578063095ea7b31461038d57806313faede6146103ad57806316ba10e0146103c357806316c38b3c146103e357806318160ddd1461040357600080fd5b806219fb7014610281578063013d4053146102c157806301ffc9a7146102e35780630426c1fa1461031357806306fdde0314610333575b600080fd5b34801561028d57600080fd5b506102ae61029c366004611d5b565b60136020526000908152604090205481565b6040519081526020015b60405180910390f35b3480156102cd57600080fd5b506102e16102dc366004611d76565b610827565b005b3480156102ef57600080fd5b506103036102fe366004611da5565b610834565b60405190151581526020016102b8565b34801561031f57600080fd5b506102e161032e366004611d76565b610886565b34801561033f57600080fd5b50610348610893565b6040516102b89190611e1a565b34801561036157600080fd5b50610375610370366004611d76565b610925565b6040516001600160a01b0390911681526020016102b8565b34801561039957600080fd5b506102e16103a8366004611e2d565b61094c565b3480156103b957600080fd5b506102ae600b5481565b3480156103cf57600080fd5b506102e16103de366004611ee3565b610a66565b3480156103ef57600080fd5b506102e16103fe366004611f3c565b610a85565b34801561040f57600080fd5b506102ae610aa0565b34801561042457600080fd5b506102e1610433366004611f57565b610ab0565b34801561044457600080fd5b506102e1610453366004611d76565b610ae1565b34801561046457600080fd5b506102e1610473366004611d76565b610aee565b34801561048457600080fd5b506102e1610afb565b34801561049957600080fd5b506102e16104a8366004611f57565b610b77565b3480156104b957600080fd5b506104cd6104c8366004611d5b565b610b92565b6040516102b89190611f93565b3480156104e657600080fd5b506102e16104f5366004611d76565b610c72565b34801561050657600080fd5b506102e1610515366004611ee3565b610c7f565b34801561052657600080fd5b5060145461030390610100900460ff1681565b34801561054557600080fd5b50610348610c9a565b34801561055a57600080fd5b506014546103039060ff1681565b34801561057457600080fd5b506102ae600f5481565b34801561058a57600080fd5b50610348610d28565b34801561059f57600080fd5b506103756105ae366004611d76565b610d35565b3480156105bf57600080fd5b506102ae6105ce366004611d5b565b610d95565b3480156105df57600080fd5b506102e1610e1b565b3480156105f457600080fd5b506102e1610603366004611ee3565b610e2f565b34801561061457600080fd5b506102ae610623366004611d5b565b60126020526000908152604090205481565b34801561064157600080fd5b506006546001600160a01b0316610375565b34801561065f57600080fd5b50610348610e4a565b6102e1610676366004611d76565b610e59565b34801561068757600080fd5b506102e1610696366004611fd7565b6111a9565b3480156106a757600080fd5b506103486111b4565b3480156106bc57600080fd5b506102e16106cb36600461200a565b6111c1565b3480156106dc57600080fd5b506102ae60115481565b3480156106f257600080fd5b506102e1610701366004611d76565b6111f9565b34801561071257600080fd5b50610348610721366004611d76565b611206565b34801561073257600080fd5b506102ae600c5481565b34801561074857600080fd5b506102e1610757366004611f3c565b61138a565b34801561076857600080fd5b50610303610777366004612086565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156107b157600080fd5b506102e16107c03660046120b0565b6113ac565b3480156107d157600080fd5b506102ae60105481565b3480156107e757600080fd5b506102e16107f6366004611d5b565b6113be565b34801561080757600080fd5b506102ae600e5481565b34801561081d57600080fd5b506102ae600d5481565b61082f611434565b600d55565b60006001600160e01b031982166380ac58cd60e01b148061086557506001600160e01b03198216635b5e139f60e01b145b8061088057506301ffc9a760e01b6001600160e01b03198316145b92915050565b61088e611434565b601155565b6060600080546108a2906120d3565b80601f01602080910402602001604051908101604052809291908181526020018280546108ce906120d3565b801561091b5780601f106108f05761010080835404028352916020019161091b565b820191906000526020600020905b8154815290600101906020018083116108fe57829003601f168201915b5050505050905090565b60006109308261148e565b506000908152600460205260409020546001600160a01b031690565b600061095782610d35565b9050806001600160a01b0316836001600160a01b0316036109c95760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b03821614806109e557506109e58133610777565b610a575760405162461bcd60e51b815260206004820152603e60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c000060648201526084016109c0565b610a6183836114ed565b505050565b610a6e611434565b8051610a81906009906020840190611ca6565b5050565b610a8d611434565b6014805460ff1916911515919091179055565b6000610aab60075490565b905090565b610aba338261155b565b610ad65760405162461bcd60e51b81526004016109c09061210d565b610a618383836115da565b610ae9611434565b601055565b610af6611434565b600f55565b610b03611434565b6000610b176006546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d8060008114610b61576040519150601f19603f3d011682016040523d82523d6000602084013e610b66565b606091505b5050905080610b7457600080fd5b50565b610a61838383604051806020016040528060008152506111c1565b60606000610b9f83610d95565b905060008167ffffffffffffffff811115610bbc57610bbc611e57565b604051908082528060200260200182016040528015610be5578160200160208202803683370190505b509050600160005b8381108015610bfe5750600c548211155b15610c68576000610c0e83610d35565b9050866001600160a01b0316816001600160a01b031603610c555782848381518110610c3c57610c3c61215b565b602090810291909101015281610c5181612187565b9250505b82610c5f81612187565b93505050610bed565b5090949350505050565b610c7a611434565b600b55565b610c87611434565b8051610a8190600a906020840190611ca6565b60098054610ca7906120d3565b80601f0160208091040260200160405190810160405280929190818152602001828054610cd3906120d3565b8015610d205780601f10610cf557610100808354040283529160200191610d20565b820191906000526020600020905b815481529060010190602001808311610d0357829003601f168201915b505050505081565b60088054610ca7906120d3565b6000818152600260205260408120546001600160a01b0316806108805760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b60448201526064016109c0565b60006001600160a01b038216610dff5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b60648201526084016109c0565b506001600160a01b031660009081526003602052604090205490565b610e23611434565b610e2d6000611776565b565b610e37611434565b8051610a81906008906020840190611ca6565b6060600180546108a2906120d3565b60145460ff1615610eac5760405162461bcd60e51b815260206004820152601760248201527f54686520636f6e7472616374206973207061757365642100000000000000000060448201526064016109c0565b34156110445780600b54610ec091906121a0565b341015610f055760405162461bcd60e51b8152602060048201526013602482015272496e73756666696369656e742066756e64732160681b60448201526064016109c0565b600c5481610f1260075490565b610f1c91906121bf565b1115610f615760405162461bcd60e51b81526020600482015260146024820152734d617820737570706c792065786365656465642160601b60448201526064016109c0565b600e54811115610fb35760405162461bcd60e51b815260206004820152601b60248201527f4d6178203130204e46547320706572207472616e73616374696f6e000000000060448201526064016109c0565b60105433600090815260126020526040902054610fd19083906121bf565b11156110155760405162461bcd60e51b815260206004820152601360248201527213585e081391951cc81c195c881dd85b1b195d606a1b60448201526064016109c0565b33600090815260126020526040812080548392906110349084906121bf565b90915550610b74905033826117c8565b600c548161105160075490565b61105b91906121bf565b11156110a05760405162461bcd60e51b81526020600482015260146024820152734d617820737570706c792065786365656465642160601b60448201526064016109c0565b600081600d546110b091906121d7565b10156110fe5760405162461bcd60e51b815260206004820152601860248201527f526561636865642066726565206d696e7420737570706c79000000000000000060448201526064016109c0565b6011543360009081526013602052604090205461111c9083906121bf565b111561116a5760405162461bcd60e51b815260206004820152601860248201527f4d61782066726565204e465473207065722077616c6c6574000000000000000060448201526064016109c0565b33600090815260136020526040812080548392906111899084906121bf565b9091555050600d5461119c9082906121d7565b600d55610b7433826117c8565b610a81338383611805565b600a8054610ca7906120d3565b6111cb338361155b565b6111e75760405162461bcd60e51b81526004016109c09061210d565b6111f3848484846118d3565b50505050565b611201611434565b600e55565b6000818152600260205260409020546060906001600160a01b03166112855760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016109c0565b601454610100900460ff16151560000361132b57600a80546112a6906120d3565b80601f01602080910402602001604051908101604052809291908181526020018280546112d2906120d3565b801561131f5780601f106112f45761010080835404028352916020019161131f565b820191906000526020600020905b81548152906001019060200180831161130257829003601f168201915b50505050509050919050565b6000611335611906565b905060008151116113555760405180602001604052806000815250611383565b8061135f84611915565b6009604051602001611373939291906121ee565b6040516020818303038152906040525b9392505050565b611392611434565b601480549115156101000261ff0019909216919091179055565b6113b4611434565b610a8181836117c8565b6113c6611434565b6001600160a01b03811661142b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109c0565b610b7481611776565b6006546001600160a01b03163314610e2d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109c0565b6000818152600260205260409020546001600160a01b0316610b745760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b60448201526064016109c0565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061152282610d35565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008061156783610d35565b9050806001600160a01b0316846001600160a01b031614806115ae57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b806115d25750836001600160a01b03166115c784610925565b6001600160a01b0316145b949350505050565b826001600160a01b03166115ed82610d35565b6001600160a01b0316146116515760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b60648201526084016109c0565b6001600160a01b0382166116b35760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016109c0565b6116be6000826114ed565b6001600160a01b03831660009081526003602052604081208054600192906116e79084906121d7565b90915550506001600160a01b03821660009081526003602052604081208054600192906117159084906121bf565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60005b81811015610a61576117e1600780546001019055565b6117f3836117ee60075490565b611a16565b806117fd81612187565b9150506117cb565b816001600160a01b0316836001600160a01b0316036118665760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016109c0565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6118de8484846115da565b6118ea84848484611a30565b6111f35760405162461bcd60e51b81526004016109c0906122b1565b6060600880546108a2906120d3565b60608160000361193c5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611966578061195081612187565b915061195f9050600a83612319565b9150611940565b60008167ffffffffffffffff81111561198157611981611e57565b6040519080825280601f01601f1916602001820160405280156119ab576020820181803683370190505b5090505b84156115d2576119c06001836121d7565b91506119cd600a8661232d565b6119d89060306121bf565b60f81b8183815181106119ed576119ed61215b565b60200101906001600160f81b031916908160001a905350611a0f600a86612319565b94506119af565b610a81828260405180602001604052806000815250611b31565b60006001600160a01b0384163b15611b2657604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611a74903390899088908890600401612341565b6020604051808303816000875af1925050508015611aaf575060408051601f3d908101601f19168201909252611aac9181019061237e565b60015b611b0c573d808015611add576040519150601f19603f3d011682016040523d82523d6000602084013e611ae2565b606091505b508051600003611b045760405162461bcd60e51b81526004016109c0906122b1565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506115d2565b506001949350505050565b611b3b8383611b64565b611b486000848484611a30565b610a615760405162461bcd60e51b81526004016109c0906122b1565b6001600160a01b038216611bba5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016109c0565b6000818152600260205260409020546001600160a01b031615611c1f5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016109c0565b6001600160a01b0382166000908152600360205260408120805460019290611c489084906121bf565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b828054611cb2906120d3565b90600052602060002090601f016020900481019282611cd45760008555611d1a565b82601f10611ced57805160ff1916838001178555611d1a565b82800160010185558215611d1a579182015b82811115611d1a578251825591602001919060010190611cff565b50611d26929150611d2a565b5090565b5b80821115611d265760008155600101611d2b565b80356001600160a01b0381168114611d5657600080fd5b919050565b600060208284031215611d6d57600080fd5b61138382611d3f565b600060208284031215611d8857600080fd5b5035919050565b6001600160e01b031981168114610b7457600080fd5b600060208284031215611db757600080fd5b813561138381611d8f565b60005b83811015611ddd578181015183820152602001611dc5565b838111156111f35750506000910152565b60008151808452611e06816020860160208601611dc2565b601f01601f19169290920160200192915050565b6020815260006113836020830184611dee565b60008060408385031215611e4057600080fd5b611e4983611d3f565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115611e8857611e88611e57565b604051601f8501601f19908116603f01168101908282118183101715611eb057611eb0611e57565b81604052809350858152868686011115611ec957600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215611ef557600080fd5b813567ffffffffffffffff811115611f0c57600080fd5b8201601f81018413611f1d57600080fd5b6115d284823560208401611e6d565b80358015158114611d5657600080fd5b600060208284031215611f4e57600080fd5b61138382611f2c565b600080600060608486031215611f6c57600080fd5b611f7584611d3f565b9250611f8360208501611d3f565b9150604084013590509250925092565b6020808252825182820181905260009190848201906040850190845b81811015611fcb57835183529284019291840191600101611faf565b50909695505050505050565b60008060408385031215611fea57600080fd5b611ff383611d3f565b915061200160208401611f2c565b90509250929050565b6000806000806080858703121561202057600080fd5b61202985611d3f565b935061203760208601611d3f565b925060408501359150606085013567ffffffffffffffff81111561205a57600080fd5b8501601f8101871361206b57600080fd5b61207a87823560208401611e6d565b91505092959194509250565b6000806040838503121561209957600080fd5b6120a283611d3f565b915061200160208401611d3f565b600080604083850312156120c357600080fd5b8235915061200160208401611d3f565b600181811c908216806120e757607f821691505b60208210810361210757634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252602e908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526d1c881b9bdc88185c1c1c9bdd995960921b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006001820161219957612199612171565b5060010190565b60008160001904831182151516156121ba576121ba612171565b500290565b600082198211156121d2576121d2612171565b500190565b6000828210156121e9576121e9612171565b500390565b6000845160206122018285838a01611dc2565b8551918401916122148184848a01611dc2565b8554920191600090600181811c908083168061223157607f831692505b858310810361224e57634e487b7160e01b85526022600452602485fd5b8080156122625760018114612273576122a0565b60ff198516885283880195506122a0565b60008b81526020902060005b858110156122985781548a82015290840190880161227f565b505083880195505b50939b9a5050505050505050505050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b634e487b7160e01b600052601260045260246000fd5b60008261232857612328612303565b500490565b60008261233c5761233c612303565b500690565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061237490830184611dee565b9695505050505050565b60006020828403121561239057600080fd5b815161138381611d8f56fea26469706673582212209236a28a44cda835aaf20a03a54f84930f4228222fe36be9111bdc3fa005bd1b64736f6c634300080e0033
Deployed Bytecode Sourcemap
39568:5058:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40184:49;;;;;;;;;;-1:-1:-1;40184:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;529:25:1;;;517:2;502:18;40184:49:0;;;;;;;;43611:114;;;;;;;;;;-1:-1:-1;43611:114:0;;;;;:::i;:::-;;:::i;:::-;;26308:305;;;;;;;;;;-1:-1:-1;26308:305:0;;;;;:::i;:::-;;:::i;:::-;;;1301:14:1;;1294:22;1276:41;;1264:2;1249:18;26308:305:0;1136:187:1;43099:126:0;;;;;;;;;;-1:-1:-1;43099:126:0;;;;;:::i;:::-;;:::i;27235:100::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;28748:171::-;;;;;;;;;;-1:-1:-1;28748:171:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2243:32:1;;;2225:51;;2213:2;2198:18;28748:171:0;2079:203:1;28265:417:0;;;;;;;;;;-1:-1:-1;28265:417:0;;;;;:::i;:::-;;:::i;39835:34::-;;;;;;;;;;;;;;;;43977:100;;;;;;;;;;-1:-1:-1;43977:100:0;;;;;:::i;:::-;;:::i;44083:77::-;;;;;;;;;;-1:-1:-1;44083:77:0;;;;;:::i;:::-;;:::i;40473:89::-;;;;;;;;;;;;;:::i;29448:336::-;;;;;;;;;;-1:-1:-1;29448:336:0;;;;;:::i;:::-;;:::i;42968:126::-;;;;;;;;;;-1:-1:-1;42968:126:0;;;;;:::i;:::-;;:::i;43379:146::-;;;;;;;;;;-1:-1:-1;43379:146:0;;;;;:::i;:::-;;:::i;44166:137::-;;;;;;;;;;;;;:::i;29855:185::-;;;;;;;;;;-1:-1:-1;29855:185:0;;;;;:::i;:::-;;:::i;41742:635::-;;;;;;;;;;-1:-1:-1;41742:635:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;43531:74::-;;;;;;;;;;-1:-1:-1;43531:74:0;;;;;:::i;:::-;;:::i;43733:132::-;;;;;;;;;;-1:-1:-1;43733:132:0;;;;;:::i;:::-;;:::i;40271:28::-;;;;;;;;;;-1:-1:-1;40271:28:0;;;;;;;;;;;39757:33;;;;;;;;;;;;;:::i;40240:26::-;;;;;;;;;;-1:-1:-1;40240:26:0;;;;;;;;40003:41;;;;;;;;;;;;;;;;39724:28;;;;;;;;;;;;;:::i;26946:222::-;;;;;;;;;;-1:-1:-1;26946:222:0;;;;;:::i;:::-;;:::i;26677:207::-;;;;;;;;;;-1:-1:-1;26677:207:0;;;;;:::i;:::-;;:::i;6844:103::-;;;;;;;;;;;;;:::i;43871:100::-;;;;;;;;;;-1:-1:-1;43871:100:0;;;;;:::i;:::-;;:::i;40134:45::-;;;;;;;;;;-1:-1:-1;40134:45:0;;;;;:::i;:::-;;;;;;;;;;;;;;6196:87;;;;;;;;;;-1:-1:-1;6269:6:0;;-1:-1:-1;;;;;6269:6:0;6196:87;;27404:104;;;;;;;;;;;;;:::i;40568:1033::-;;;;;;:::i;:::-;;:::i;28991:155::-;;;;;;;;;;-1:-1:-1;28991:155:0;;;;;:::i;:::-;;:::i;39795:31::-;;;;;;;;;;;;;:::i;30111:323::-;;;;;;;;;;-1:-1:-1;30111:323:0;;;;;:::i;:::-;;:::i;40091:36::-;;;;;;;;;;;;;;;;43229:146;;;;;;;;;;-1:-1:-1;43229:146:0;;;;;:::i;:::-;;:::i;42383:494::-;;;;;;;;;;-1:-1:-1;42383:494:0;;;;;:::i;:::-;;:::i;39876:32::-;;;;;;;;;;;;;;;;42883:81;;;;;;;;;;-1:-1:-1;42883:81:0;;;;;:::i;:::-;;:::i;29217:164::-;;;;;;;;;;-1:-1:-1;29217:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;29338:25:0;;;29314:4;29338:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;29217:164;41609:127;;;;;;;;;;-1:-1:-1;41609:127:0;;;;;:::i;:::-;;:::i;40049:37::-;;;;;;;;;;;;;;;;7102:201;;;;;;;;;;-1:-1:-1;7102:201:0;;;;;:::i;:::-;;:::i;39956:42::-;;;;;;;;;;;;;;;;39913:36;;;;;;;;;;;;;;;;43611:114;6082:13;:11;:13::i;:::-;43687:14:::1;:32:::0;43611:114::o;26308:305::-;26410:4;-1:-1:-1;;;;;;26447:40:0;;-1:-1:-1;;;26447:40:0;;:105;;-1:-1:-1;;;;;;;26504:48:0;;-1:-1:-1;;;26504:48:0;26447:105;:158;;;-1:-1:-1;;;;;;;;;;19159:40:0;;;26569:36;26427:178;26308:305;-1:-1:-1;;26308:305:0:o;43099:126::-;6082:13;:11;:13::i;:::-;43181:17:::1;:38:::0;43099:126::o;27235:100::-;27289:13;27322:5;27315:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27235:100;:::o;28748:171::-;28824:7;28844:23;28859:7;28844:14;:23::i;:::-;-1:-1:-1;28887:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;28887:24:0;;28748:171::o;28265:417::-;28346:13;28362:23;28377:7;28362:14;:23::i;:::-;28346:39;;28410:5;-1:-1:-1;;;;;28404:11:0;:2;-1:-1:-1;;;;;28404:11:0;;28396:57;;;;-1:-1:-1;;;28396:57:0;;7133:2:1;28396:57:0;;;7115:21:1;7172:2;7152:18;;;7145:30;7211:34;7191:18;;;7184:62;-1:-1:-1;;;7262:18:1;;;7255:31;7303:19;;28396:57:0;;;;;;;;;4827:10;-1:-1:-1;;;;;28488:21:0;;;;:62;;-1:-1:-1;28513:37:0;28530:5;4827:10;29217:164;:::i;28513:37::-;28466:174;;;;-1:-1:-1;;;28466:174:0;;7535:2:1;28466:174:0;;;7517:21:1;7574:2;7554:18;;;7547:30;7613:34;7593:18;;;7586:62;7684:32;7664:18;;;7657:60;7734:19;;28466:174:0;7333:426:1;28466:174:0;28653:21;28662:2;28666:7;28653:8;:21::i;:::-;28335:347;28265:417;;:::o;43977:100::-;6082:13;:11;:13::i;:::-;44049:22;;::::1;::::0;:9:::1;::::0;:22:::1;::::0;::::1;::::0;::::1;:::i;:::-;;43977:100:::0;:::o;44083:77::-;6082:13;:11;:13::i;:::-;44139:6:::1;:15:::0;;-1:-1:-1;;44139:15:0::1;::::0;::::1;;::::0;;;::::1;::::0;;44083:77::o;40473:89::-;40517:7;40540:16;:6;1070:14;;978:114;40540:16;40533:23;;40473:89;:::o;29448:336::-;29643:41;4827:10;29676:7;29643:18;:41::i;:::-;29635:100;;;;-1:-1:-1;;;29635:100:0;;;;;;;:::i;:::-;29748:28;29758:4;29764:2;29768:7;29748:9;:28::i;42968:126::-;6082:13;:11;:13::i;:::-;43050:17:::1;:38:::0;42968:126::o;43379:146::-;6082:13;:11;:13::i;:::-;43471:22:::1;:48:::0;43379:146::o;44166:137::-;6082:13;:11;:13::i;:::-;44211:7:::1;44232;6269:6:::0;;-1:-1:-1;;;;;6269:6:0;;6196:87;44232:7:::1;-1:-1:-1::0;;;;;44224:21:0::1;44253;44224:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44210:69;;;44294:2;44286:11;;;::::0;::::1;;44203:100;44166:137::o:0;29855:185::-;29993:39;30010:4;30016:2;30020:7;29993:39;;;;;;;;;;;;:16;:39::i;41742:635::-;41817:16;41845:23;41871:17;41881:6;41871:9;:17::i;:::-;41845:43;;41895:30;41942:15;41928:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41928:30:0;-1:-1:-1;41895:63:0;-1:-1:-1;41990:1:0;41965:22;42034:309;42059:15;42041;:33;:64;;;;;42096:9;;42078:14;:27;;42041:64;42034:309;;;42116:25;42144:23;42152:14;42144:7;:23::i;:::-;42116:51;;42203:6;-1:-1:-1;;;;;42182:27:0;:17;-1:-1:-1;;;;;42182:27:0;;42178:131;;42255:14;42222:13;42236:15;42222:30;;;;;;;;:::i;:::-;;;;;;;;;;:47;42282:17;;;;:::i;:::-;;;;42178:131;42319:16;;;;:::i;:::-;;;;42107:236;42034:309;;;-1:-1:-1;42358:13:0;;41742:635;-1:-1:-1;;;;41742:635:0:o;43531:74::-;6082:13;:11;:13::i;:::-;43587:4:::1;:12:::0;43531:74::o;43733:132::-;6082:13;:11;:13::i;:::-;43821:38;;::::1;::::0;:17:::1;::::0;:38:::1;::::0;::::1;::::0;::::1;:::i;39757:33::-:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;39724:28::-;;;;;;;:::i;26946:222::-;27018:7;27054:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27054:16:0;;27081:56;;;;-1:-1:-1;;;27081:56:0;;8995:2:1;27081:56:0;;;8977:21:1;9034:2;9014:18;;;9007:30;-1:-1:-1;;;9053:18:1;;;9046:54;9117:18;;27081:56:0;8793:348:1;26677:207:0;26749:7;-1:-1:-1;;;;;26777:19:0;;26769:73;;;;-1:-1:-1;;;26769:73:0;;9348:2:1;26769:73:0;;;9330:21:1;9387:2;9367:18;;;9360:30;9426:34;9406:18;;;9399:62;-1:-1:-1;;;9477:18:1;;;9470:39;9526:19;;26769:73:0;9146:405:1;26769:73:0;-1:-1:-1;;;;;;26860:16:0;;;;;:9;:16;;;;;;;26677:207::o;6844:103::-;6082:13;:11;:13::i;:::-;6909:30:::1;6936:1;6909:18;:30::i;:::-;6844:103::o:0;43871:100::-;6082:13;:11;:13::i;:::-;43943:22;;::::1;::::0;:9:::1;::::0;:22:::1;::::0;::::1;::::0;::::1;:::i;27404:104::-:0;27460:13;27493:7;27486:14;;;;;:::i;40568:1033::-;40634:6;;;;40633:7;40625:43;;;;-1:-1:-1;;;40625:43:0;;9758:2:1;40625:43:0;;;9740:21:1;9797:2;9777:18;;;9770:30;9836:25;9816:18;;;9809:53;9879:18;;40625:43:0;9556:347:1;40625:43:0;40685:9;:13;40681:915;;40739:11;40732:4;;:18;;;;:::i;:::-;40719:9;:31;;40711:63;;;;-1:-1:-1;;;40711:63:0;;10283:2:1;40711:63:0;;;10265:21:1;10322:2;10302:18;;;10295:30;-1:-1:-1;;;10341:18:1;;;10334:49;10400:18;;40711:63:0;10081:343:1;40711:63:0;40827:9;;40812:11;40793:16;:6;1070:14;;978:114;40793:16;:30;;;;:::i;:::-;:43;;40785:76;;;;-1:-1:-1;;;40785:76:0;;10764:2:1;40785:76:0;;;10746:21:1;10803:2;10783:18;;;10776:30;-1:-1:-1;;;10822:18:1;;;10815:50;10882:18;;40785:76:0;10562:344:1;40785:76:0;40895:22;;40880:11;:37;;40872:77;;;;-1:-1:-1;;;40872:77:0;;11113:2:1;40872:77:0;;;11095:21:1;11152:2;11132:18;;;11125:30;11191:29;11171:18;;;11164:57;11238:18;;40872:77:0;10911:351:1;40872:77:0;41008:17;;40979:10;40968:22;;;;:10;:22;;;;;;:36;;40993:11;;40968:36;:::i;:::-;:57;;40960:89;;;;-1:-1:-1;;;40960:89:0;;11469:2:1;40960:89:0;;;11451:21:1;11508:2;11488:18;;;11481:30;-1:-1:-1;;;11527:18:1;;;11520:49;11586:18;;40960:89:0;11267:343:1;40960:89:0;41071:10;41060:22;;;;:10;:22;;;;;:37;;41086:11;;41060:22;:37;;41086:11;;41060:37;:::i;:::-;;;;-1:-1:-1;41109:34:0;;-1:-1:-1;41119:10:0;41131:11;41109:9;:34::i;40681:915::-;41210:9;;41195:11;41176:16;:6;1070:14;;978:114;41176:16;:30;;;;:::i;:::-;:43;;41168:76;;;;-1:-1:-1;;;41168:76:0;;10764:2:1;41168:76:0;;;10746:21:1;10803:2;10783:18;;;10776:30;-1:-1:-1;;;10822:18:1;;;10815:50;10882:18;;41168:76:0;10562:344:1;41168:76:0;41295:1;41280:11;41263:14;;:28;;;;:::i;:::-;:33;;41255:70;;;;-1:-1:-1;;;41255:70:0;;11947:2:1;41255:70:0;;;11929:21:1;11986:2;11966:18;;;11959:30;12025:26;12005:18;;;11998:54;12069:18;;41255:70:0;11745:348:1;41255:70:0;41388:17;;41359:10;41344:26;;;;:14;:26;;;;;;:40;;41373:11;;41344:40;:::i;:::-;:61;;41336:98;;;;-1:-1:-1;;;41336:98:0;;12300:2:1;41336:98:0;;;12282:21:1;12339:2;12319:18;;;12312:30;12378:26;12358:18;;;12351:54;12422:18;;41336:98:0;12098:348:1;41336:98:0;41460:10;41445:26;;;;:14;:26;;;;;:41;;41475:11;;41445:26;:41;;41475:11;;41445:41;:::i;:::-;;;;-1:-1:-1;;41515:14:0;;:28;;41532:11;;41515:28;:::i;:::-;41498:14;:45;41554:34;41564:10;41576:11;41554:9;:34::i;28991:155::-;29086:52;4827:10;29119:8;29129;29086:18;:52::i;39795:31::-;;;;;;;:::i;30111:323::-;30285:41;4827:10;30318:7;30285:18;:41::i;:::-;30277:100;;;;-1:-1:-1;;;30277:100:0;;;;;;;:::i;:::-;30388:38;30402:4;30408:2;30412:7;30421:4;30388:13;:38::i;:::-;30111:323;;;;:::o;43229:146::-;6082:13;:11;:13::i;:::-;43321:22:::1;:48:::0;43229:146::o;42383:494::-;32006:4;32030:16;;;:7;:16;;;;;;42482:13;;-1:-1:-1;;;;;32030:16:0;42507:98;;;;-1:-1:-1;;;42507:98:0;;12653:2:1;42507:98:0;;;12635:21:1;12692:2;12672:18;;;12665:30;12731:34;12711:18;;;12704:62;-1:-1:-1;;;12782:18:1;;;12775:45;12837:19;;42507:98:0;12451:411:1;42507:98:0;42618:8;;;;;;;:17;;42630:5;42618:17;42614:64;;42653:17;42646:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42383:494;;;:::o;42614:64::-;42686:28;42717:10;:8;:10::i;:::-;42686:41;;42772:1;42747:14;42741:28;:32;:130;;;;;;;;;;;;;;;;;42809:14;42825:19;:8;:17;:19::i;:::-;42846:9;42792:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;42741:130;42734:137;42383:494;-1:-1:-1;;;42383:494:0:o;42883:81::-;6082:13;:11;:13::i;:::-;42941:8:::1;:17:::0;;;::::1;;;;-1:-1:-1::0;;42941:17:0;;::::1;::::0;;;::::1;::::0;;42883:81::o;41609:127::-;6082:13;:11;:13::i;:::-;41697:33:::1;41707:9;41718:11;41697:9;:33::i;7102:201::-:0;6082:13;:11;:13::i;:::-;-1:-1:-1;;;;;7191:22:0;::::1;7183:73;;;::::0;-1:-1:-1;;;7183:73:0;;14727:2:1;7183:73:0::1;::::0;::::1;14709:21:1::0;14766:2;14746:18;;;14739:30;14805:34;14785:18;;;14778:62;-1:-1:-1;;;14856:18:1;;;14849:36;14902:19;;7183:73:0::1;14525:402:1::0;7183:73:0::1;7267:28;7286:8;7267:18;:28::i;6361:132::-:0;6269:6;;-1:-1:-1;;;;;6269:6:0;4827:10;6425:23;6417:68;;;;-1:-1:-1;;;6417:68:0;;15134:2:1;6417:68:0;;;15116:21:1;;;15153:18;;;15146:30;15212:34;15192:18;;;15185:62;15264:18;;6417:68:0;14932:356:1;36723:135:0;32006:4;32030:16;;;:7;:16;;;;;;-1:-1:-1;;;;;32030:16:0;36797:53;;;;-1:-1:-1;;;36797:53:0;;8995:2:1;36797:53:0;;;8977:21:1;9034:2;9014:18;;;9007:30;-1:-1:-1;;;9053:18:1;;;9046:54;9117:18;;36797:53:0;8793:348:1;36002:174:0;36077:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;36077:29:0;-1:-1:-1;;;;;36077:29:0;;;;;;;;:24;;36131:23;36077:24;36131:14;:23::i;:::-;-1:-1:-1;;;;;36122:46:0;;;;;;;;;;;36002:174;;:::o;32235:264::-;32328:4;32345:13;32361:23;32376:7;32361:14;:23::i;:::-;32345:39;;32414:5;-1:-1:-1;;;;;32403:16:0;:7;-1:-1:-1;;;;;32403:16:0;;:52;;;-1:-1:-1;;;;;;29338:25:0;;;29314:4;29338:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;32423:32;32403:87;;;;32483:7;-1:-1:-1;;;;;32459:31:0;:20;32471:7;32459:11;:20::i;:::-;-1:-1:-1;;;;;32459:31:0;;32403:87;32395:96;32235:264;-1:-1:-1;;;;32235:264:0:o;35258:625::-;35417:4;-1:-1:-1;;;;;35390:31:0;:23;35405:7;35390:14;:23::i;:::-;-1:-1:-1;;;;;35390:31:0;;35382:81;;;;-1:-1:-1;;;35382:81:0;;15495:2:1;35382:81:0;;;15477:21:1;15534:2;15514:18;;;15507:30;15573:34;15553:18;;;15546:62;-1:-1:-1;;;15624:18:1;;;15617:35;15669:19;;35382:81:0;15293:401:1;35382:81:0;-1:-1:-1;;;;;35482:16:0;;35474:65;;;;-1:-1:-1;;;35474:65:0;;15901:2:1;35474:65:0;;;15883:21:1;15940:2;15920:18;;;15913:30;15979:34;15959:18;;;15952:62;-1:-1:-1;;;16030:18:1;;;16023:34;16074:19;;35474:65:0;15699:400:1;35474:65:0;35656:29;35673:1;35677:7;35656:8;:29::i;:::-;-1:-1:-1;;;;;35698:15:0;;;;;;:9;:15;;;;;:20;;35717:1;;35698:15;:20;;35717:1;;35698:20;:::i;:::-;;;;-1:-1:-1;;;;;;;35729:13:0;;;;;;:9;:13;;;;;:18;;35746:1;;35729:13;:18;;35746:1;;35729:18;:::i;:::-;;;;-1:-1:-1;;35758:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;35758:21:0;-1:-1:-1;;;;;35758:21:0;;;;;;;;;35797:27;;35758:16;;35797:27;;;;;;;28335:347;28265:417;;:::o;7463:191::-;7556:6;;;-1:-1:-1;;;;;7573:17:0;;;-1:-1:-1;;;;;;7573:17:0;;;;;;;7606:40;;7556:6;;;7573:17;7556:6;;7606:40;;7537:16;;7606:40;7526:128;7463:191;:::o;44309:204::-;44389:9;44384:124;44408:11;44404:1;:15;44384:124;;;44435:18;:6;1189:19;;1207:1;1189:19;;;1100:127;44435:18;44462:38;44472:9;44483:16;:6;1070:14;;978:114;44483:16;44462:9;:38::i;:::-;44421:3;;;;:::i;:::-;;;;44384:124;;36319:315;36474:8;-1:-1:-1;;;;;36465:17:0;:5;-1:-1:-1;;;;;36465:17:0;;36457:55;;;;-1:-1:-1;;;36457:55:0;;16306:2:1;36457:55:0;;;16288:21:1;16345:2;16325:18;;;16318:30;16384:27;16364:18;;;16357:55;16429:18;;36457:55:0;16104:349:1;36457:55:0;-1:-1:-1;;;;;36523:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;36523:46:0;;;;;;;;;;36585:41;;1276::1;;;36585::0;;1249:18:1;36585:41:0;;;;;;;36319:315;;;:::o;31315:313::-;31471:28;31481:4;31487:2;31491:7;31471:9;:28::i;:::-;31518:47;31541:4;31547:2;31551:7;31560:4;31518:22;:47::i;:::-;31510:110;;;;-1:-1:-1;;;31510:110:0;;;;;;;:::i;44519:104::-;44579:13;44608:9;44601:16;;;;;:::i;2001:723::-;2057:13;2278:5;2287:1;2278:10;2274:53;;-1:-1:-1;;2305:10:0;;;;;;;;;;;;-1:-1:-1;;;2305:10:0;;;;;2001:723::o;2274:53::-;2352:5;2337:12;2393:78;2400:9;;2393:78;;2426:8;;;;:::i;:::-;;-1:-1:-1;2449:10:0;;-1:-1:-1;2457:2:0;2449:10;;:::i;:::-;;;2393:78;;;2481:19;2513:6;2503:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2503:17:0;;2481:39;;2531:154;2538:10;;2531:154;;2565:11;2575:1;2565:11;;:::i;:::-;;-1:-1:-1;2634:10:0;2642:2;2634:5;:10;:::i;:::-;2621:24;;:2;:24;:::i;:::-;2608:39;;2591:6;2598;2591:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;2591:56:0;;;;;;;;-1:-1:-1;2662:11:0;2671:2;2662:11;;:::i;:::-;;;2531:154;;32841:110;32917:26;32927:2;32931:7;32917:26;;;;;;;;;;;;:9;:26::i;37422:853::-;37576:4;-1:-1:-1;;;;;37597:13:0;;9189:19;:23;37593:675;;37633:71;;-1:-1:-1;;;37633:71:0;;-1:-1:-1;;;;;37633:36:0;;;;;:71;;4827:10;;37684:4;;37690:7;;37699:4;;37633:71;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37633:71:0;;;;;;;;-1:-1:-1;;37633:71:0;;;;;;;;;;;;:::i;:::-;;;37629:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37874:6;:13;37891:1;37874:18;37870:328;;37917:60;;-1:-1:-1;;;37917:60:0;;;;;;;:::i;37870:328::-;38148:6;38142:13;38133:6;38129:2;38125:15;38118:38;37629:584;-1:-1:-1;;;;;;37755:51:0;-1:-1:-1;;;37755:51:0;;-1:-1:-1;37748:58:0;;37593:675;-1:-1:-1;38252:4:0;37422:853;;;;;;:::o;33178:319::-;33307:18;33313:2;33317:7;33307:5;:18::i;:::-;33358:53;33389:1;33393:2;33397:7;33406:4;33358:22;:53::i;:::-;33336:153;;;;-1:-1:-1;;;33336:153:0;;;;;;;:::i;33833:439::-;-1:-1:-1;;;;;33913:16:0;;33905:61;;;;-1:-1:-1;;;33905:61:0;;18201:2:1;33905:61:0;;;18183:21:1;;;18220:18;;;18213:30;18279:34;18259:18;;;18252:62;18331:18;;33905:61:0;17999:356:1;33905:61:0;32006:4;32030:16;;;:7;:16;;;;;;-1:-1:-1;;;;;32030:16:0;:30;33977:58;;;;-1:-1:-1;;;33977:58:0;;18562:2:1;33977:58:0;;;18544:21:1;18601:2;18581:18;;;18574:30;18640;18620:18;;;18613:58;18688:18;;33977:58:0;18360:352:1;33977:58:0;-1:-1:-1;;;;;34106:13:0;;;;;;:9;:13;;;;;:18;;34123:1;;34106:13;:18;;34123:1;;34106:18;:::i;:::-;;;;-1:-1:-1;;34135:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;34135:21:0;-1:-1:-1;;;;;34135:21:0;;;;;;;;34174:33;;34135:16;;;34174:33;;34135:16;;34174:33;44049:22:::1;43977:100:::0;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:173:1;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:186::-;251:6;304:2;292:9;283:7;279:23;275:32;272:52;;;320:1;317;310:12;272:52;343:29;362:9;343:29;:::i;565:180::-;624:6;677:2;665:9;656:7;652:23;648:32;645:52;;;693:1;690;683:12;645:52;-1:-1:-1;716:23:1;;565:180;-1:-1:-1;565:180:1:o;750:131::-;-1:-1:-1;;;;;;824:32:1;;814:43;;804:71;;871:1;868;861:12;886:245;944:6;997:2;985:9;976:7;972:23;968:32;965:52;;;1013:1;1010;1003:12;965:52;1052:9;1039:23;1071:30;1095:5;1071:30;:::i;1328:258::-;1400:1;1410:113;1424:6;1421:1;1418:13;1410:113;;;1500:11;;;1494:18;1481:11;;;1474:39;1446:2;1439:10;1410:113;;;1541:6;1538:1;1535:13;1532:48;;;-1:-1:-1;;1576:1:1;1558:16;;1551:27;1328:258::o;1591:::-;1633:3;1671:5;1665:12;1698:6;1693:3;1686:19;1714:63;1770:6;1763:4;1758:3;1754:14;1747:4;1740:5;1736:16;1714:63;:::i;:::-;1831:2;1810:15;-1:-1:-1;;1806:29:1;1797:39;;;;1838:4;1793:50;;1591:258;-1:-1:-1;;1591:258:1:o;1854:220::-;2003:2;1992:9;1985:21;1966:4;2023:45;2064:2;2053:9;2049:18;2041:6;2023:45;:::i;2287:254::-;2355:6;2363;2416:2;2404:9;2395:7;2391:23;2387:32;2384:52;;;2432:1;2429;2422:12;2384:52;2455:29;2474:9;2455:29;:::i;:::-;2445:39;2531:2;2516:18;;;;2503:32;;-1:-1:-1;;;2287:254:1:o;2546:127::-;2607:10;2602:3;2598:20;2595:1;2588:31;2638:4;2635:1;2628:15;2662:4;2659:1;2652:15;2678:632;2743:5;2773:18;2814:2;2806:6;2803:14;2800:40;;;2820:18;;:::i;:::-;2895:2;2889:9;2863:2;2949:15;;-1:-1:-1;;2945:24:1;;;2971:2;2941:33;2937:42;2925:55;;;2995:18;;;3015:22;;;2992:46;2989:72;;;3041:18;;:::i;:::-;3081:10;3077:2;3070:22;3110:6;3101:15;;3140:6;3132;3125:22;3180:3;3171:6;3166:3;3162:16;3159:25;3156:45;;;3197:1;3194;3187:12;3156:45;3247:6;3242:3;3235:4;3227:6;3223:17;3210:44;3302:1;3295:4;3286:6;3278;3274:19;3270:30;3263:41;;;;2678:632;;;;;:::o;3315:451::-;3384:6;3437:2;3425:9;3416:7;3412:23;3408:32;3405:52;;;3453:1;3450;3443:12;3405:52;3493:9;3480:23;3526:18;3518:6;3515:30;3512:50;;;3558:1;3555;3548:12;3512:50;3581:22;;3634:4;3626:13;;3622:27;-1:-1:-1;3612:55:1;;3663:1;3660;3653:12;3612:55;3686:74;3752:7;3747:2;3734:16;3729:2;3725;3721:11;3686:74;:::i;3771:160::-;3836:20;;3892:13;;3885:21;3875:32;;3865:60;;3921:1;3918;3911:12;3936:180;3992:6;4045:2;4033:9;4024:7;4020:23;4016:32;4013:52;;;4061:1;4058;4051:12;4013:52;4084:26;4100:9;4084:26;:::i;4121:328::-;4198:6;4206;4214;4267:2;4255:9;4246:7;4242:23;4238:32;4235:52;;;4283:1;4280;4273:12;4235:52;4306:29;4325:9;4306:29;:::i;:::-;4296:39;;4354:38;4388:2;4377:9;4373:18;4354:38;:::i;:::-;4344:48;;4439:2;4428:9;4424:18;4411:32;4401:42;;4121:328;;;;;:::o;4454:632::-;4625:2;4677:21;;;4747:13;;4650:18;;;4769:22;;;4596:4;;4625:2;4848:15;;;;4822:2;4807:18;;;4596:4;4891:169;4905:6;4902:1;4899:13;4891:169;;;4966:13;;4954:26;;5035:15;;;;5000:12;;;;4927:1;4920:9;4891:169;;;-1:-1:-1;5077:3:1;;4454:632;-1:-1:-1;;;;;;4454:632:1:o;5091:254::-;5156:6;5164;5217:2;5205:9;5196:7;5192:23;5188:32;5185:52;;;5233:1;5230;5223:12;5185:52;5256:29;5275:9;5256:29;:::i;:::-;5246:39;;5304:35;5335:2;5324:9;5320:18;5304:35;:::i;:::-;5294:45;;5091:254;;;;;:::o;5350:667::-;5445:6;5453;5461;5469;5522:3;5510:9;5501:7;5497:23;5493:33;5490:53;;;5539:1;5536;5529:12;5490:53;5562:29;5581:9;5562:29;:::i;:::-;5552:39;;5610:38;5644:2;5633:9;5629:18;5610:38;:::i;:::-;5600:48;;5695:2;5684:9;5680:18;5667:32;5657:42;;5750:2;5739:9;5735:18;5722:32;5777:18;5769:6;5766:30;5763:50;;;5809:1;5806;5799:12;5763:50;5832:22;;5885:4;5877:13;;5873:27;-1:-1:-1;5863:55:1;;5914:1;5911;5904:12;5863:55;5937:74;6003:7;5998:2;5985:16;5980:2;5976;5972:11;5937:74;:::i;:::-;5927:84;;;5350:667;;;;;;;:::o;6022:260::-;6090:6;6098;6151:2;6139:9;6130:7;6126:23;6122:32;6119:52;;;6167:1;6164;6157:12;6119:52;6190:29;6209:9;6190:29;:::i;:::-;6180:39;;6238:38;6272:2;6261:9;6257:18;6238:38;:::i;6287:254::-;6355:6;6363;6416:2;6404:9;6395:7;6391:23;6387:32;6384:52;;;6432:1;6429;6422:12;6384:52;6468:9;6455:23;6445:33;;6497:38;6531:2;6520:9;6516:18;6497:38;:::i;6546:380::-;6625:1;6621:12;;;;6668;;;6689:61;;6743:4;6735:6;6731:17;6721:27;;6689:61;6796:2;6788:6;6785:14;6765:18;6762:38;6759:161;;6842:10;6837:3;6833:20;6830:1;6823:31;6877:4;6874:1;6867:15;6905:4;6902:1;6895:15;6759:161;;6546:380;;;:::o;7764:410::-;7966:2;7948:21;;;8005:2;7985:18;;;7978:30;8044:34;8039:2;8024:18;;8017:62;-1:-1:-1;;;8110:2:1;8095:18;;8088:44;8164:3;8149:19;;7764:410::o;8389:127::-;8450:10;8445:3;8441:20;8438:1;8431:31;8481:4;8478:1;8471:15;8505:4;8502:1;8495:15;8521:127;8582:10;8577:3;8573:20;8570:1;8563:31;8613:4;8610:1;8603:15;8637:4;8634:1;8627:15;8653:135;8692:3;8713:17;;;8710:43;;8733:18;;:::i;:::-;-1:-1:-1;8780:1:1;8769:13;;8653:135::o;9908:168::-;9948:7;10014:1;10010;10006:6;10002:14;9999:1;9996:21;9991:1;9984:9;9977:17;9973:45;9970:71;;;10021:18;;:::i;:::-;-1:-1:-1;10061:9:1;;9908:168::o;10429:128::-;10469:3;10500:1;10496:6;10493:1;10490:13;10487:39;;;10506:18;;:::i;:::-;-1:-1:-1;10542:9:1;;10429:128::o;11615:125::-;11655:4;11683:1;11680;11677:8;11674:34;;;11688:18;;:::i;:::-;-1:-1:-1;11725:9:1;;11615:125::o;12993:1527::-;13217:3;13255:6;13249:13;13281:4;13294:51;13338:6;13333:3;13328:2;13320:6;13316:15;13294:51;:::i;:::-;13408:13;;13367:16;;;;13430:55;13408:13;13367:16;13452:15;;;13430:55;:::i;:::-;13574:13;;13507:20;;;13547:1;;13634;13656:18;;;;13709;;;;13736:93;;13814:4;13804:8;13800:19;13788:31;;13736:93;13877:2;13867:8;13864:16;13844:18;13841:40;13838:167;;-1:-1:-1;;;13904:33:1;;13960:4;13957:1;13950:15;13990:4;13911:3;13978:17;13838:167;14021:18;14048:110;;;;14172:1;14167:328;;;;14014:481;;14048:110;-1:-1:-1;;14083:24:1;;14069:39;;14128:20;;;;-1:-1:-1;14048:110:1;;14167:328;12940:1;12933:14;;;12977:4;12964:18;;14262:1;14276:169;14290:8;14287:1;14284:15;14276:169;;;14372:14;;14357:13;;;14350:37;14415:16;;;;14307:10;;14276:169;;;14280:3;;14476:8;14469:5;14465:20;14458:27;;14014:481;-1:-1:-1;14511:3:1;;12993:1527;-1:-1:-1;;;;;;;;;;;12993:1527:1:o;16458:414::-;16660:2;16642:21;;;16699:2;16679:18;;;16672:30;16738:34;16733:2;16718:18;;16711:62;-1:-1:-1;;;16804:2:1;16789:18;;16782:48;16862:3;16847:19;;16458:414::o;16877:127::-;16938:10;16933:3;16929:20;16926:1;16919:31;16969:4;16966:1;16959:15;16993:4;16990:1;16983:15;17009:120;17049:1;17075;17065:35;;17080:18;;:::i;:::-;-1:-1:-1;17114:9:1;;17009:120::o;17134:112::-;17166:1;17192;17182:35;;17197:18;;:::i;:::-;-1:-1:-1;17231:9:1;;17134:112::o;17251:489::-;-1:-1:-1;;;;;17520:15:1;;;17502:34;;17572:15;;17567:2;17552:18;;17545:43;17619:2;17604:18;;17597:34;;;17667:3;17662:2;17647:18;;17640:31;;;17445:4;;17688:46;;17714:19;;17706:6;17688:46;:::i;:::-;17680:54;17251:489;-1:-1:-1;;;;;;17251:489:1:o;17745:249::-;17814:6;17867:2;17855:9;17846:7;17842:23;17838:32;17835:52;;;17883:1;17880;17873:12;17835:52;17915:9;17909:16;17934:30;17958:5;17934:30;:::i
Swarm Source
ipfs://9236a28a44cda835aaf20a03a54f84930f4228222fe36be9111bdc3fa005bd1b
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.