ERC-721
Overview
Max Total Supply
8 Froggys
Holders
5
Total Transfers
-
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
TMF_NFT
Compiler Version
v0.8.19+commit.7dd6d404
Contract Source Code (Solidity Multiple files format)
//SPDX-License-Identifier: Copyright The Money Frog pragma solidity ^0.8.0; import "./ERC721.sol"; import "./ERC721Enumerable.sol"; import "./ERC721Burnable.sol"; import "./ERC721Pausable.sol"; import "./ERC721URIStorage.sol"; import "./Context.sol"; import "./Strings.sol"; import "./Counters.sol"; interface INFTContract { function getMaxSupply() external view returns (uint max); function getMinted() external view returns (uint minted); function getMintPrice() external view returns (uint mintPrice); function recoverETH () external; function mintMany(uint256 quantity) external payable; function setMintingEnabled(bool Allowed) external; } abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); constructor() { _setOwner(_msgSender()); } function owner() public view virtual returns (address) { return _owner; } modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } function renounceOwnership() public virtual onlyOwner { _setOwner(address(0)); } function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } /** * @dev {ERC721} token, including: * * - ability for holders to burn (destroy) their tokens * - a minter role that allows for token minting (creation) * - token ID and URI autogenerationA * * This contract uses {AccessControl} to lock permissioned functions using the * different roles - head to its documentation for details. * * The account that deploys the contract will be granted the minter and pauser * roles, as well as the default admin role, which will let it grant both minter * and pauser roles to other accounts. */ contract TMF_NFT is Context, Ownable, ERC721Enumerable, ERC721URIStorage, INFTContract { using Counters for Counters.Counter; Counters.Counter public _tokenIdTracker; string private _baseTokenURI = "https://bafybeiaeownr6kwelf7tu2gdc6jqsge364kemanszulbgoa6kdhf3ceyny.ipfs.nftstorage.link/"; string public _contractMeta = "https://bafkreidaz36rqnwhejcs5hpyzmjovuytdb4zdwjjqjt264mkkd5q5ilwqq.ipfs.nftstorage.link/"; uint private _tokenPrice = 33000000000000000; // 0.033 ETH uint public maxSupply = 333; bool public canMint = false; address public marketingWallet = 0xC2bc6Ec9f8F81319AB82Cc9DB016E490b683335d; mapping (uint256 => address ) public creator; constructor() ERC721("The Money Frog NFTs", "Froggys") { } receive () external payable { payable(marketingWallet).transfer(msg.value); } function setMarketingWallet(address _marketingWallet) public onlyOwner { marketingWallet = _marketingWallet; } function contractURI() public view returns (string memory) { return _contractMeta; } function SetcontractURI(string calldata URI) external onlyOwner { _contractMeta = URI; } function SetMintPrice(uint256 _mintPrice) external onlyOwner { _tokenPrice = _mintPrice; } function getMinted() external view override returns (uint minted){ return _tokenIdTracker.current()-1; } function getMaxSupply() external view override returns (uint max){ return maxSupply; } function getMintPrice() external view override returns (uint mintPrice){ return _tokenPrice; } function _baseURI() internal view virtual override returns (string memory) { return _baseTokenURI; } function setBaseURI(string memory baseURI) external onlyOwner { _baseTokenURI = baseURI; } function setTokenURI(uint256 tokenId, string memory _tokenURI) external onlyOwner { _setTokenURI(tokenId, _tokenURI); } function setMintingEnabled(bool Allowed) external override onlyOwner { canMint = Allowed; } function mint() external payable { require(canMint, "TMF: minting currently disabled"); require(msg.value >= (_tokenPrice), "TMF: must send correct price"); require((_tokenIdTracker.current()) <= maxSupply, "TMF: all NFTs have been minted"); _mint(msg.sender, _tokenIdTracker.current()); creator[_tokenIdTracker.current()] = msg.sender; _setTokenURI(_tokenIdTracker.current(), string(abi.encodePacked(Strings.toString(_tokenIdTracker.current()), ".json"))); _tokenIdTracker.increment(); splitBalance(1); } function mintMany(uint256 quantity) external payable override { require(canMint, "TMF: minting currently disabled"); require(msg.value >= (quantity * _tokenPrice), "TMF: must send correct price"); require((_tokenIdTracker.current() + quantity) <= maxSupply, "TMF: all NFTs have been minted"); for(uint i = 0; i < quantity; i++){ _mint(msg.sender, _tokenIdTracker.current()); creator[_tokenIdTracker.current()] = msg.sender; _setTokenURI(_tokenIdTracker.current(), string(abi.encodePacked(Strings.toString(_tokenIdTracker.current()), ".json"))); _tokenIdTracker.increment(); } splitBalance(quantity); } function mintMultiples(address[] calldata recipients) public onlyOwner { for (uint256 i = 0; i < recipients.length; i++){ _mint(recipients[i], _tokenIdTracker.current()); creator[_tokenIdTracker.current()] = recipients[i]; _setTokenURI(_tokenIdTracker.current(), string(abi.encodePacked(Strings.toString(_tokenIdTracker.current()), ".json"))); _tokenIdTracker.increment(); } } function NftCreator(uint256 tokenId) public view returns(address){ return creator[tokenId]; } function _burn(uint256 tokenId) internal virtual override(ERC721, ERC721URIStorage) { return ERC721URIStorage._burn(tokenId); } function tokenURI(uint256 tokenId) public view override(ERC721, ERC721URIStorage) returns (string memory) { return ERC721URIStorage.tokenURI(tokenId); } function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual override(ERC721, ERC721Enumerable) { super._beforeTokenTransfer(from, to, tokenId); } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override( ERC721, ERC721Enumerable) returns (bool) { return super.supportsInterface(interfaceId); } function recoverETH () external override onlyOwner { // make sure we capture all ETH that may or may not be sent to this contract payable(msg.sender).transfer(address(this).balance); } function splitBalance(uint256 amount) private { uint totalETH = amount * _tokenPrice; // get the total token price to sell for reflection purchases payable(marketingWallet).transfer(totalETH); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented or decremented by one. 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+1; } 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; } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping (bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement. bytes32 lastvalue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastvalue; // Update the index for the moved value set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { require(set._values.length > index, "EnumerableSet: index out of bounds"); return set._values[index]; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC721.sol"; import "./IERC721Receiver.sol"; import "./IERC721Metadata.sol"; import "./IERC721Enumerable.sol"; import "./Address.sol"; import "./Context.sol"; import "./Strings.sol"; import "./ERC165.sol"; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping (uint256 => address) private _owners; // Mapping owner address to token count mapping (address => uint256) private _balances; // Mapping from token ID to approved address mapping (uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping (address => mapping (address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor (string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ''; } /** * @dev Base URI for computing {tokenURI}. Empty by default, can be overriden * in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require(_msgSender() == owner || ERC721.isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom(address from, address to, uint256 tokenId) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer(address from, address to, uint256 tokenId, bytes memory _data) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || ERC721.isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint(address to, uint256 tokenId, bytes memory _data) internal virtual { _mint(to, tokenId); require(_checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer(address from, address to, uint256 tokenId) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory _data) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { // solhint-disable-next-line no-inline-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual { } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./ERC721.sol"; import "./Context.sol"; /** * @title ERC721 Burnable Token * @dev ERC721 Token that can be irreversibly burned (destroyed). */ abstract contract ERC721Burnable is Context, ERC721 { /** * @dev Burns `tokenId`. See {ERC721-_burn}. * * Requirements: * * - The caller must own `tokenId` or be an approved operator. */ function burn(uint256 tokenId) public virtual { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721Burnable: caller is not owner nor approved"); _burn(tokenId); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./ERC721.sol"; import "./IERC721Enumerable.sol"; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./ERC721.sol"; import "./Pausable.sol"; /** * @dev ERC721 token with pausable token transfers, minting and burning. * * Useful for scenarios such as preventing trades until the end of an evaluation * period, or having an emergency switch for freezing all token transfers in the * event of a large bug. */ abstract contract ERC721Pausable is ERC721, Pausable { /** * @dev See {ERC721-_beforeTokenTransfer}. * * Requirements: * * - the contract must not be paused. */ function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); require(!paused(), "ERC721Pausable: token transfer while paused"); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./ERC721.sol"; /** * @dev ERC721 token with storage based token uri management. */ abstract contract ERC721URIStorage is ERC721 { using Strings for uint256; // Optional mapping for token URIs mapping (uint256 => string) private _tokenURIs; /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721URIStorage: URI query for nonexistent token"); string memory _tokenURI = _tokenURIs[tokenId]; string memory base = _baseURI(); // If there is no base URI, return the token URI. if (bytes(base).length == 0) { return _tokenURI; } // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked). if (bytes(_tokenURI).length > 0) { return string(abi.encodePacked(base, _tokenURI)); } return super.tokenURI(tokenId); } /** * @dev Sets `_tokenURI` as the tokenURI of `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual { require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token"); _tokenURIs[tokenId] = _tokenURI; } /** * @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 override { super._burn(tokenId); if (bytes(_tokenURIs[tokenId]).length != 0) { delete _tokenURIs[tokenId]; } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 tokenId) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./Context.sol"; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor () { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant alphabet = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = alphabet[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } }
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":"uint256","name":"tokenId","type":"uint256"}],"name":"NftCreator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintPrice","type":"uint256"}],"name":"SetMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"URI","type":"string"}],"name":"SetcontractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"_contractMeta","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_tokenIdTracker","outputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"canMint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"creator","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"getMaxSupply","outputs":[{"internalType":"uint256","name":"max","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMintPrice","outputs":[{"internalType":"uint256","name":"mintPrice","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMinted","outputs":[{"internalType":"uint256","name":"minted","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mintMany","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"}],"name":"mintMultiples","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"recoverETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_marketingWallet","type":"address"}],"name":"setMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"Allowed","type":"bool"}],"name":"setMintingEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"_tokenURI","type":"string"}],"name":"setTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
610100604052605960808181529062002d9b60a039600d9062000023908262000223565b5060405180608001604052806059815260200162002df460599139600e906200004d908262000223565b5066753d533d968000600f5561014d601055601180546001600160a81b03191674c2bc6ec9f8f81319ab82cc9db016e490b683335d001790553480156200009357600080fd5b506040518060400160405280601381526020017f546865204d6f6e65792046726f67204e465473000000000000000000000000008152506040518060400160405280600781526020016646726f6767797360c81b81525062000104620000fe6200012a60201b60201c565b6200012e565b600162000112838262000223565b50600262000121828262000223565b505050620002ef565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620001a957607f821691505b602082108103620001ca57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200021e57600081815260208120601f850160051c81016020861015620001f95750805b601f850160051c820191505b818110156200021a5782815560010162000205565b5050505b505050565b81516001600160401b038111156200023f576200023f6200017e565b620002578162000250845462000194565b84620001d0565b602080601f8311600181146200028f5760008415620002765750858301515b600019600386901b1c1916600185901b1785556200021a565b600085815260208120601f198616915b82811015620002c0578886015182559484019460019091019084016200029f565b5085821015620002df5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b612a9c80620002ff6000396000f3fe60806040526004361061023f5760003560e01c80635d098b381161012e578063a7f93ebd116100ab578063c87b56dd1161006f578063c87b56dd146106c7578063d5abeb01146106e7578063e8a3d485146106fd578063e985e9c514610712578063f2fde38b1461075b57600080fd5b8063a7f93ebd1461062d578063ac72200d14610642578063b753081914610657578063b88d4fde1461068d578063beb9716d146106ad57600080fd5b806375f0a874116100f257806375f0a8741461059e5780638da5cb5b146105c357806395d89b41146105e157806398bcede9146105f6578063a22cb4651461060d57600080fd5b80635d098b38146105095780636352211e14610529578063653088cf1461054957806370a0823114610569578063715018a61461058957600080fd5b80631e1a1e76116101bc5780634c0f38c2116101805780634c0f38c21461045e5780634ea3871a146104735780634f6ccce714610493578063510b5158146104b357806355f804b3146104e957600080fd5b80631e1a1e76146103c957806323b872dd146103e95780632f745c591461040957806342842e0e1461042957806343e61a411461044957600080fd5b8063081812fc11610203578063081812fc1461032a578063095ea7b3146103625780631249c58b14610382578063162094c41461038a57806318160ddd146103aa57600080fd5b806301ffc9a71461028b57806302ebcb79146102c0578063059513a6146102e05780630614117a146102f357806306fdde031461030857600080fd5b36610286576011546040516001600160a01b0361010090920491909116903480156108fc02916000818181858888f19350505050158015610284573d6000803e3d6000fd5b005b600080fd5b34801561029757600080fd5b506102ab6102a63660046121c6565b61077b565b60405190151581526020015b60405180910390f35b3480156102cc57600080fd5b506102846102db3660046121e3565b61078c565b6102846102ee3660046121e3565b6107c4565b3480156102ff57600080fd5b506102846109a7565b34801561031457600080fd5b5061031d6109fd565b6040516102b7919061224c565b34801561033657600080fd5b5061034a6103453660046121e3565b610a8f565b6040516001600160a01b0390911681526020016102b7565b34801561036e57600080fd5b5061028461037d36600461227b565b610b17565b610284610c2c565b34801561039657600080fd5b506102846103a5366004612351565b610da1565b3480156103b657600080fd5b506009545b6040519081526020016102b7565b3480156103d557600080fd5b506102846103e4366004612398565b610dd9565b3480156103f557600080fd5b5061028461040436600461240d565b610ed6565b34801561041557600080fd5b506103bb61042436600461227b565b610f07565b34801561043557600080fd5b5061028461044436600461240d565b610f9d565b34801561045557600080fd5b5061031d610fb8565b34801561046a57600080fd5b506010546103bb565b34801561047f57600080fd5b5061028461048e366004612459565b611046565b34801561049f57600080fd5b506103bb6104ae3660046121e3565b611083565b3480156104bf57600080fd5b5061034a6104ce3660046121e3565b6012602052600090815260409020546001600160a01b031681565b3480156104f557600080fd5b50610284610504366004612474565b611116565b34801561051557600080fd5b506102846105243660046124a9565b61114c565b34801561053557600080fd5b5061034a6105443660046121e3565b61119e565b34801561055557600080fd5b506102846105643660046124c4565b611215565b34801561057557600080fd5b506103bb6105843660046124a9565b61124c565b34801561059557600080fd5b506102846112d3565b3480156105aa57600080fd5b5060115461034a9061010090046001600160a01b031681565b3480156105cf57600080fd5b506000546001600160a01b031661034a565b3480156105ed57600080fd5b5061031d611307565b34801561060257600080fd5b50600c546103bb9081565b34801561061957600080fd5b50610284610628366004612524565b611316565b34801561063957600080fd5b50600f546103bb565b34801561064e57600080fd5b506103bb6113da565b34801561066357600080fd5b5061034a6106723660046121e3565b6000908152601260205260409020546001600160a01b031690565b34801561069957600080fd5b506102846106a8366004612557565b6113f7565b3480156106b957600080fd5b506011546102ab9060ff1681565b3480156106d357600080fd5b5061031d6106e23660046121e3565b61142f565b3480156106f357600080fd5b506103bb60105481565b34801561070957600080fd5b5061031d61143a565b34801561071e57600080fd5b506102ab61072d3660046125d3565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b34801561076757600080fd5b506102846107763660046124a9565b611449565b6000610786826114e1565b92915050565b6000546001600160a01b031633146107bf5760405162461bcd60e51b81526004016107b6906125fd565b60405180910390fd5b600f55565b60115460ff166108165760405162461bcd60e51b815260206004820152601f60248201527f544d463a206d696e74696e672063757272656e746c792064697361626c65640060448201526064016107b6565b600f546108239082612648565b3410156108725760405162461bcd60e51b815260206004820152601c60248201527f544d463a206d7573742073656e6420636f72726563742070726963650000000060448201526064016107b6565b60105481610880600c611506565b61088a919061265f565b11156108d85760405162461bcd60e51b815260206004820152601e60248201527f544d463a20616c6c204e4654732068617665206265656e206d696e746564000060448201526064016107b6565b60005b8181101561099a576108f6336108f1600c611506565b611516565b3360126000610905600c611506565b815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555061097a610944600c611506565b610956610951600c611506565b611655565b6040516020016109669190612672565b60405160208183030381529060405261175e565b610988600c80546001019055565b806109928161269b565b9150506108db565b506109a4816117e2565b50565b6000546001600160a01b031633146109d15760405162461bcd60e51b81526004016107b6906125fd565b60405133904780156108fc02916000818181858888f193505050501580156109a4573d6000803e3d6000fd5b606060018054610a0c906126b4565b80601f0160208091040260200160405190810160405280929190818152602001828054610a38906126b4565b8015610a855780601f10610a5a57610100808354040283529160200191610a85565b820191906000526020600020905b815481529060010190602001808311610a6857829003601f168201915b5050505050905090565b6000610a9a82611832565b610afb5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016107b6565b506000908152600560205260409020546001600160a01b031690565b6000610b228261119e565b9050806001600160a01b0316836001600160a01b031603610b8f5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016107b6565b336001600160a01b0382161480610bab5750610bab813361072d565b610c1d5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016107b6565b610c27838361184f565b505050565b60115460ff16610c7e5760405162461bcd60e51b815260206004820152601f60248201527f544d463a206d696e74696e672063757272656e746c792064697361626c65640060448201526064016107b6565b600f54341015610cd05760405162461bcd60e51b815260206004820152601c60248201527f544d463a206d7573742073656e6420636f72726563742070726963650000000060448201526064016107b6565b601054610cdd600c611506565b1115610d2b5760405162461bcd60e51b815260206004820152601e60248201527f544d463a20616c6c204e4654732068617665206265656e206d696e746564000060448201526064016107b6565b610d39336108f1600c611506565b3360126000610d48600c611506565b815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b03160217905550610d87610944600c611506565b610d95600c80546001019055565b610d9f60016117e2565b565b6000546001600160a01b03163314610dcb5760405162461bcd60e51b81526004016107b6906125fd565b610dd5828261175e565b5050565b6000546001600160a01b03163314610e035760405162461bcd60e51b81526004016107b6906125fd565b60005b81811015610c2757610e42838383818110610e2357610e236126ee565b9050602002016020810190610e3891906124a9565b6108f1600c611506565b828282818110610e5457610e546126ee565b9050602002016020810190610e6991906124a9565b60126000610e77600c611506565b815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b03160217905550610eb6610944600c611506565b610ec4600c80546001019055565b80610ece8161269b565b915050610e06565b610ee033826118bd565b610efc5760405162461bcd60e51b81526004016107b690612704565b610c278383836119a3565b6000610f128361124c565b8210610f745760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016107b6565b506001600160a01b03919091166000908152600760209081526040808320938352929052205490565b610c27838383604051806020016040528060008152506113f7565b600e8054610fc5906126b4565b80601f0160208091040260200160405190810160405280929190818152602001828054610ff1906126b4565b801561103e5780601f106110135761010080835404028352916020019161103e565b820191906000526020600020905b81548152906001019060200180831161102157829003601f168201915b505050505081565b6000546001600160a01b031633146110705760405162461bcd60e51b81526004016107b6906125fd565b6011805460ff1916911515919091179055565b600061108e60095490565b82106110f15760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016107b6565b60098281548110611104576111046126ee565b90600052602060002001549050919050565b6000546001600160a01b031633146111405760405162461bcd60e51b81526004016107b6906125fd565b600d610dd582826127a3565b6000546001600160a01b031633146111765760405162461bcd60e51b81526004016107b6906125fd565b601180546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6000818152600360205260408120546001600160a01b0316806107865760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016107b6565b6000546001600160a01b0316331461123f5760405162461bcd60e51b81526004016107b6906125fd565b600e610c27828483612863565b60006001600160a01b0382166112b75760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016107b6565b506001600160a01b031660009081526004602052604090205490565b6000546001600160a01b031633146112fd5760405162461bcd60e51b81526004016107b6906125fd565b610d9f6000611b4e565b606060028054610a0c906126b4565b336001600160a01b0383160361136e5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016107b6565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600060016113e8600c611506565b6113f29190612924565b905090565b61140133836118bd565b61141d5760405162461bcd60e51b81526004016107b690612704565b61142984848484611b9e565b50505050565b606061078682611bd1565b6060600e8054610a0c906126b4565b6000546001600160a01b031633146114735760405162461bcd60e51b81526004016107b6906125fd565b6001600160a01b0381166114d85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107b6565b6109a481611b4e565b60006001600160e01b0319821663780e9d6360e01b1480610786575061078682611d32565b805460009061078690600161265f565b6001600160a01b03821661156c5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016107b6565b61157581611832565b156115c25760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016107b6565b6115ce60008383611d82565b6001600160a01b03821660009081526004602052604081208054600192906115f790849061265f565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60608160000361167c5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156116a657806116908161269b565b915061169f9050600a8361294d565b9150611680565b60008167ffffffffffffffff8111156116c1576116c16122a5565b6040519080825280601f01601f1916602001820160405280156116eb576020820181803683370190505b5090505b841561175657611700600183612924565b915061170d600a86612961565b61171890603061265f565b60f81b81838151811061172d5761172d6126ee565b60200101906001600160f81b031916908160001a90535061174f600a8661294d565b94506116ef565b949350505050565b61176782611832565b6117ca5760405162461bcd60e51b815260206004820152602e60248201527f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60448201526d32bc34b9ba32b73a103a37b5b2b760911b60648201526084016107b6565b6000828152600b60205260409020610c2782826127a3565b6000600f54826117f29190612648565b60115460405191925061010090046001600160a01b0316906108fc8315029083906000818181858888f19350505050158015610c27573d6000803e3d6000fd5b6000908152600360205260409020546001600160a01b0316151590565b600081815260056020526040902080546001600160a01b0319166001600160a01b03841690811790915581906118848261119e565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006118c882611832565b6119295760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016107b6565b60006119348361119e565b9050806001600160a01b0316846001600160a01b0316148061196f5750836001600160a01b031661196484610a8f565b6001600160a01b0316145b8061175657506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff16611756565b826001600160a01b03166119b68261119e565b6001600160a01b031614611a1e5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016107b6565b6001600160a01b038216611a805760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016107b6565b611a8b838383611d82565b611a9660008261184f565b6001600160a01b0383166000908152600460205260408120805460019290611abf908490612924565b90915550506001600160a01b0382166000908152600460205260408120805460019290611aed90849061265f565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b611ba98484846119a3565b611bb584848484611d8d565b6114295760405162461bcd60e51b81526004016107b690612975565b6060611bdc82611832565b611c425760405162461bcd60e51b815260206004820152603160248201527f45524337323155524953746f726167653a2055524920717565727920666f72206044820152703737b732bc34b9ba32b73a103a37b5b2b760791b60648201526084016107b6565b6000828152600b602052604081208054611c5b906126b4565b80601f0160208091040260200160405190810160405280929190818152602001828054611c87906126b4565b8015611cd45780601f10611ca957610100808354040283529160200191611cd4565b820191906000526020600020905b815481529060010190602001808311611cb757829003601f168201915b505050505090506000611ce5611e8e565b90508051600003611cf7575092915050565b815115611d29578082604051602001611d119291906129c7565b60405160208183030381529060405292505050919050565b61175684611e9d565b60006001600160e01b031982166380ac58cd60e01b1480611d6357506001600160e01b03198216635b5e139f60e01b145b8061078657506301ffc9a760e01b6001600160e01b0319831614610786565b610c27838383611f68565b60006001600160a01b0384163b15611e8357604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611dd19033908990889088906004016129f6565b6020604051808303816000875af1925050508015611e0c575060408051601f3d908101601f19168201909252611e0991810190612a33565b60015b611e69573d808015611e3a576040519150601f19603f3d011682016040523d82523d6000602084013e611e3f565b606091505b508051600003611e615760405162461bcd60e51b81526004016107b690612975565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611756565b506001949350505050565b6060600d8054610a0c906126b4565b6060611ea882611832565b611f0c5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016107b6565b6000611f16611e8e565b90506000815111611f365760405180602001604052806000815250611f61565b80611f4084611655565b604051602001611f519291906129c7565b6040516020818303038152906040525b9392505050565b6001600160a01b038316611fc357611fbe81600980546000838152600a60205260408120829055600182018355919091527f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af0155565b611fe6565b816001600160a01b0316836001600160a01b031614611fe657611fe68382612020565b6001600160a01b038216611ffd57610c27816120bd565b826001600160a01b0316826001600160a01b031614610c2757610c27828261216c565b6000600161202d8461124c565b6120379190612924565b60008381526008602052604090205490915080821461208a576001600160a01b03841660009081526007602090815260408083208584528252808320548484528184208190558352600890915290208190555b5060009182526008602090815260408084208490556001600160a01b039094168352600781528383209183525290812055565b6009546000906120cf90600190612924565b6000838152600a6020526040812054600980549394509092849081106120f7576120f76126ee565b906000526020600020015490508060098381548110612118576121186126ee565b6000918252602080832090910192909255828152600a9091526040808220849055858252812055600980548061215057612150612a50565b6001900381819060005260206000200160009055905550505050565b60006121778361124c565b6001600160a01b039093166000908152600760209081526040808320868452825280832085905593825260089052919091209190915550565b6001600160e01b0319811681146109a457600080fd5b6000602082840312156121d857600080fd5b8135611f61816121b0565b6000602082840312156121f557600080fd5b5035919050565b60005b838110156122175781810151838201526020016121ff565b50506000910152565b600081518084526122388160208601602086016121fc565b601f01601f19169290920160200192915050565b602081526000611f616020830184612220565b80356001600160a01b038116811461227657600080fd5b919050565b6000806040838503121561228e57600080fd5b6122978361225f565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff808411156122d6576122d66122a5565b604051601f8501601f19908116603f011681019082821181831017156122fe576122fe6122a5565b8160405280935085815286868601111561231757600080fd5b858560208301376000602087830101525050509392505050565b600082601f83011261234257600080fd5b611f61838335602085016122bb565b6000806040838503121561236457600080fd5b82359150602083013567ffffffffffffffff81111561238257600080fd5b61238e85828601612331565b9150509250929050565b600080602083850312156123ab57600080fd5b823567ffffffffffffffff808211156123c357600080fd5b818501915085601f8301126123d757600080fd5b8135818111156123e657600080fd5b8660208260051b85010111156123fb57600080fd5b60209290920196919550909350505050565b60008060006060848603121561242257600080fd5b61242b8461225f565b92506124396020850161225f565b9150604084013590509250925092565b8035801515811461227657600080fd5b60006020828403121561246b57600080fd5b611f6182612449565b60006020828403121561248657600080fd5b813567ffffffffffffffff81111561249d57600080fd5b61175684828501612331565b6000602082840312156124bb57600080fd5b611f618261225f565b600080602083850312156124d757600080fd5b823567ffffffffffffffff808211156124ef57600080fd5b818501915085601f83011261250357600080fd5b81358181111561251257600080fd5b8660208285010111156123fb57600080fd5b6000806040838503121561253757600080fd5b6125408361225f565b915061254e60208401612449565b90509250929050565b6000806000806080858703121561256d57600080fd5b6125768561225f565b93506125846020860161225f565b925060408501359150606085013567ffffffffffffffff8111156125a757600080fd5b8501601f810187136125b857600080fd5b6125c7878235602084016122bb565b91505092959194509250565b600080604083850312156125e657600080fd5b6125ef8361225f565b915061254e6020840161225f565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b808202811582820484141761078657610786612632565b8082018082111561078657610786612632565b600082516126848184602087016121fc565b64173539b7b760d91b920191825250600501919050565b6000600182016126ad576126ad612632565b5060010190565b600181811c908216806126c857607f821691505b6020821081036126e857634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b601f821115610c2757600081815260208120601f850160051c8101602086101561277c5750805b601f850160051c820191505b8181101561279b57828155600101612788565b505050505050565b815167ffffffffffffffff8111156127bd576127bd6122a5565b6127d1816127cb84546126b4565b84612755565b602080601f83116001811461280657600084156127ee5750858301515b600019600386901b1c1916600185901b17855561279b565b600085815260208120601f198616915b8281101561283557888601518255948401946001909101908401612816565b50858210156128535787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b67ffffffffffffffff83111561287b5761287b6122a5565b61288f8361288983546126b4565b83612755565b6000601f8411600181146128c357600085156128ab5750838201355b600019600387901b1c1916600186901b17835561291d565b600083815260209020601f19861690835b828110156128f457868501358255602094850194600190920191016128d4565b50868210156129115760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b8181038181111561078657610786612632565b634e487b7160e01b600052601260045260246000fd5b60008261295c5761295c612937565b500490565b60008261297057612970612937565b500690565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b600083516129d98184602088016121fc565b8351908301906129ed8183602088016121fc565b01949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612a2990830184612220565b9695505050505050565b600060208284031215612a4557600080fd5b8151611f61816121b0565b634e487b7160e01b600052603160045260246000fdfea2646970667358221220e32021caf502e6944cf068ce8ab0d80d818c0197caa44128989193b98babb6ba64736f6c6343000813003368747470733a2f2f6261667962656961656f776e72366b77656c6637747532676463366a717367653336346b656d616e737a756c62676f61366b646866336365796e792e697066732e6e667473746f726167652e6c696e6b2f68747470733a2f2f6261666b72656964617a333672716e7768656a6373356870797a6d6a6f767579746462347a64776a6a716a743236346d6b6b64357135696c7771712e697066732e6e667473746f726167652e6c696e6b2f
Deployed Bytecode
0x60806040526004361061023f5760003560e01c80635d098b381161012e578063a7f93ebd116100ab578063c87b56dd1161006f578063c87b56dd146106c7578063d5abeb01146106e7578063e8a3d485146106fd578063e985e9c514610712578063f2fde38b1461075b57600080fd5b8063a7f93ebd1461062d578063ac72200d14610642578063b753081914610657578063b88d4fde1461068d578063beb9716d146106ad57600080fd5b806375f0a874116100f257806375f0a8741461059e5780638da5cb5b146105c357806395d89b41146105e157806398bcede9146105f6578063a22cb4651461060d57600080fd5b80635d098b38146105095780636352211e14610529578063653088cf1461054957806370a0823114610569578063715018a61461058957600080fd5b80631e1a1e76116101bc5780634c0f38c2116101805780634c0f38c21461045e5780634ea3871a146104735780634f6ccce714610493578063510b5158146104b357806355f804b3146104e957600080fd5b80631e1a1e76146103c957806323b872dd146103e95780632f745c591461040957806342842e0e1461042957806343e61a411461044957600080fd5b8063081812fc11610203578063081812fc1461032a578063095ea7b3146103625780631249c58b14610382578063162094c41461038a57806318160ddd146103aa57600080fd5b806301ffc9a71461028b57806302ebcb79146102c0578063059513a6146102e05780630614117a146102f357806306fdde031461030857600080fd5b36610286576011546040516001600160a01b0361010090920491909116903480156108fc02916000818181858888f19350505050158015610284573d6000803e3d6000fd5b005b600080fd5b34801561029757600080fd5b506102ab6102a63660046121c6565b61077b565b60405190151581526020015b60405180910390f35b3480156102cc57600080fd5b506102846102db3660046121e3565b61078c565b6102846102ee3660046121e3565b6107c4565b3480156102ff57600080fd5b506102846109a7565b34801561031457600080fd5b5061031d6109fd565b6040516102b7919061224c565b34801561033657600080fd5b5061034a6103453660046121e3565b610a8f565b6040516001600160a01b0390911681526020016102b7565b34801561036e57600080fd5b5061028461037d36600461227b565b610b17565b610284610c2c565b34801561039657600080fd5b506102846103a5366004612351565b610da1565b3480156103b657600080fd5b506009545b6040519081526020016102b7565b3480156103d557600080fd5b506102846103e4366004612398565b610dd9565b3480156103f557600080fd5b5061028461040436600461240d565b610ed6565b34801561041557600080fd5b506103bb61042436600461227b565b610f07565b34801561043557600080fd5b5061028461044436600461240d565b610f9d565b34801561045557600080fd5b5061031d610fb8565b34801561046a57600080fd5b506010546103bb565b34801561047f57600080fd5b5061028461048e366004612459565b611046565b34801561049f57600080fd5b506103bb6104ae3660046121e3565b611083565b3480156104bf57600080fd5b5061034a6104ce3660046121e3565b6012602052600090815260409020546001600160a01b031681565b3480156104f557600080fd5b50610284610504366004612474565b611116565b34801561051557600080fd5b506102846105243660046124a9565b61114c565b34801561053557600080fd5b5061034a6105443660046121e3565b61119e565b34801561055557600080fd5b506102846105643660046124c4565b611215565b34801561057557600080fd5b506103bb6105843660046124a9565b61124c565b34801561059557600080fd5b506102846112d3565b3480156105aa57600080fd5b5060115461034a9061010090046001600160a01b031681565b3480156105cf57600080fd5b506000546001600160a01b031661034a565b3480156105ed57600080fd5b5061031d611307565b34801561060257600080fd5b50600c546103bb9081565b34801561061957600080fd5b50610284610628366004612524565b611316565b34801561063957600080fd5b50600f546103bb565b34801561064e57600080fd5b506103bb6113da565b34801561066357600080fd5b5061034a6106723660046121e3565b6000908152601260205260409020546001600160a01b031690565b34801561069957600080fd5b506102846106a8366004612557565b6113f7565b3480156106b957600080fd5b506011546102ab9060ff1681565b3480156106d357600080fd5b5061031d6106e23660046121e3565b61142f565b3480156106f357600080fd5b506103bb60105481565b34801561070957600080fd5b5061031d61143a565b34801561071e57600080fd5b506102ab61072d3660046125d3565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b34801561076757600080fd5b506102846107763660046124a9565b611449565b6000610786826114e1565b92915050565b6000546001600160a01b031633146107bf5760405162461bcd60e51b81526004016107b6906125fd565b60405180910390fd5b600f55565b60115460ff166108165760405162461bcd60e51b815260206004820152601f60248201527f544d463a206d696e74696e672063757272656e746c792064697361626c65640060448201526064016107b6565b600f546108239082612648565b3410156108725760405162461bcd60e51b815260206004820152601c60248201527f544d463a206d7573742073656e6420636f72726563742070726963650000000060448201526064016107b6565b60105481610880600c611506565b61088a919061265f565b11156108d85760405162461bcd60e51b815260206004820152601e60248201527f544d463a20616c6c204e4654732068617665206265656e206d696e746564000060448201526064016107b6565b60005b8181101561099a576108f6336108f1600c611506565b611516565b3360126000610905600c611506565b815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555061097a610944600c611506565b610956610951600c611506565b611655565b6040516020016109669190612672565b60405160208183030381529060405261175e565b610988600c80546001019055565b806109928161269b565b9150506108db565b506109a4816117e2565b50565b6000546001600160a01b031633146109d15760405162461bcd60e51b81526004016107b6906125fd565b60405133904780156108fc02916000818181858888f193505050501580156109a4573d6000803e3d6000fd5b606060018054610a0c906126b4565b80601f0160208091040260200160405190810160405280929190818152602001828054610a38906126b4565b8015610a855780601f10610a5a57610100808354040283529160200191610a85565b820191906000526020600020905b815481529060010190602001808311610a6857829003601f168201915b5050505050905090565b6000610a9a82611832565b610afb5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016107b6565b506000908152600560205260409020546001600160a01b031690565b6000610b228261119e565b9050806001600160a01b0316836001600160a01b031603610b8f5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016107b6565b336001600160a01b0382161480610bab5750610bab813361072d565b610c1d5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016107b6565b610c27838361184f565b505050565b60115460ff16610c7e5760405162461bcd60e51b815260206004820152601f60248201527f544d463a206d696e74696e672063757272656e746c792064697361626c65640060448201526064016107b6565b600f54341015610cd05760405162461bcd60e51b815260206004820152601c60248201527f544d463a206d7573742073656e6420636f72726563742070726963650000000060448201526064016107b6565b601054610cdd600c611506565b1115610d2b5760405162461bcd60e51b815260206004820152601e60248201527f544d463a20616c6c204e4654732068617665206265656e206d696e746564000060448201526064016107b6565b610d39336108f1600c611506565b3360126000610d48600c611506565b815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b03160217905550610d87610944600c611506565b610d95600c80546001019055565b610d9f60016117e2565b565b6000546001600160a01b03163314610dcb5760405162461bcd60e51b81526004016107b6906125fd565b610dd5828261175e565b5050565b6000546001600160a01b03163314610e035760405162461bcd60e51b81526004016107b6906125fd565b60005b81811015610c2757610e42838383818110610e2357610e236126ee565b9050602002016020810190610e3891906124a9565b6108f1600c611506565b828282818110610e5457610e546126ee565b9050602002016020810190610e6991906124a9565b60126000610e77600c611506565b815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b03160217905550610eb6610944600c611506565b610ec4600c80546001019055565b80610ece8161269b565b915050610e06565b610ee033826118bd565b610efc5760405162461bcd60e51b81526004016107b690612704565b610c278383836119a3565b6000610f128361124c565b8210610f745760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016107b6565b506001600160a01b03919091166000908152600760209081526040808320938352929052205490565b610c27838383604051806020016040528060008152506113f7565b600e8054610fc5906126b4565b80601f0160208091040260200160405190810160405280929190818152602001828054610ff1906126b4565b801561103e5780601f106110135761010080835404028352916020019161103e565b820191906000526020600020905b81548152906001019060200180831161102157829003601f168201915b505050505081565b6000546001600160a01b031633146110705760405162461bcd60e51b81526004016107b6906125fd565b6011805460ff1916911515919091179055565b600061108e60095490565b82106110f15760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016107b6565b60098281548110611104576111046126ee565b90600052602060002001549050919050565b6000546001600160a01b031633146111405760405162461bcd60e51b81526004016107b6906125fd565b600d610dd582826127a3565b6000546001600160a01b031633146111765760405162461bcd60e51b81526004016107b6906125fd565b601180546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6000818152600360205260408120546001600160a01b0316806107865760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016107b6565b6000546001600160a01b0316331461123f5760405162461bcd60e51b81526004016107b6906125fd565b600e610c27828483612863565b60006001600160a01b0382166112b75760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016107b6565b506001600160a01b031660009081526004602052604090205490565b6000546001600160a01b031633146112fd5760405162461bcd60e51b81526004016107b6906125fd565b610d9f6000611b4e565b606060028054610a0c906126b4565b336001600160a01b0383160361136e5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016107b6565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600060016113e8600c611506565b6113f29190612924565b905090565b61140133836118bd565b61141d5760405162461bcd60e51b81526004016107b690612704565b61142984848484611b9e565b50505050565b606061078682611bd1565b6060600e8054610a0c906126b4565b6000546001600160a01b031633146114735760405162461bcd60e51b81526004016107b6906125fd565b6001600160a01b0381166114d85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107b6565b6109a481611b4e565b60006001600160e01b0319821663780e9d6360e01b1480610786575061078682611d32565b805460009061078690600161265f565b6001600160a01b03821661156c5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016107b6565b61157581611832565b156115c25760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016107b6565b6115ce60008383611d82565b6001600160a01b03821660009081526004602052604081208054600192906115f790849061265f565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60608160000361167c5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156116a657806116908161269b565b915061169f9050600a8361294d565b9150611680565b60008167ffffffffffffffff8111156116c1576116c16122a5565b6040519080825280601f01601f1916602001820160405280156116eb576020820181803683370190505b5090505b841561175657611700600183612924565b915061170d600a86612961565b61171890603061265f565b60f81b81838151811061172d5761172d6126ee565b60200101906001600160f81b031916908160001a90535061174f600a8661294d565b94506116ef565b949350505050565b61176782611832565b6117ca5760405162461bcd60e51b815260206004820152602e60248201527f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60448201526d32bc34b9ba32b73a103a37b5b2b760911b60648201526084016107b6565b6000828152600b60205260409020610c2782826127a3565b6000600f54826117f29190612648565b60115460405191925061010090046001600160a01b0316906108fc8315029083906000818181858888f19350505050158015610c27573d6000803e3d6000fd5b6000908152600360205260409020546001600160a01b0316151590565b600081815260056020526040902080546001600160a01b0319166001600160a01b03841690811790915581906118848261119e565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006118c882611832565b6119295760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016107b6565b60006119348361119e565b9050806001600160a01b0316846001600160a01b0316148061196f5750836001600160a01b031661196484610a8f565b6001600160a01b0316145b8061175657506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff16611756565b826001600160a01b03166119b68261119e565b6001600160a01b031614611a1e5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016107b6565b6001600160a01b038216611a805760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016107b6565b611a8b838383611d82565b611a9660008261184f565b6001600160a01b0383166000908152600460205260408120805460019290611abf908490612924565b90915550506001600160a01b0382166000908152600460205260408120805460019290611aed90849061265f565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b611ba98484846119a3565b611bb584848484611d8d565b6114295760405162461bcd60e51b81526004016107b690612975565b6060611bdc82611832565b611c425760405162461bcd60e51b815260206004820152603160248201527f45524337323155524953746f726167653a2055524920717565727920666f72206044820152703737b732bc34b9ba32b73a103a37b5b2b760791b60648201526084016107b6565b6000828152600b602052604081208054611c5b906126b4565b80601f0160208091040260200160405190810160405280929190818152602001828054611c87906126b4565b8015611cd45780601f10611ca957610100808354040283529160200191611cd4565b820191906000526020600020905b815481529060010190602001808311611cb757829003601f168201915b505050505090506000611ce5611e8e565b90508051600003611cf7575092915050565b815115611d29578082604051602001611d119291906129c7565b60405160208183030381529060405292505050919050565b61175684611e9d565b60006001600160e01b031982166380ac58cd60e01b1480611d6357506001600160e01b03198216635b5e139f60e01b145b8061078657506301ffc9a760e01b6001600160e01b0319831614610786565b610c27838383611f68565b60006001600160a01b0384163b15611e8357604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611dd19033908990889088906004016129f6565b6020604051808303816000875af1925050508015611e0c575060408051601f3d908101601f19168201909252611e0991810190612a33565b60015b611e69573d808015611e3a576040519150601f19603f3d011682016040523d82523d6000602084013e611e3f565b606091505b508051600003611e615760405162461bcd60e51b81526004016107b690612975565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611756565b506001949350505050565b6060600d8054610a0c906126b4565b6060611ea882611832565b611f0c5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016107b6565b6000611f16611e8e565b90506000815111611f365760405180602001604052806000815250611f61565b80611f4084611655565b604051602001611f519291906129c7565b6040516020818303038152906040525b9392505050565b6001600160a01b038316611fc357611fbe81600980546000838152600a60205260408120829055600182018355919091527f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af0155565b611fe6565b816001600160a01b0316836001600160a01b031614611fe657611fe68382612020565b6001600160a01b038216611ffd57610c27816120bd565b826001600160a01b0316826001600160a01b031614610c2757610c27828261216c565b6000600161202d8461124c565b6120379190612924565b60008381526008602052604090205490915080821461208a576001600160a01b03841660009081526007602090815260408083208584528252808320548484528184208190558352600890915290208190555b5060009182526008602090815260408084208490556001600160a01b039094168352600781528383209183525290812055565b6009546000906120cf90600190612924565b6000838152600a6020526040812054600980549394509092849081106120f7576120f76126ee565b906000526020600020015490508060098381548110612118576121186126ee565b6000918252602080832090910192909255828152600a9091526040808220849055858252812055600980548061215057612150612a50565b6001900381819060005260206000200160009055905550505050565b60006121778361124c565b6001600160a01b039093166000908152600760209081526040808320868452825280832085905593825260089052919091209190915550565b6001600160e01b0319811681146109a457600080fd5b6000602082840312156121d857600080fd5b8135611f61816121b0565b6000602082840312156121f557600080fd5b5035919050565b60005b838110156122175781810151838201526020016121ff565b50506000910152565b600081518084526122388160208601602086016121fc565b601f01601f19169290920160200192915050565b602081526000611f616020830184612220565b80356001600160a01b038116811461227657600080fd5b919050565b6000806040838503121561228e57600080fd5b6122978361225f565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff808411156122d6576122d66122a5565b604051601f8501601f19908116603f011681019082821181831017156122fe576122fe6122a5565b8160405280935085815286868601111561231757600080fd5b858560208301376000602087830101525050509392505050565b600082601f83011261234257600080fd5b611f61838335602085016122bb565b6000806040838503121561236457600080fd5b82359150602083013567ffffffffffffffff81111561238257600080fd5b61238e85828601612331565b9150509250929050565b600080602083850312156123ab57600080fd5b823567ffffffffffffffff808211156123c357600080fd5b818501915085601f8301126123d757600080fd5b8135818111156123e657600080fd5b8660208260051b85010111156123fb57600080fd5b60209290920196919550909350505050565b60008060006060848603121561242257600080fd5b61242b8461225f565b92506124396020850161225f565b9150604084013590509250925092565b8035801515811461227657600080fd5b60006020828403121561246b57600080fd5b611f6182612449565b60006020828403121561248657600080fd5b813567ffffffffffffffff81111561249d57600080fd5b61175684828501612331565b6000602082840312156124bb57600080fd5b611f618261225f565b600080602083850312156124d757600080fd5b823567ffffffffffffffff808211156124ef57600080fd5b818501915085601f83011261250357600080fd5b81358181111561251257600080fd5b8660208285010111156123fb57600080fd5b6000806040838503121561253757600080fd5b6125408361225f565b915061254e60208401612449565b90509250929050565b6000806000806080858703121561256d57600080fd5b6125768561225f565b93506125846020860161225f565b925060408501359150606085013567ffffffffffffffff8111156125a757600080fd5b8501601f810187136125b857600080fd5b6125c7878235602084016122bb565b91505092959194509250565b600080604083850312156125e657600080fd5b6125ef8361225f565b915061254e6020840161225f565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b808202811582820484141761078657610786612632565b8082018082111561078657610786612632565b600082516126848184602087016121fc565b64173539b7b760d91b920191825250600501919050565b6000600182016126ad576126ad612632565b5060010190565b600181811c908216806126c857607f821691505b6020821081036126e857634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b601f821115610c2757600081815260208120601f850160051c8101602086101561277c5750805b601f850160051c820191505b8181101561279b57828155600101612788565b505050505050565b815167ffffffffffffffff8111156127bd576127bd6122a5565b6127d1816127cb84546126b4565b84612755565b602080601f83116001811461280657600084156127ee5750858301515b600019600386901b1c1916600185901b17855561279b565b600085815260208120601f198616915b8281101561283557888601518255948401946001909101908401612816565b50858210156128535787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b67ffffffffffffffff83111561287b5761287b6122a5565b61288f8361288983546126b4565b83612755565b6000601f8411600181146128c357600085156128ab5750838201355b600019600387901b1c1916600186901b17835561291d565b600083815260209020601f19861690835b828110156128f457868501358255602094850194600190920191016128d4565b50868210156129115760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b8181038181111561078657610786612632565b634e487b7160e01b600052601260045260246000fd5b60008261295c5761295c612937565b500490565b60008261297057612970612937565b500690565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b600083516129d98184602088016121fc565b8351908301906129ed8183602088016121fc565b01949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612a2990830184612220565b9695505050505050565b600060208284031215612a4557600080fd5b8151611f61816121b0565b634e487b7160e01b600052603160045260246000fdfea2646970667358221220e32021caf502e6944cf068ce8ab0d80d818c0197caa44128989193b98babb6ba64736f6c63430008130033
Deployed Bytecode Sourcemap
2196:5024:17:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3005:15;;2997:44;;-1:-1:-1;;;;;3005:15:17;;;;;;;;;3031:9;2997:44;;;;;;;;;3031:9;3005:15;2997:44;;;;;;;;;;;;;;;;;;;;;2196:5024;;;;6615:174;;;;;;;;;;-1:-1:-1;6615:174:17;;;;;:::i;:::-;;:::i;:::-;;;565:14:18;;558:22;540:41;;528:2;513:18;6615:174:17;;;;;;;;3392:103;;;;;;;;;;-1:-1:-1;3392:103:17;;;;;:::i;:::-;;:::i;4849:664::-;;;;;;:::i;:::-;;:::i;6795:197::-;;;;;;;;;;;;;:::i;2456:100:4:-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;3923:221::-;;;;;;;;;;-1:-1:-1;3923:221:4;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1697:32:18;;;1679:51;;1667:2;1652:18;3923:221:4;1533:203:18;3453:404:4;;;;;;;;;;-1:-1:-1;3453:404:4;;;;;:::i;:::-;;:::i;4287:556:17:-;;;:::i;4047:127::-;;;;;;;;;;-1:-1:-1;4047:127:17;;;;;:::i;:::-;;:::i;1590:113:6:-;;;;;;;;;;-1:-1:-1;1678:10:6;:17;1590:113;;;3715:25:18;;;3703:2;3688:18;1590:113:6;3569:177:18;5521:419:17;;;;;;;;;;-1:-1:-1;5521:419:17;;;;;:::i;:::-;;:::i;4813:305:4:-;;;;;;;;;;-1:-1:-1;4813:305:4;;;;;:::i;:::-;;:::i;1258:256:6:-;;;;;;;;;;-1:-1:-1;1258:256:6;;;;;:::i;:::-;;:::i;5189:151:4:-;;;;;;;;;;-1:-1:-1;5189:151:4;;;;;:::i;:::-;;:::i;2505:121:17:-;;;;;;;;;;;;;:::i;3619:94::-;;;;;;;;;;-1:-1:-1;3698:9:17;;3619:94;;4180:99;;;;;;;;;;-1:-1:-1;4180:99:17;;;;;:::i;:::-;;:::i;1780:233:6:-;;;;;;;;;;-1:-1:-1;1780:233:6;;;;;:::i;:::-;;:::i;2846:44:17:-;;;;;;;;;;-1:-1:-1;2846:44:17;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;2846:44:17;;;3943:98;;;;;;;;;;-1:-1:-1;3943:98:17;;;;;:::i;:::-;;:::i;3060:118::-;;;;;;;;;;-1:-1:-1;3060:118:17;;;;;:::i;:::-;;:::i;2150:239:4:-;;;;;;;;;;-1:-1:-1;2150:239:4;;;;;:::i;:::-;;:::i;3286:100:17:-;;;;;;;;;;-1:-1:-1;3286:100:17;;;;;:::i;:::-;;:::i;1880:208:4:-;;;;;;;;;;-1:-1:-1;1880:208:4;;;;;:::i;:::-;;:::i;1151:94:17:-;;;;;;;;;;;;;:::i;2764:75::-;;;;;;;;;;-1:-1:-1;2764:75:17;;;;;;;-1:-1:-1;;;;;2764:75:17;;;928:87;;;;;;;;;;-1:-1:-1;974:7:17;1001:6;-1:-1:-1;;;;;1001:6:17;928:87;;2625:104:4;;;;;;;;;;;;;:::i;2332:39:17:-;;;;;;;;;;-1:-1:-1;2332:39:17;;;;;;4216:295:4;;;;;;;;;;-1:-1:-1;4216:295:4;;;;;:::i;:::-;;:::i;3719:102:17:-;;;;;;;;;;-1:-1:-1;3804:11:17;;3719:102;;3501:112;;;;;;;;;;;;;:::i;5946:101::-;;;;;;;;;;-1:-1:-1;5946:101:17;;;;;:::i;:::-;6003:7;6025:16;;;:7;:16;;;;;;-1:-1:-1;;;;;6025:16:17;;5946:101;5411:285:4;;;;;;;;;;-1:-1:-1;5411:285:4;;;;;:::i;:::-;;:::i;2730:27:17:-;;;;;;;;;;-1:-1:-1;2730:27:17;;;;;;;;6194:160;;;;;;;;;;-1:-1:-1;6194:160:17;;;;;:::i;:::-;;:::i;2696:27::-;;;;;;;;;;;;;;;;3184:96;;;;;;;;;;;;;:::i;4582:164:4:-;;;;;;;;;;-1:-1:-1;4582:164:4;;;;;:::i;:::-;-1:-1:-1;;;;;4703:25:4;;;4679:4;4703:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;4582:164;1253:192:17;;;;;;;;;;-1:-1:-1;1253:192:17;;;;;:::i;:::-;;:::i;6615:174::-;6727:4;6747:36;6771:11;6747:23;:36::i;:::-;6740:43;6615:174;-1:-1:-1;;6615:174:17:o;3392:103::-;974:7;1001:6;-1:-1:-1;;;;;1001:6:17;681:10:1;1063:23:17;1055:68;;;;-1:-1:-1;;;1055:68:17;;;;;;;:::i;:::-;;;;;;;;;3465:11:::1;:24:::0;3392:103::o;4849:664::-;4926:7;;;;4918:51;;;;-1:-1:-1;;;4918:51:17;;7928:2:18;4918:51:17;;;7910:21:18;7967:2;7947:18;;;7940:30;8006:33;7986:18;;;7979:61;8057:18;;4918:51:17;7726:355:18;4918:51:17;5009:11;;4998:22;;:8;:22;:::i;:::-;4984:9;:37;;4976:78;;;;-1:-1:-1;;;4976:78:17;;8593:2:18;4976:78:17;;;8575:21:18;8632:2;8612:18;;;8605:30;8671;8651:18;;;8644:58;8719:18;;4976:78:17;8391:352:18;4976:78:17;5111:9;;5098:8;5070:25;:15;:23;:25::i;:::-;:36;;;;:::i;:::-;5069:51;;5061:94;;;;-1:-1:-1;;;5061:94:17;;9080:2:18;5061:94:17;;;9062:21:18;9119:2;9099:18;;;9092:30;9158:32;9138:18;;;9131:60;9208:18;;5061:94:17;8878:354:18;5061:94:17;5168:6;5164:315;5184:8;5180:1;:12;5164:315;;;5207:44;5213:10;5225:25;:15;:23;:25::i;:::-;5207:5;:44::i;:::-;5297:10;5260:7;:34;5268:25;:15;:23;:25::i;:::-;5260:34;;;;;;;;;;;;:47;;;;;-1:-1:-1;;;;;5260:47:17;;;;;-1:-1:-1;;;;;5260:47:17;;;;;;5316:119;5329:25;:15;:23;:25::i;:::-;5380:43;5397:25;:15;:23;:25::i;:::-;5380:16;:43::i;:::-;5363:70;;;;;;;;:::i;:::-;;;;;;;;;;;;;5316:12;:119::i;:::-;5444:27;:15;1006:19:2;;1024:1;1006:19;;;917:127;5444:27:17;5194:3;;;;:::i;:::-;;;;5164:315;;;;5485:22;5498:8;5485:12;:22::i;:::-;4849:664;:::o;6795:197::-;974:7;1001:6;-1:-1:-1;;;;;1001:6:17;681:10:1;1063:23:17;1055:68;;;;-1:-1:-1;;;1055:68:17;;;;;;;:::i;:::-;6935:51:::1;::::0;6943:10:::1;::::0;6964:21:::1;6935:51:::0;::::1;;;::::0;::::1;::::0;;;6964:21;6943:10;6935:51;::::1;;;;;;;;;;;;;::::0;::::1;;;;2456:100:4::0;2510:13;2543:5;2536:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2456:100;:::o;3923:221::-;3999:7;4027:16;4035:7;4027;:16::i;:::-;4019:73;;;;-1:-1:-1;;;4019:73:4;;10425:2:18;4019:73:4;;;10407:21:18;10464:2;10444:18;;;10437:30;10503:34;10483:18;;;10476:62;-1:-1:-1;;;10554:18:18;;;10547:42;10606:19;;4019:73:4;10223:408:18;4019:73:4;-1:-1:-1;4112:24:4;;;;:15;:24;;;;;;-1:-1:-1;;;;;4112:24:4;;3923:221::o;3453:404::-;3534:13;3550:23;3565:7;3550:14;:23::i;:::-;3534:39;;3598:5;-1:-1:-1;;;;;3592:11:4;:2;-1:-1:-1;;;;;3592:11:4;;3584:57;;;;-1:-1:-1;;;3584:57:4;;10838:2:18;3584:57:4;;;10820:21:18;10877:2;10857:18;;;10850:30;10916:34;10896:18;;;10889:62;-1:-1:-1;;;10967:18:18;;;10960:31;11008:19;;3584:57:4;10636:397:18;3584:57:4;681:10:1;-1:-1:-1;;;;;3662:21:4;;;;:69;;-1:-1:-1;3687:44:4;3711:5;681:10:1;4582:164:4;:::i;3687:44::-;3654:161;;;;-1:-1:-1;;;3654:161:4;;11240:2:18;3654:161:4;;;11222:21:18;11279:2;11259:18;;;11252:30;11318:34;11298:18;;;11291:62;11389:26;11369:18;;;11362:54;11433:19;;3654:161:4;11038:420:18;3654:161:4;3828:21;3837:2;3841:7;3828:8;:21::i;:::-;3523:334;3453:404;;:::o;4287:556:17:-;4335:7;;;;4327:51;;;;-1:-1:-1;;;4327:51:17;;7928:2:18;4327:51:17;;;7910:21:18;7967:2;7947:18;;;7940:30;8006:33;7986:18;;;7979:61;8057:18;;4327:51:17;7726:355:18;4327:51:17;4407:11;;4393:9;:26;;4385:67;;;;-1:-1:-1;;;4385:67:17;;8593:2:18;4385:67:17;;;8575:21:18;8632:2;8612:18;;;8605:30;8671;8651:18;;;8644:58;8719:18;;4385:67:17;8391:352:18;4385:67:17;4498:9;;4468:25;:15;:23;:25::i;:::-;4467:40;;4459:83;;;;-1:-1:-1;;;4459:83:17;;9080:2:18;4459:83:17;;;9062:21:18;9119:2;9099:18;;;9092:30;9158:32;9138:18;;;9131:60;9208:18;;4459:83:17;8878:354:18;4459:83:17;4551:44;4557:10;4569:25;:15;:23;:25::i;4551:44::-;4639:10;4602:7;:34;4610:25;:15;:23;:25::i;:::-;4602:34;;;;;;;;;;;;:47;;;;;-1:-1:-1;;;;;4602:47:17;;;;;-1:-1:-1;;;;;4602:47:17;;;;;;4662:119;4675:25;:15;:23;:25::i;4662:119::-;4788:27;:15;1006:19:2;;1024:1;1006:19;;;917:127;4788:27:17;4822:15;4835:1;4822:12;:15::i;:::-;4287:556::o;4047:127::-;974:7;1001:6;-1:-1:-1;;;;;1001:6:17;681:10:1;1063:23:17;1055:68;;;;-1:-1:-1;;;1055:68:17;;;;;;;:::i;:::-;4136:32:::1;4149:7;4158:9;4136:12;:32::i;:::-;4047:127:::0;;:::o;5521:419::-;974:7;1001:6;-1:-1:-1;;;;;1001:6:17;681:10:1;1063:23:17;1055:68;;;;-1:-1:-1;;;1055:68:17;;;;;;;:::i;:::-;5606:9:::1;5601:334;5621:21:::0;;::::1;5601:334;;;5657:47;5663:10;;5674:1;5663:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;5678:25;:15;:23;:25::i;5657:47::-;5750:10;;5761:1;5750:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;5713:7;:34;5721:25;:15;:23;:25::i;:::-;5713:34;;;;;;;;;;;;:50;;;;;-1:-1:-1::0;;;;;5713:50:17::1;;;;;-1:-1:-1::0;;;;;5713:50:17::1;;;;;;5772:119;5785:25;:15;:23;:25::i;5772:119::-;5900:27;:15;1006:19:2::0;;1024:1;1006:19;;;917:127;5900:27:17::1;5644:3:::0;::::1;::::0;::::1;:::i;:::-;;;;5601:334;;4813:305:4::0;4974:41;681:10:1;5007:7:4;4974:18;:41::i;:::-;4966:103;;;;-1:-1:-1;;;4966:103:4;;;;;;;:::i;:::-;5082:28;5092:4;5098:2;5102:7;5082:9;:28::i;1258:256:6:-;1355:7;1391:23;1408:5;1391:16;:23::i;:::-;1383:5;:31;1375:87;;;;-1:-1:-1;;;1375:87:6;;12215:2:18;1375:87:6;;;12197:21:18;12254:2;12234:18;;;12227:30;12293:34;12273:18;;;12266:62;-1:-1:-1;;;12344:18:18;;;12337:41;12395:19;;1375:87:6;12013:407:18;1375:87:6;-1:-1:-1;;;;;;1480:19:6;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;1258:256::o;5189:151:4:-;5293:39;5310:4;5316:2;5320:7;5293:39;;;;;;;;;;;;:16;:39::i;2505:121:17:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;4180:99::-;974:7;1001:6;-1:-1:-1;;;;;1001:6:17;681:10:1;1063:23:17;1055:68;;;;-1:-1:-1;;;1055:68:17;;;;;;;:::i;:::-;4256:7:::1;:17:::0;;-1:-1:-1;;4256:17:17::1;::::0;::::1;;::::0;;;::::1;::::0;;4180:99::o;1780:233:6:-;1855:7;1891:30;1678:10;:17;;1590:113;1891:30;1883:5;:38;1875:95;;;;-1:-1:-1;;;1875:95:6;;12627:2:18;1875:95:6;;;12609:21:18;12666:2;12646:18;;;12639:30;12705:34;12685:18;;;12678:62;-1:-1:-1;;;12756:18:18;;;12749:42;12808:19;;1875:95:6;12425:408:18;1875:95:6;1988:10;1999:5;1988:17;;;;;;;;:::i;:::-;;;;;;;;;1981:24;;1780:233;;;:::o;3943:98:17:-;974:7;1001:6;-1:-1:-1;;;;;1001:6:17;681:10:1;1063:23:17;1055:68;;;;-1:-1:-1;;;1055:68:17;;;;;;;:::i;:::-;4012:13:::1;:23;4028:7:::0;4012:13;:23:::1;:::i;3060:118::-:0;974:7;1001:6;-1:-1:-1;;;;;1001:6:17;681:10:1;1063:23:17;1055:68;;;;-1:-1:-1;;;1055:68:17;;;;;;;:::i;:::-;3138:15:::1;:34:::0;;-1:-1:-1;;;;;3138:34:17;;::::1;;;-1:-1:-1::0;;;;;;3138:34:17;;::::1;::::0;;;::::1;::::0;;3060:118::o;2150:239:4:-;2222:7;2258:16;;;:7;:16;;;;;;-1:-1:-1;;;;;2258:16:4;;2285:73;;;;-1:-1:-1;;;2285:73:4;;15244:2:18;2285:73:4;;;15226:21:18;15283:2;15263:18;;;15256:30;15322:34;15302:18;;;15295:62;-1:-1:-1;;;15373:18:18;;;15366:39;15422:19;;2285:73:4;15042:405:18;3286:100:17;974:7;1001:6;-1:-1:-1;;;;;1001:6:17;681:10:1;1063:23:17;1055:68;;;;-1:-1:-1;;;1055:68:17;;;;;;;:::i;:::-;3361:13:::1;:19;3377:3:::0;;3361:13;:19:::1;:::i;1880:208:4:-:0;1952:7;-1:-1:-1;;;;;1980:19:4;;1972:74;;;;-1:-1:-1;;;1972:74:4;;16865:2:18;1972:74:4;;;16847:21:18;16904:2;16884:18;;;16877:30;16943:34;16923:18;;;16916:62;-1:-1:-1;;;16994:18:18;;;16987:40;17044:19;;1972:74:4;16663:406:18;1972:74:4;-1:-1:-1;;;;;;2064:16:4;;;;;:9;:16;;;;;;;1880:208::o;1151:94:17:-;974:7;1001:6;-1:-1:-1;;;;;1001:6:17;681:10:1;1063:23:17;1055:68;;;;-1:-1:-1;;;1055:68:17;;;;;;;:::i;:::-;1216:21:::1;1234:1;1216:9;:21::i;2625:104:4:-:0;2681:13;2714:7;2707:14;;;;;:::i;4216:295::-;681:10:1;-1:-1:-1;;;;;4319:24:4;;;4311:62;;;;-1:-1:-1;;;4311:62:4;;17276:2:18;4311:62:4;;;17258:21:18;17315:2;17295:18;;;17288:30;17354:27;17334:18;;;17327:55;17399:18;;4311:62:4;17074:349:18;4311:62:4;681:10:1;4386:32:4;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;4386:42:4;;;;;;;;;;;;:53;;-1:-1:-1;;4386:53:4;;;;;;;;;;4455:48;;540:41:18;;;4386:42:4;;681:10:1;4455:48:4;;513:18:18;4455:48:4;;;;;;;4216:295;;:::o;3501:112:17:-;3554:11;3606:1;3580:25;:15;:23;:25::i;:::-;:27;;;;:::i;:::-;3573:34;;3501:112;:::o;5411:285:4:-;5543:41;681:10:1;5576:7:4;5543:18;:41::i;:::-;5535:103;;;;-1:-1:-1;;;5535:103:4;;;;;;;:::i;:::-;5649:39;5663:4;5669:2;5673:7;5682:5;5649:13;:39::i;:::-;5411:285;;;;:::o;6194:160:17:-;6285:13;6314:34;6340:7;6314:25;:34::i;3184:96::-;3228:13;3261;3254:20;;;;;:::i;1253:192::-;974:7;1001:6;-1:-1:-1;;;;;1001:6:17;681:10:1;1063:23:17;1055:68;;;;-1:-1:-1;;;1055:68:17;;;;;;;:::i;:::-;-1:-1:-1;;;;;1342:22:17;::::1;1334:73;;;::::0;-1:-1:-1;;;1334:73:17;;17763:2:18;1334:73:17::1;::::0;::::1;17745:21:18::0;17802:2;17782:18;;;17775:30;17841:34;17821:18;;;17814:62;-1:-1:-1;;;17892:18:18;;;17885:36;17938:19;;1334:73:17::1;17561:402:18::0;1334:73:17::1;1418:19;1428:8;1418:9;:19::i;937:237:6:-:0;1039:4;-1:-1:-1;;;;;;1063:50:6;;-1:-1:-1;;;1063:50:6;;:103;;;1130:36;1154:11;1130:23;:36::i;793:116:2:-;885:14;;858:7;;885:16;;900:1;885:16;:::i;9077:382:4:-;-1:-1:-1;;;;;9157:16:4;;9149:61;;;;-1:-1:-1;;;9149:61:4;;18170:2:18;9149:61:4;;;18152:21:18;;;18189:18;;;18182:30;18248:34;18228:18;;;18221:62;18300:18;;9149:61:4;17968:356:18;9149:61:4;9230:16;9238:7;9230;:16::i;:::-;9229:17;9221:58;;;;-1:-1:-1;;;9221:58:4;;18531:2:18;9221:58:4;;;18513:21:18;18570:2;18550:18;;;18543:30;18609;18589:18;;;18582:58;18657:18;;9221:58:4;18329:352:18;9221:58:4;9292:45;9321:1;9325:2;9329:7;9292:20;:45::i;:::-;-1:-1:-1;;;;;9350:13:4;;;;;;:9;:13;;;;;:18;;9367:1;;9350:13;:18;;9367:1;;9350:18;:::i;:::-;;;;-1:-1:-1;;9379:16:4;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;9379:21:4;-1:-1:-1;;;;;9379:21:4;;;;;;;;9418:33;;9379:16;;;9418:33;;9379:16;;9418:33;9077:382;;:::o;284:723:16:-;340:13;561:5;570:1;561:10;557:53;;-1:-1:-1;;588:10:16;;;;;;;;;;;;-1:-1:-1;;;588:10:16;;;;;284:723::o;557:53::-;635:5;620:12;676:78;683:9;;676:78;;709:8;;;;:::i;:::-;;-1:-1:-1;732:10:16;;-1:-1:-1;740:2:16;732:10;;:::i;:::-;;;676:78;;;764:19;796:6;786:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;786:17:16;;764:39;;814:154;821:10;;814:154;;848:11;858:1;848:11;;:::i;:::-;;-1:-1:-1;917:10:16;925:2;917:5;:10;:::i;:::-;904:24;;:2;:24;:::i;:::-;891:39;;874:6;881;874:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;874:56:16;;;;;;;;-1:-1:-1;945:11:16;954:2;945:11;;:::i;:::-;;;814:154;;;992:6;284:723;-1:-1:-1;;;;284:723:16:o;1240:217:8:-;1340:16;1348:7;1340;:16::i;:::-;1332:75;;;;-1:-1:-1;;;1332:75:8;;19262:2:18;1332:75:8;;;19244:21:18;19301:2;19281:18;;;19274:30;19340:34;19320:18;;;19313:62;-1:-1:-1;;;19391:18:18;;;19384:44;19445:19;;1332:75:8;19060:410:18;1332:75:8;1418:19;;;;:10;:19;;;;;:31;1440:9;1418:19;:31;:::i;6998:215:17:-;7053:13;7078:11;;7069:6;:20;;;;:::i;:::-;7170:15;;7162:43;;7053:36;;-1:-1:-1;7170:15:17;;;-1:-1:-1;;;;;7170:15:17;;7162:43;;;;;7053:36;;7162:43;;;;7053:36;7170:15;7162:43;;;;;;;;;;;;;;;;;;;7163:127:4;7228:4;7252:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7252:16:4;:30;;;7163:127::o;11047:174::-;11122:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;11122:29:4;-1:-1:-1;;;;;11122:29:4;;;;;;;;:24;;11176:23;11122:24;11176:14;:23::i;:::-;-1:-1:-1;;;;;11167:46:4;;;;;;;;;;;11047:174;;:::o;7457:355::-;7550:4;7575:16;7583:7;7575;:16::i;:::-;7567:73;;;;-1:-1:-1;;;7567:73:4;;19677:2:18;7567:73:4;;;19659:21:18;19716:2;19696:18;;;19689:30;19755:34;19735:18;;;19728:62;-1:-1:-1;;;19806:18:18;;;19799:42;19858:19;;7567:73:4;19475:408:18;7567:73:4;7651:13;7667:23;7682:7;7667:14;:23::i;:::-;7651:39;;7720:5;-1:-1:-1;;;;;7709:16:4;:7;-1:-1:-1;;;;;7709:16:4;;:51;;;;7753:7;-1:-1:-1;;;;;7729:31:4;:20;7741:7;7729:11;:20::i;:::-;-1:-1:-1;;;;;7729:31:4;;7709:51;:94;;;-1:-1:-1;;;;;;4703:25:4;;;4679:4;4703:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;7764:39;4582:164;10385:544;10510:4;-1:-1:-1;;;;;10483:31:4;:23;10498:7;10483:14;:23::i;:::-;-1:-1:-1;;;;;10483:31:4;;10475:85;;;;-1:-1:-1;;;10475:85:4;;20090:2:18;10475:85:4;;;20072:21:18;20129:2;20109:18;;;20102:30;20168:34;20148:18;;;20141:62;-1:-1:-1;;;20219:18:18;;;20212:39;20268:19;;10475:85:4;19888:405:18;10475:85:4;-1:-1:-1;;;;;10579:16:4;;10571:65;;;;-1:-1:-1;;;10571:65:4;;20500:2:18;10571:65:4;;;20482:21:18;20539:2;20519:18;;;20512:30;20578:34;20558:18;;;20551:62;-1:-1:-1;;;20629:18:18;;;20622:34;20673:19;;10571:65:4;20298:400:18;10571:65:4;10649:39;10670:4;10676:2;10680:7;10649:20;:39::i;:::-;10753:29;10770:1;10774:7;10753:8;:29::i;:::-;-1:-1:-1;;;;;10795:15:4;;;;;;:9;:15;;;;;:20;;10814:1;;10795:15;:20;;10814:1;;10795:20;:::i;:::-;;;;-1:-1:-1;;;;;;;10826:13:4;;;;;;:9;:13;;;;;:18;;10843:1;;10826:13;:18;;10843:1;;10826:18;:::i;:::-;;;;-1:-1:-1;;10855:16:4;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;10855:21:4;-1:-1:-1;;;;;10855:21:4;;;;;;;;;10894:27;;10855:16;;10894:27;;;;;;;10385:544;;;:::o;1453:173:17:-;1509:16;1528:6;;-1:-1:-1;;;;;1545:17:17;;;-1:-1:-1;;;;;;1545:17:17;;;;;;1578:40;;1528:6;;;;;;;1578:40;;1509:16;1578:40;1498:128;1453:173;:::o;6578:272:4:-;6692:28;6702:4;6708:2;6712:7;6692:9;:28::i;:::-;6739:48;6762:4;6768:2;6772:7;6781:5;6739:22;:48::i;:::-;6731:111;;;;-1:-1:-1;;;6731:111:4;;;;;;;:::i;405:679:8:-;478:13;512:16;520:7;512;:16::i;:::-;504:78;;;;-1:-1:-1;;;504:78:8;;21324:2:18;504:78:8;;;21306:21:18;21363:2;21343:18;;;21336:30;21402:34;21382:18;;;21375:62;-1:-1:-1;;;21453:18:18;;;21446:47;21510:19;;504:78:8;21122:413:18;504:78:8;595:23;621:19;;;:10;:19;;;;;595:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;651:18;672:10;:8;:10::i;:::-;651:31;;764:4;758:18;780:1;758:23;754:72;;-1:-1:-1;805:9:8;405:679;-1:-1:-1;;405:679:8:o;754:72::-;930:23;;:27;926:108;;1005:4;1011:9;988:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;974:48;;;;405:679;;;:::o;926:108::-;1053:23;1068:7;1053:14;:23::i;1524:292:4:-;1626:4;-1:-1:-1;;;;;;1650:40:4;;-1:-1:-1;;;1650:40:4;;:105;;-1:-1:-1;;;;;;;1707:48:4;;-1:-1:-1;;;1707:48:4;1650:105;:158;;;-1:-1:-1;;;;;;;;;;898:40:3;;;1772:36:4;789:157:3;6362:187:17;6498:45;6525:4;6531:2;6535:7;6498:26;:45::i;11786:843:4:-;11907:4;-1:-1:-1;;;;;11933:13:4;;1110:20:0;1149:8;11929:693:4;;11969:72;;-1:-1:-1;;;11969:72:4;;-1:-1:-1;;;;;11969:36:4;;;;;:72;;681:10:1;;12020:4:4;;12026:7;;12035:5;;11969:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11969:72:4;;;;;;;;-1:-1:-1;;11969:72:4;;;;;;;;;;;;:::i;:::-;;;11965:602;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12215:6;:13;12232:1;12215:18;12211:341;;12258:60;;-1:-1:-1;;;12258:60:4;;;;;;;:::i;12211:341::-;12502:6;12496:13;12487:6;12483:2;12479:15;12472:38;11965:602;-1:-1:-1;;;;;;12092:55:4;-1:-1:-1;;;12092:55:4;;-1:-1:-1;12085:62:4;;11929:693;-1:-1:-1;12606:4:4;11786:843;;;;;;:::o;3827:110:17:-;3887:13;3918;3911:20;;;;;:::i;2800:360:4:-;2873:13;2907:16;2915:7;2907;:16::i;:::-;2899:76;;;;-1:-1:-1;;;2899:76:4;;22991:2:18;2899:76:4;;;22973:21:18;23030:2;23010:18;;;23003:30;23069:34;23049:18;;;23042:62;-1:-1:-1;;;23120:18:18;;;23113:45;23175:19;;2899:76:4;22789:411:18;2899:76:4;2988:21;3012:10;:8;:10::i;:::-;2988:34;;3064:1;3046:7;3040:21;:25;:112;;;;;;;;;;;;;;;;;3105:7;3114:18;:7;:16;:18::i;:::-;3088:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3040:112;3033:119;2800:360;-1:-1:-1;;;2800:360:4:o;2626:555:6:-;-1:-1:-1;;;;;2798:18:6;;2794:187;;2833:40;2865:7;4008:10;:17;;3981:24;;;;:15;:24;;;;;:44;;;4036:24;;;;;;;;;;;;3904:164;2833:40;2794:187;;;2903:2;-1:-1:-1;;;;;2895:10:6;:4;-1:-1:-1;;;;;2895:10:6;;2891:90;;2922:47;2955:4;2961:7;2922:32;:47::i;:::-;-1:-1:-1;;;;;2995:16:6;;2991:183;;3028:45;3065:7;3028:36;:45::i;2991:183::-;3101:4;-1:-1:-1;;;;;3095:10:6;:2;-1:-1:-1;;;;;3095:10:6;;3091:83;;3122:40;3150:2;3154:7;3122:27;:40::i;4695:988::-;4961:22;5011:1;4986:22;5003:4;4986:16;:22::i;:::-;:26;;;;:::i;:::-;5023:18;5044:26;;;:17;:26;;;;;;4961:51;;-1:-1:-1;5177:28:6;;;5173:328;;-1:-1:-1;;;;;5244:18:6;;5222:19;5244:18;;;:12;:18;;;;;;;;:34;;;;;;;;;5295:30;;;;;;:44;;;5412:30;;:17;:30;;;;;:43;;;5173:328;-1:-1:-1;5597:26:6;;;;:17;:26;;;;;;;;5590:33;;;-1:-1:-1;;;;;5641:18:6;;;;;:12;:18;;;;;:34;;;;;;;5634:41;4695:988::o;5978:1079::-;6256:10;:17;6231:22;;6256:21;;6276:1;;6256:21;:::i;:::-;6288:18;6309:24;;;:15;:24;;;;;;6682:10;:26;;6231:46;;-1:-1:-1;6309:24:6;;6231:46;;6682:26;;;;;;:::i;:::-;;;;;;;;;6660:48;;6746:11;6721:10;6732;6721:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;6826:28;;;:15;:28;;;;;;;:41;;;6998:24;;;;;6991:31;7033:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;6049:1008;;;5978:1079;:::o;3482:221::-;3567:14;3584:20;3601:2;3584:16;:20::i;:::-;-1:-1:-1;;;;;3615:16:6;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;3660:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;3482:221:6:o;14:131:18:-;-1:-1:-1;;;;;;88:32:18;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:180::-;651:6;704:2;692:9;683:7;679:23;675:32;672:52;;;720:1;717;710:12;672:52;-1:-1:-1;743:23:18;;592:180;-1:-1:-1;592:180:18:o;777:250::-;862:1;872:113;886:6;883:1;880:13;872:113;;;962:11;;;956:18;943:11;;;936:39;908:2;901:10;872:113;;;-1:-1:-1;;1019:1:18;1001:16;;994:27;777:250::o;1032:271::-;1074:3;1112:5;1106:12;1139:6;1134:3;1127:19;1155:76;1224:6;1217:4;1212:3;1208:14;1201:4;1194:5;1190:16;1155:76;:::i;:::-;1285:2;1264:15;-1:-1:-1;;1260:29:18;1251:39;;;;1292:4;1247:50;;1032:271;-1:-1:-1;;1032:271:18:o;1308:220::-;1457:2;1446:9;1439:21;1420:4;1477:45;1518:2;1507:9;1503:18;1495:6;1477:45;:::i;1741:173::-;1809:20;;-1:-1:-1;;;;;1858:31:18;;1848:42;;1838:70;;1904:1;1901;1894:12;1838:70;1741:173;;;:::o;1919:254::-;1987:6;1995;2048:2;2036:9;2027:7;2023:23;2019:32;2016:52;;;2064:1;2061;2054:12;2016:52;2087:29;2106:9;2087:29;:::i;:::-;2077:39;2163:2;2148:18;;;;2135:32;;-1:-1:-1;;;1919:254:18:o;2178:127::-;2239:10;2234:3;2230:20;2227:1;2220:31;2270:4;2267:1;2260:15;2294:4;2291:1;2284:15;2310:632;2375:5;2405:18;2446:2;2438:6;2435:14;2432:40;;;2452:18;;:::i;:::-;2527:2;2521:9;2495:2;2581:15;;-1:-1:-1;;2577:24:18;;;2603:2;2573:33;2569:42;2557:55;;;2627:18;;;2647:22;;;2624:46;2621:72;;;2673:18;;:::i;:::-;2713:10;2709:2;2702:22;2742:6;2733:15;;2772:6;2764;2757:22;2812:3;2803:6;2798:3;2794:16;2791:25;2788:45;;;2829:1;2826;2819:12;2788:45;2879:6;2874:3;2867:4;2859:6;2855:17;2842:44;2934:1;2927:4;2918:6;2910;2906:19;2902:30;2895:41;;;;2310:632;;;;;:::o;2947:222::-;2990:5;3043:3;3036:4;3028:6;3024:17;3020:27;3010:55;;3061:1;3058;3051:12;3010:55;3083:80;3159:3;3150:6;3137:20;3130:4;3122:6;3118:17;3083:80;:::i;3174:390::-;3252:6;3260;3313:2;3301:9;3292:7;3288:23;3284:32;3281:52;;;3329:1;3326;3319:12;3281:52;3365:9;3352:23;3342:33;;3426:2;3415:9;3411:18;3398:32;3453:18;3445:6;3442:30;3439:50;;;3485:1;3482;3475:12;3439:50;3508;3550:7;3541:6;3530:9;3526:22;3508:50;:::i;:::-;3498:60;;;3174:390;;;;;:::o;3751:615::-;3837:6;3845;3898:2;3886:9;3877:7;3873:23;3869:32;3866:52;;;3914:1;3911;3904:12;3866:52;3954:9;3941:23;3983:18;4024:2;4016:6;4013:14;4010:34;;;4040:1;4037;4030:12;4010:34;4078:6;4067:9;4063:22;4053:32;;4123:7;4116:4;4112:2;4108:13;4104:27;4094:55;;4145:1;4142;4135:12;4094:55;4185:2;4172:16;4211:2;4203:6;4200:14;4197:34;;;4227:1;4224;4217:12;4197:34;4280:7;4275:2;4265:6;4262:1;4258:14;4254:2;4250:23;4246:32;4243:45;4240:65;;;4301:1;4298;4291:12;4240:65;4332:2;4324:11;;;;;4354:6;;-1:-1:-1;3751:615:18;;-1:-1:-1;;;;3751:615:18:o;4371:328::-;4448:6;4456;4464;4517:2;4505:9;4496:7;4492:23;4488:32;4485:52;;;4533:1;4530;4523:12;4485:52;4556:29;4575:9;4556:29;:::i;:::-;4546:39;;4604:38;4638:2;4627:9;4623:18;4604:38;:::i;:::-;4594:48;;4689:2;4678:9;4674:18;4661:32;4651:42;;4371:328;;;;;:::o;4704:160::-;4769:20;;4825:13;;4818:21;4808:32;;4798:60;;4854:1;4851;4844:12;4869:180;4925:6;4978:2;4966:9;4957:7;4953:23;4949:32;4946:52;;;4994:1;4991;4984:12;4946:52;5017:26;5033:9;5017:26;:::i;5054:322::-;5123:6;5176:2;5164:9;5155:7;5151:23;5147:32;5144:52;;;5192:1;5189;5182:12;5144:52;5232:9;5219:23;5265:18;5257:6;5254:30;5251:50;;;5297:1;5294;5287:12;5251:50;5320;5362:7;5353:6;5342:9;5338:22;5320:50;:::i;5381:186::-;5440:6;5493:2;5481:9;5472:7;5468:23;5464:32;5461:52;;;5509:1;5506;5499:12;5461:52;5532:29;5551:9;5532:29;:::i;5572:592::-;5643:6;5651;5704:2;5692:9;5683:7;5679:23;5675:32;5672:52;;;5720:1;5717;5710:12;5672:52;5760:9;5747:23;5789:18;5830:2;5822:6;5819:14;5816:34;;;5846:1;5843;5836:12;5816:34;5884:6;5873:9;5869:22;5859:32;;5929:7;5922:4;5918:2;5914:13;5910:27;5900:55;;5951:1;5948;5941:12;5900:55;5991:2;5978:16;6017:2;6009:6;6006:14;6003:34;;;6033:1;6030;6023:12;6003:34;6078:7;6073:2;6064:6;6060:2;6056:15;6052:24;6049:37;6046:57;;;6099:1;6096;6089:12;6169:254;6234:6;6242;6295:2;6283:9;6274:7;6270:23;6266:32;6263:52;;;6311:1;6308;6301:12;6263:52;6334:29;6353:9;6334:29;:::i;:::-;6324:39;;6382:35;6413:2;6402:9;6398:18;6382:35;:::i;:::-;6372:45;;6169:254;;;;;:::o;6428:667::-;6523:6;6531;6539;6547;6600:3;6588:9;6579:7;6575:23;6571:33;6568:53;;;6617:1;6614;6607:12;6568:53;6640:29;6659:9;6640:29;:::i;:::-;6630:39;;6688:38;6722:2;6711:9;6707:18;6688:38;:::i;:::-;6678:48;;6773:2;6762:9;6758:18;6745:32;6735:42;;6828:2;6817:9;6813:18;6800:32;6855:18;6847:6;6844:30;6841:50;;;6887:1;6884;6877:12;6841:50;6910:22;;6963:4;6955:13;;6951:27;-1:-1:-1;6941:55:18;;6992:1;6989;6982:12;6941:55;7015:74;7081:7;7076:2;7063:16;7058:2;7054;7050:11;7015:74;:::i;:::-;7005:84;;;6428:667;;;;;;;:::o;7100:260::-;7168:6;7176;7229:2;7217:9;7208:7;7204:23;7200:32;7197:52;;;7245:1;7242;7235:12;7197:52;7268:29;7287:9;7268:29;:::i;:::-;7258:39;;7316:38;7350:2;7339:9;7335:18;7316:38;:::i;7365:356::-;7567:2;7549:21;;;7586:18;;;7579:30;7645:34;7640:2;7625:18;;7618:62;7712:2;7697:18;;7365:356::o;8086:127::-;8147:10;8142:3;8138:20;8135:1;8128:31;8178:4;8175:1;8168:15;8202:4;8199:1;8192:15;8218:168;8291:9;;;8322;;8339:15;;;8333:22;;8319:37;8309:71;;8360:18;;:::i;8748:125::-;8813:9;;;8834:10;;;8831:36;;;8847:18;;:::i;9237:456::-;9469:3;9507:6;9501:13;9523:66;9582:6;9577:3;9570:4;9562:6;9558:17;9523:66;:::i;:::-;-1:-1:-1;;;9611:16:18;;9636:22;;;-1:-1:-1;9685:1:18;9674:13;;9237:456;-1:-1:-1;9237:456:18:o;9698:135::-;9737:3;9758:17;;;9755:43;;9778:18;;:::i;:::-;-1:-1:-1;9825:1:18;9814:13;;9698:135::o;9838:380::-;9917:1;9913:12;;;;9960;;;9981:61;;10035:4;10027:6;10023:17;10013:27;;9981:61;10088:2;10080:6;10077:14;10057:18;10054:38;10051:161;;10134:10;10129:3;10125:20;10122:1;10115:31;10169:4;10166:1;10159:15;10197:4;10194:1;10187:15;10051:161;;9838:380;;;:::o;11463:127::-;11524:10;11519:3;11515:20;11512:1;11505:31;11555:4;11552:1;11545:15;11579:4;11576:1;11569:15;11595:413;11797:2;11779:21;;;11836:2;11816:18;;;11809:30;11875:34;11870:2;11855:18;;11848:62;-1:-1:-1;;;11941:2:18;11926:18;;11919:47;11998:3;11983:19;;11595:413::o;12964:545::-;13066:2;13061:3;13058:11;13055:448;;;13102:1;13127:5;13123:2;13116:17;13172:4;13168:2;13158:19;13242:2;13230:10;13226:19;13223:1;13219:27;13213:4;13209:38;13278:4;13266:10;13263:20;13260:47;;;-1:-1:-1;13301:4:18;13260:47;13356:2;13351:3;13347:12;13344:1;13340:20;13334:4;13330:31;13320:41;;13411:82;13429:2;13422:5;13419:13;13411:82;;;13474:17;;;13455:1;13444:13;13411:82;;;13415:3;;;12964:545;;;:::o;13685:1352::-;13811:3;13805:10;13838:18;13830:6;13827:30;13824:56;;;13860:18;;:::i;:::-;13889:97;13979:6;13939:38;13971:4;13965:11;13939:38;:::i;:::-;13933:4;13889:97;:::i;:::-;14041:4;;14105:2;14094:14;;14122:1;14117:663;;;;14824:1;14841:6;14838:89;;;-1:-1:-1;14893:19:18;;;14887:26;14838:89;-1:-1:-1;;13642:1:18;13638:11;;;13634:24;13630:29;13620:40;13666:1;13662:11;;;13617:57;14940:81;;14087:944;;14117:663;12911:1;12904:14;;;12948:4;12935:18;;-1:-1:-1;;14153:20:18;;;14271:236;14285:7;14282:1;14279:14;14271:236;;;14374:19;;;14368:26;14353:42;;14466:27;;;;14434:1;14422:14;;;;14301:19;;14271:236;;;14275:3;14535:6;14526:7;14523:19;14520:201;;;14596:19;;;14590:26;-1:-1:-1;;14679:1:18;14675:14;;;14691:3;14671:24;14667:37;14663:42;14648:58;14633:74;;14520:201;-1:-1:-1;;;;;14767:1:18;14751:14;;;14747:22;14734:36;;-1:-1:-1;13685:1352:18:o;15452:1206::-;15576:18;15571:3;15568:27;15565:53;;;15598:18;;:::i;:::-;15627:94;15717:3;15677:38;15709:4;15703:11;15677:38;:::i;:::-;15671:4;15627:94;:::i;:::-;15747:1;15772:2;15767:3;15764:11;15789:1;15784:616;;;;16444:1;16461:3;16458:93;;;-1:-1:-1;16517:19:18;;;16504:33;16458:93;-1:-1:-1;;13642:1:18;13638:11;;;13634:24;13630:29;13620:40;13666:1;13662:11;;;13617:57;16564:78;;15757:895;;15784:616;12911:1;12904:14;;;12948:4;12935:18;;-1:-1:-1;;15820:17:18;;;15921:9;15943:229;15957:7;15954:1;15951:14;15943:229;;;16046:19;;;16033:33;16018:49;;16153:4;16138:20;;;;16106:1;16094:14;;;;15973:12;15943:229;;;15947:3;16200;16191:7;16188:16;16185:159;;;16324:1;16320:6;16314:3;16308;16305:1;16301:11;16297:21;16293:34;16289:39;16276:9;16271:3;16267:19;16254:33;16250:79;16242:6;16235:95;16185:159;;;16387:1;16381:3;16378:1;16374:11;16370:19;16364:4;16357:33;15757:895;;;15452:1206;;;:::o;17428:128::-;17495:9;;;17516:11;;;17513:37;;;17530:18;;:::i;18686:127::-;18747:10;18742:3;18738:20;18735:1;18728:31;18778:4;18775:1;18768:15;18802:4;18799:1;18792:15;18818:120;18858:1;18884;18874:35;;18889:18;;:::i;:::-;-1:-1:-1;18923:9:18;;18818:120::o;18943:112::-;18975:1;19001;18991:35;;19006:18;;:::i;:::-;-1:-1:-1;19040:9:18;;18943:112::o;20703:414::-;20905:2;20887:21;;;20944:2;20924:18;;;20917:30;20983:34;20978:2;20963:18;;20956:62;-1:-1:-1;;;21049:2:18;21034:18;;21027:48;21107:3;21092:19;;20703:414::o;21540:496::-;21719:3;21757:6;21751:13;21773:66;21832:6;21827:3;21820:4;21812:6;21808:17;21773:66;:::i;:::-;21902:13;;21861:16;;;;21924:70;21902:13;21861:16;21971:4;21959:17;;21924:70;:::i;:::-;22010:20;;21540:496;-1:-1:-1;;;;21540:496:18:o;22041:489::-;-1:-1:-1;;;;;22310:15:18;;;22292:34;;22362:15;;22357:2;22342:18;;22335:43;22409:2;22394:18;;22387:34;;;22457:3;22452:2;22437:18;;22430:31;;;22235:4;;22478:46;;22504:19;;22496:6;22478:46;:::i;:::-;22470:54;22041:489;-1:-1:-1;;;;;;22041:489:18:o;22535:249::-;22604:6;22657:2;22645:9;22636:7;22632:23;22628:32;22625:52;;;22673:1;22670;22663:12;22625:52;22705:9;22699:16;22724:30;22748:5;22724:30;:::i;23205:127::-;23266:10;23261:3;23257:20;23254:1;23247:31;23297:4;23294:1;23287:15;23321:4;23318:1;23311:15
Swarm Source
ipfs://e32021caf502e6944cf068ce8ab0d80d818c0197caa44128989193b98babb6ba
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.