ERC-721
NFT
Overview
Max Total Supply
3,551 GAIA
Holders
1,368
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 GAIALoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Gaias
Compiler Version
v0.7.6+commit.7338295f
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-10-01 */ /** *Submitted for verification at Etherscan.io on 2021-09-15 */ // SPDX-License-Identifier: MIT // File: @openzeppelin/contracts/utils/Context.sol pragma solidity >=0.6.0 <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 GSN 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 payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File: @openzeppelin/contracts/introspection/IERC165.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol pragma solidity >=0.6.2 <0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer( address indexed from, address indexed to, uint256 indexed tokenId ); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval( address indexed owner, address indexed approved, uint256 indexed tokenId ); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll( address indexed owner, address indexed operator, bool approved ); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File: @openzeppelin/contracts/token/ERC721/IERC721Metadata.sol pragma solidity >=0.6.2 <0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/token/ERC721/IERC721Enumerable.sol pragma solidity >=0.6.2 <0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 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); } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol pragma solidity >=0.6.0 <0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/introspection/ERC165.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts may inherit from this and call {_registerInterface} to declare * their support of an interface. */ abstract contract ERC165 is IERC165 { /* * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7 */ bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7; /** * @dev Mapping of interface ids to whether or not it's supported. */ mapping(bytes4 => bool) private _supportedInterfaces; constructor() { // Derived contracts need only register support for their own interfaces, // we register support for ERC165 itself here _registerInterface(_INTERFACE_ID_ERC165); } /** * @dev See {IERC165-supportsInterface}. * * Time complexity O(1), guaranteed to always use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return _supportedInterfaces[interfaceId]; } /** * @dev Registers the contract as an implementer of the interface defined by * `interfaceId`. Support of the actual ERC165 interface is automatic and * registering its interface id is not required. * * See {IERC165-supportsInterface}. * * Requirements: * * - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`). */ function _registerInterface(bytes4 interfaceId) internal virtual { require(interfaceId != 0xffffffff, "ERC165: invalid interface id"); _supportedInterfaces[interfaceId] = true; } } // File: @openzeppelin/contracts/math/SafeMath.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b > a) return (false, 0); return (true, a - b); } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a / b); } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a % b); } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a, "SafeMath: subtraction overflow"); return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) return 0; uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: division by zero"); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: modulo by zero"); return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b <= a, errorMessage); return a - b; } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryDiv}. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b > 0, errorMessage); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b > 0, errorMessage); return a % b; } } // File: @openzeppelin/contracts/utils/Address.sol pragma solidity >=0.6.2 <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); } } } } // File: @openzeppelin/contracts/utils/EnumerableSet.sol pragma solidity >=0.6.0 <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)); } } // File: @openzeppelin/contracts/utils/EnumerableMap.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev Library for managing an enumerable variant of Solidity's * https://solidity.readthedocs.io/en/latest/types.html#mapping-types[`mapping`] * type. * * Maps have the following properties: * * - Entries are added, removed, and checked for existence in constant time * (O(1)). * - Entries are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableMap for EnumerableMap.UintToAddressMap; * * // Declare a set state variable * EnumerableMap.UintToAddressMap private myMap; * } * ``` * * As of v3.0.0, only maps of type `uint256 -> address` (`UintToAddressMap`) are * supported. */ library EnumerableMap { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Map type with // bytes32 keys and values. // The Map implementation uses private functions, and user-facing // implementations (such as Uint256ToAddressMap) are just wrappers around // the underlying Map. // This means that we can only create new EnumerableMaps for types that fit // in bytes32. struct MapEntry { bytes32 _key; bytes32 _value; } struct Map { // Storage of map keys and values MapEntry[] _entries; // Position of the entry defined by a key in the `entries` array, plus 1 // because index 0 means a key is not in the map. mapping(bytes32 => uint256) _indexes; } /** * @dev Adds a key-value pair to a map, or updates the value for an existing * key. O(1). * * Returns true if the key was added to the map, that is if it was not * already present. */ function _set( Map storage map, bytes32 key, bytes32 value ) private returns (bool) { // We read and store the key's index to prevent multiple reads from the same storage slot uint256 keyIndex = map._indexes[key]; if (keyIndex == 0) { // Equivalent to !contains(map, key) map._entries.push(MapEntry({_key: key, _value: value})); // The entry is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value map._indexes[key] = map._entries.length; return true; } else { map._entries[keyIndex - 1]._value = value; return false; } } /** * @dev Removes a key-value pair from a map. O(1). * * Returns true if the key was removed from the map, that is if it was present. */ function _remove(Map storage map, bytes32 key) private returns (bool) { // We read and store the key's index to prevent multiple reads from the same storage slot uint256 keyIndex = map._indexes[key]; if (keyIndex != 0) { // Equivalent to contains(map, key) // To delete a key-value pair from the _entries array in O(1), we swap the entry to delete with the last one // in the array, and then remove the last entry (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = keyIndex - 1; uint256 lastIndex = map._entries.length - 1; // When the entry 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. MapEntry storage lastEntry = map._entries[lastIndex]; // Move the last entry to the index where the entry to delete is map._entries[toDeleteIndex] = lastEntry; // Update the index for the moved entry map._indexes[lastEntry._key] = toDeleteIndex + 1; // All indexes are 1-based // Delete the slot where the moved entry was stored map._entries.pop(); // Delete the index for the deleted slot delete map._indexes[key]; return true; } else { return false; } } /** * @dev Returns true if the key is in the map. O(1). */ function _contains(Map storage map, bytes32 key) private view returns (bool) { return map._indexes[key] != 0; } /** * @dev Returns the number of key-value pairs in the map. O(1). */ function _length(Map storage map) private view returns (uint256) { return map._entries.length; } /** * @dev Returns the key-value pair stored at position `index` in the map. O(1). * * Note that there are no guarantees on the ordering of entries inside the * array, and it may change when more entries are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Map storage map, uint256 index) private view returns (bytes32, bytes32) { require( map._entries.length > index, "EnumerableMap: index out of bounds" ); MapEntry storage entry = map._entries[index]; return (entry._key, entry._value); } /** * @dev Tries to returns the value associated with `key`. O(1). * Does not revert if `key` is not in the map. */ function _tryGet(Map storage map, bytes32 key) private view returns (bool, bytes32) { uint256 keyIndex = map._indexes[key]; if (keyIndex == 0) return (false, 0); // Equivalent to contains(map, key) return (true, map._entries[keyIndex - 1]._value); // All indexes are 1-based } /** * @dev Returns the value associated with `key`. O(1). * * Requirements: * * - `key` must be in the map. */ function _get(Map storage map, bytes32 key) private view returns (bytes32) { uint256 keyIndex = map._indexes[key]; require(keyIndex != 0, "EnumerableMap: nonexistent key"); // Equivalent to contains(map, key) return map._entries[keyIndex - 1]._value; // All indexes are 1-based } /** * @dev Same as {_get}, with a custom error message when `key` is not in the map. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {_tryGet}. */ function _get( Map storage map, bytes32 key, string memory errorMessage ) private view returns (bytes32) { uint256 keyIndex = map._indexes[key]; require(keyIndex != 0, errorMessage); // Equivalent to contains(map, key) return map._entries[keyIndex - 1]._value; // All indexes are 1-based } // UintToAddressMap struct UintToAddressMap { Map _inner; } /** * @dev Adds a key-value pair to a map, or updates the value for an existing * key. O(1). * * Returns true if the key was added to the map, that is if it was not * already present. */ function set( UintToAddressMap storage map, uint256 key, address value ) internal returns (bool) { return _set(map._inner, bytes32(key), bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the key was removed from the map, that is if it was present. */ function remove(UintToAddressMap storage map, uint256 key) internal returns (bool) { return _remove(map._inner, bytes32(key)); } /** * @dev Returns true if the key is in the map. O(1). */ function contains(UintToAddressMap storage map, uint256 key) internal view returns (bool) { return _contains(map._inner, bytes32(key)); } /** * @dev Returns the number of elements in the map. O(1). */ function length(UintToAddressMap storage map) internal view returns (uint256) { return _length(map._inner); } /** * @dev Returns the element 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(UintToAddressMap storage map, uint256 index) internal view returns (uint256, address) { (bytes32 key, bytes32 value) = _at(map._inner, index); return (uint256(key), address(uint160(uint256(value)))); } /** * @dev Tries to returns the value associated with `key`. O(1). * Does not revert if `key` is not in the map. * * _Available since v3.4._ */ function tryGet(UintToAddressMap storage map, uint256 key) internal view returns (bool, address) { (bool success, bytes32 value) = _tryGet(map._inner, bytes32(key)); return (success, address(uint160(uint256(value)))); } /** * @dev Returns the value associated with `key`. O(1). * * Requirements: * * - `key` must be in the map. */ function get(UintToAddressMap storage map, uint256 key) internal view returns (address) { return address(uint160(uint256(_get(map._inner, bytes32(key))))); } /** * @dev Same as {get}, with a custom error message when `key` is not in the map. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryGet}. */ function get( UintToAddressMap storage map, uint256 key, string memory errorMessage ) internal view returns (address) { return address( uint160(uint256(_get(map._inner, bytes32(key), errorMessage))) ); } } // File: @openzeppelin/contracts/utils/Strings.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev String operations. */ library Strings { /** * @dev Converts a `uint256` to its ASCII `string` 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); uint256 index = digits - 1; temp = value; while (temp != 0) { buffer[index--] = bytes1(uint8(48 + (temp % 10))); temp /= 10; } return string(buffer); } } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol pragma solidity >=0.6.0 <0.8.0; /** * @title ERC721 Non-Fungible Token Standard basic implementation * @dev see https://eips.ethereum.org/EIPS/eip-721 */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable { using SafeMath for uint256; using Address for address; using EnumerableSet for EnumerableSet.UintSet; using EnumerableMap for EnumerableMap.UintToAddressMap; using Strings for uint256; // Equals to `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))` // which can be also obtained as `IERC721Receiver(0).onERC721Received.selector` bytes4 private constant _ERC721_RECEIVED = 0x150b7a02; // Mapping from holder address to their (enumerable) set of owned tokens mapping(address => EnumerableSet.UintSet) private _holderTokens; // Enumerable mapping from token ids to their owners EnumerableMap.UintToAddressMap private _tokenOwners; // 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; // Token name string private _name; // Token symbol string private _symbol; // Optional mapping for token URIs mapping(uint256 => string) private _tokenURIs; // Base URI string private _baseURI; /* * bytes4(keccak256('balanceOf(address)')) == 0x70a08231 * bytes4(keccak256('ownerOf(uint256)')) == 0x6352211e * bytes4(keccak256('approve(address,uint256)')) == 0x095ea7b3 * bytes4(keccak256('getApproved(uint256)')) == 0x081812fc * bytes4(keccak256('setApprovalForAll(address,bool)')) == 0xa22cb465 * bytes4(keccak256('isApprovedForAll(address,address)')) == 0xe985e9c5 * bytes4(keccak256('transferFrom(address,address,uint256)')) == 0x23b872dd * bytes4(keccak256('safeTransferFrom(address,address,uint256)')) == 0x42842e0e * bytes4(keccak256('safeTransferFrom(address,address,uint256,bytes)')) == 0xb88d4fde * * => 0x70a08231 ^ 0x6352211e ^ 0x095ea7b3 ^ 0x081812fc ^ * 0xa22cb465 ^ 0xe985e9c5 ^ 0x23b872dd ^ 0x42842e0e ^ 0xb88d4fde == 0x80ac58cd */ bytes4 private constant _INTERFACE_ID_ERC721 = 0x80ac58cd; /* * bytes4(keccak256('name()')) == 0x06fdde03 * bytes4(keccak256('symbol()')) == 0x95d89b41 * bytes4(keccak256('tokenURI(uint256)')) == 0xc87b56dd * * => 0x06fdde03 ^ 0x95d89b41 ^ 0xc87b56dd == 0x5b5e139f */ bytes4 private constant _INTERFACE_ID_ERC721_METADATA = 0x5b5e139f; /* * bytes4(keccak256('totalSupply()')) == 0x18160ddd * bytes4(keccak256('tokenOfOwnerByIndex(address,uint256)')) == 0x2f745c59 * bytes4(keccak256('tokenByIndex(uint256)')) == 0x4f6ccce7 * * => 0x18160ddd ^ 0x2f745c59 ^ 0x4f6ccce7 == 0x780e9d63 */ bytes4 private constant _INTERFACE_ID_ERC721_ENUMERABLE = 0x780e9d63; /** * @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_; // register the supported interfaces to conform to ERC721 via ERC165 _registerInterface(_INTERFACE_ID_ERC721); _registerInterface(_INTERFACE_ID_ERC721_METADATA); _registerInterface(_INTERFACE_ID_ERC721_ENUMERABLE); } /** * @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 _holderTokens[owner].length(); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { return _tokenOwners.get( tokenId, "ERC721: owner query for nonexistent token" ); } /** * @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 _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)); } // If there is a baseURI but no tokenURI, concatenate the tokenID to the baseURI. return string(abi.encodePacked(base, tokenId.toString())); } /** * @dev Returns the base URI set via {_setBaseURI}. This will be * automatically added as a prefix in {tokenURI} to each token's URI, or * to the token ID if no specific URI is set for that token ID. */ function baseURI() public view virtual returns (string memory) { return _baseURI; } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { return _holderTokens[owner].at(index); } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { // _tokenOwners are indexed by tokenIds, so .length() returns the number of tokenIds return _tokenOwners.length(); } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { (uint256 tokenId, ) = _tokenOwners.at(index); return tokenId; } /** * @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 _tokenOwners.contains(tokenId); } /** * @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: d* * - `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); _holderTokens[to].add(tokenId); _tokenOwners.set(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); // internal owner _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); // Clear metadata (if any) if (bytes(_tokenURIs[tokenId]).length != 0) { delete _tokenURIs[tokenId]; } _holderTokens[owner].remove(tokenId); _tokenOwners.remove(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" ); // internal owner require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _holderTokens[from].remove(tokenId); _holderTokens[to].add(tokenId); _tokenOwners.set(tokenId, to); emit Transfer(from, to, 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), "ERC721Metadata: URI set of nonexistent token" ); _tokenURIs[tokenId] = _tokenURI; } /** * @dev Internal function to set the base URI for all token IDs. It is * automatically added as a prefix to the value returned in {tokenURI}, * or to the token ID if {tokenURI} is empty. */ function _setBaseURI(string memory baseURI_) internal virtual { _baseURI = baseURI_; } /** * @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()) { return true; } bytes memory returndata = to.functionCall( abi.encodeWithSelector( IERC721Receiver(to).onERC721Received.selector, _msgSender(), from, tokenId, _data ), "ERC721: transfer to non ERC721Receiver implementer" ); bytes4 retval = abi.decode(returndata, (bytes4)); return (retval == _ERC721_RECEIVED); } /** * @dev Approve `to` to operate on `tokenId` * * Emits an {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); // internal owner } /** * @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 {} } // File: @openzeppelin/contracts/access/Ownable.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require( newOwner != address(0), "Ownable: new owner is the zero address" ); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } pragma solidity ^0.7.0; pragma abicoder v2; contract Gaias is ERC721, Ownable { using SafeMath for uint256; string public GAIAS_PROVENANCE = ""; // IPFS PROVENANCE TO BE ADDED WHEN SOLD OUT string public LICENSE_TEXT = ""; bool licenseLocked = false; uint256 public gaiaPrice = 75000000000000000; // 0.075 ETH uint256 public constant maxGaiaPurchase = 100; uint256 public constant MAX_GAIAS = 10000; bool public saleIsActive = false; uint256 public gaiaReserve = 1550; // Reserve 55 faces for team & community (Used in giveaways, events etc...) event licenseisLocked(string _licenseText); address ownerAddress; constructor() ERC721("GAIA", "GAIA") { ownerAddress = msg.sender; } function withdraw() external onlyOwner { uint256 balance = address(this).balance; payable(ownerAddress).transfer(balance); } function reserveGaias(address _to, uint256 _reserveAmount) public onlyOwner { uint256 supply = totalSupply(); require( _reserveAmount > 0 && _reserveAmount <= gaiaReserve, "Not enough reserve left for team" ); for (uint256 i = 0; i < _reserveAmount; i++) { _safeMint(_to, supply + i); } gaiaReserve = gaiaReserve.sub(_reserveAmount); } function setProvenanceHash(string memory provenanceHash) public onlyOwner { GAIAS_PROVENANCE = provenanceHash; } function setBaseURI(string memory baseURI) public onlyOwner { _setBaseURI(baseURI); } function flipSaleState() public onlyOwner { saleIsActive = !saleIsActive; } function tokensOfOwner(address _owner) external view returns (uint256[] memory) { uint256 tokenCount = balanceOf(_owner); if (tokenCount == 0) { // Return an empty array return new uint256[](0); } else { uint256[] memory result = new uint256[](tokenCount); uint256 index; for (index = 0; index < tokenCount; index++) { result[index] = tokenOfOwnerByIndex(_owner, index); } return result; } } // Returns the license for tokens function tokenLicense(uint256 _id) public view returns (string memory) { require(_id < totalSupply(), "CHOOSE A GAIA WITHIN RANGE"); return LICENSE_TEXT; } // Locks the license to prevent further changes function lockLicense() public onlyOwner { licenseLocked = true; emit licenseisLocked(LICENSE_TEXT); } // Change the license function changeLicense(string memory _license) public onlyOwner { require(licenseLocked == false, "License already locked"); LICENSE_TEXT = _license; } function mintGaia(uint256 numberOfTokens) public payable { require(saleIsActive, "Sale must be active to mint Gaia"); require( numberOfTokens > 0 && numberOfTokens <= maxGaiaPurchase, "Can only mint 50 tokens at a time" ); require( totalSupply().add(numberOfTokens) <= MAX_GAIAS, "Purchase would exceed max supply of Gaias" ); require( msg.value >= gaiaPrice.mul(numberOfTokens), "Ether value sent is not correct" ); for (uint256 i = 0; i < numberOfTokens; i++) { uint256 mintIndex = totalSupply(); if (totalSupply() < MAX_GAIAS) { _safeMint(msg.sender, mintIndex); } } } function setFacePrice(uint256 newPrice) public onlyOwner { gaiaPrice = newPrice; } }
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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"_licenseText","type":"string"}],"name":"licenseisLocked","type":"event"},{"inputs":[],"name":"GAIAS_PROVENANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LICENSE_TEXT","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_GAIAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_license","type":"string"}],"name":"changeLicense","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"gaiaPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gaiaReserve","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"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":"lockLicense","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxGaiaPurchase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mintGaia","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_reserveAmount","type":"uint256"}],"name":"reserveGaias","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setFacePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"provenanceHash","type":"string"}],"name":"setProvenanceHash","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":"uint256","name":"_id","type":"uint256"}],"name":"tokenLicense","outputs":[{"internalType":"string","name":"","type":"string"}],"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":[{"internalType":"address","name":"_owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60a06040819052600060808190526200001b91600b91620001e9565b506040805160208101918290526000908190526200003c91600c91620001e9565b50600d805460ff1990811690915567010a741a46278000600e55600f8054909116905561060e6010553480156200007257600080fd5b506040805180820182526004808252634741494160e01b602080840182905284518086019095529184529083015290620000b36301ffc9a760e01b6200018a565b8151620000c8906006906020850190620001e9565b508051620000de906007906020840190620001e9565b50620000f16380ac58cd60e01b6200018a565b62000103635b5e139f60e01b6200018a565b6200011563780e9d6360e01b6200018a565b506000905062000124620001e5565b600a80546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350601180546001600160a01b03191633179055620002cc565b6001600160e01b03198082161415620001c05760405162461bcd60e51b8152600401620001b79062000295565b60405180910390fd5b6001600160e01b0319166000908152602081905260409020805460ff19166001179055565b3390565b828054600181600116156101000203166002900490600052602060002090601f0160209004810192826200022157600085556200026c565b82601f106200023c57805160ff19168380011785556200026c565b828001600101855582156200026c579182015b828111156200026c5782518255916020019190600101906200024f565b506200027a9291506200027e565b5090565b5b808211156200027a57600081556001016200027f565b6020808252601c908201527f4552433136353a20696e76616c696420696e7465726661636520696400000000604082015260600190565b612b1e80620002dc6000396000f3fe6080604052600436106102255760003560e01c80637786ed5411610123578063bc2122ab116100ab578063e40386651161006f578063e4038665146105fa578063e985e9c51461060f578063eb8d24441461062f578063ef7c664714610644578063f2fde38b1461065957610225565b8063bc2122ab1461057b578063bf4702fc14610590578063c87b56dd146105a5578063d6cf9c45146105c5578063d9b137b2146105da57610225565b80639c3e72bd116100f25780639c3e72bd146104e6578063a22cb465146104fb578063b09904b51461051b578063b88d4fde1461053b578063bab5d0251461055b57610225565b80637786ed541461047c5780638462151c1461048f5780638da5cb5b146104bc57806395d89b41146104d157610225565b80633ccfd60b116101b15780636c0360eb116101755780636c0360eb146103fd5780636d572312146104125780636f05c2161461042757806370a0823114610447578063715018a61461046757610225565b80633ccfd60b1461036857806342842e0e1461037d5780634f6ccce71461039d57806355f804b3146103bd5780636352211e146103dd57610225565b806310969523116101f857806310969523146102d157806318160ddd146102f157806323b872dd146103135780632f745c591461033357806334918dfd1461035357610225565b806301ffc9a71461022a57806306fdde0314610260578063081812fc14610282578063095ea7b3146102af575b600080fd5b34801561023657600080fd5b5061024a6102453660046120d3565b610679565b6040516102579190612275565b60405180910390f35b34801561026c57600080fd5b5061027561069c565b6040516102579190612280565b34801561028e57600080fd5b506102a261029d366004612151565b610732565b60405161025791906121e0565b3480156102bb57600080fd5b506102cf6102ca3660046120aa565b61077e565b005b3480156102dd57600080fd5b506102cf6102ec36600461210b565b610816565b3480156102fd57600080fd5b5061030661086c565b6040516102579190612a36565b34801561031f57600080fd5b506102cf61032e366004611fbc565b61087d565b34801561033f57600080fd5b5061030661034e3660046120aa565b6108b5565b34801561035f57600080fd5b506102cf6108e0565b34801561037457600080fd5b506102cf610933565b34801561038957600080fd5b506102cf610398366004611fbc565b6109ac565b3480156103a957600080fd5b506103066103b8366004612151565b6109c7565b3480156103c957600080fd5b506102cf6103d836600461210b565b6109dd565b3480156103e957600080fd5b506102a26103f8366004612151565b610a28565b34801561040957600080fd5b50610275610a50565b34801561041e57600080fd5b50610275610ab1565b34801561043357600080fd5b506102cf6104423660046120aa565b610b3f565b34801561045357600080fd5b50610306610462366004611f70565b610bed565b34801561047357600080fd5b506102cf610c36565b6102cf61048a366004612151565b610cbf565b34801561049b57600080fd5b506104af6104aa366004611f70565b610da8565b6040516102579190612231565b3480156104c857600080fd5b506102a2610e56565b3480156104dd57600080fd5b50610275610e65565b3480156104f257600080fd5b50610275610ec6565b34801561050757600080fd5b506102cf610516366004612070565b610f21565b34801561052757600080fd5b506102cf61053636600461210b565b610fef565b34801561054757600080fd5b506102cf610556366004611ff7565b611064565b34801561056757600080fd5b506102cf610576366004612151565b6110a3565b34801561058757600080fd5b506103066110e7565b34801561059c57600080fd5b506102cf6110ed565b3480156105b157600080fd5b506102756105c0366004612151565b611174565b3480156105d157600080fd5b506103066112b8565b3480156105e657600080fd5b506102756105f5366004612151565b6112be565b34801561060657600080fd5b50610306611378565b34801561061b57600080fd5b5061024a61062a366004611f8a565b61137d565b34801561063b57600080fd5b5061024a6113ab565b34801561065057600080fd5b506103066113b4565b34801561066557600080fd5b506102cf610674366004611f70565b6113ba565b6001600160e01b0319811660009081526020819052604090205460ff165b919050565b60068054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156107285780601f106106fd57610100808354040283529160200191610728565b820191906000526020600020905b81548152906001019060200180831161070b57829003601f168201915b5050505050905090565b600061073d8261147b565b6107625760405162461bcd60e51b8152600401610759906127db565b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061078982610a28565b9050806001600160a01b0316836001600160a01b031614156107bd5760405162461bcd60e51b8152600401610759906128f4565b806001600160a01b03166107cf611488565b6001600160a01b031614806107eb57506107eb8161062a611488565b6108075760405162461bcd60e51b81526004016107599061263b565b610811838361148c565b505050565b61081e611488565b6001600160a01b031661082f610e56565b6001600160a01b0316146108555760405162461bcd60e51b815260040161075990612827565b805161086890600b906020840190611e54565b5050565b600061087860026114fa565b905090565b61088e610888611488565b82611505565b6108aa5760405162461bcd60e51b815260040161075990612965565b61081183838361158a565b6001600160a01b03821660009081526001602052604081206108d79083611698565b90505b92915050565b6108e8611488565b6001600160a01b03166108f9610e56565b6001600160a01b03161461091f5760405162461bcd60e51b815260040161075990612827565b600f805460ff19811660ff90911615179055565b61093b611488565b6001600160a01b031661094c610e56565b6001600160a01b0316146109725760405162461bcd60e51b815260040161075990612827565b60115460405147916001600160a01b03169082156108fc029083906000818181858888f19350505050158015610868573d6000803e3d6000fd5b61081183838360405180602001604052806000815250611064565b6000806109d56002846116a4565b509392505050565b6109e5611488565b6001600160a01b03166109f6610e56565b6001600160a01b031614610a1c5760405162461bcd60e51b815260040161075990612827565b610a25816116c0565b50565b60006108da82604051806060016040528060298152602001612ac060299139600291906116d3565b60098054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156107285780601f106106fd57610100808354040283529160200191610728565b600b805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015610b375780601f10610b0c57610100808354040283529160200191610b37565b820191906000526020600020905b815481529060010190602001808311610b1a57829003601f168201915b505050505081565b610b47611488565b6001600160a01b0316610b58610e56565b6001600160a01b031614610b7e5760405162461bcd60e51b815260040161075990612827565b6000610b8861086c565b9050600082118015610b9c57506010548211155b610bb85760405162461bcd60e51b8152600401610759906124d1565b60005b82811015610bd757610bcf848284016116ea565b600101610bbb565b50601054610be59083611704565b601055505050565b60006001600160a01b038216610c155760405162461bcd60e51b8152600401610759906126d9565b6001600160a01b03821660009081526001602052604090206108da906114fa565b610c3e611488565b6001600160a01b0316610c4f610e56565b6001600160a01b031614610c755760405162461bcd60e51b815260040161075990612827565b600a546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600a80546001600160a01b0319169055565b600f5460ff16610ce15760405162461bcd60e51b81526004016107599061249c565b600081118015610cf2575060648111155b610d0e5760405162461bcd60e51b815260040161075990612698565b612710610d2382610d1d61086c565b9061172c565b1115610d415760405162461bcd60e51b8152600401610759906129ed565b600e54610d4e9082611751565b341015610d6d5760405162461bcd60e51b815260040161075990612581565b60005b81811015610868576000610d8261086c565b9050612710610d8f61086c565b1015610d9f57610d9f33826116ea565b50600101610d70565b60606000610db583610bed565b905080610dd2575050604080516000815260208101909152610697565b60008167ffffffffffffffff81118015610deb57600080fd5b50604051908082528060200260200182016040528015610e15578160200160208202803683370190505b50905060005b82811015610e4c57610e2d85826108b5565b828281518110610e3957fe5b6020908102919091010152600101610e1b565b5091506106979050565b600a546001600160a01b031690565b60078054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156107285780601f106106fd57610100808354040283529160200191610728565b600c805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015610b375780601f10610b0c57610100808354040283529160200191610b37565b610f29611488565b6001600160a01b0316826001600160a01b03161415610f5a5760405162461bcd60e51b81526004016107599061254a565b8060056000610f67611488565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155610fab611488565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610fe39190612275565b60405180910390a35050565b610ff7611488565b6001600160a01b0316611008610e56565b6001600160a01b03161461102e5760405162461bcd60e51b815260040161075990612827565b600d5460ff16156110515760405162461bcd60e51b815260040161075990612935565b805161086890600c906020840190611e54565b61107561106f611488565b83611505565b6110915760405162461bcd60e51b815260040161075990612965565b61109d8484848461178b565b50505050565b6110ab611488565b6001600160a01b03166110bc610e56565b6001600160a01b0316146110e25760405162461bcd60e51b815260040161075990612827565b600e55565b61271081565b6110f5611488565b6001600160a01b0316611106610e56565b6001600160a01b03161461112c5760405162461bcd60e51b815260040161075990612827565b600d805460ff191660011790556040517f92423ccd40e13759d50d24569dcbaccb20ade47247f3cf3e3951a9f29d2048b09061116a90600c90612293565b60405180910390a1565b606061117f8261147b565b61119b5760405162461bcd60e51b8152600401610759906128a5565b60008281526008602090815260408083208054825160026001831615610100026000190190921691909104601f81018590048502820185019093528281529290919083018282801561122e5780601f106112035761010080835404028352916020019161122e565b820191906000526020600020905b81548152906001019060200180831161121157829003601f168201915b50505050509050600061123f610a50565b905080516000141561125357509050610697565b81511561128557808260405160200161126d9291906121b1565b60405160208183030381529060405292505050610697565b8061128f856117be565b6040516020016112a09291906121b1565b60405160208183030381529060405292505050919050565b60105481565b60606112c861086c565b82106112e65760405162461bcd60e51b81526004016107599061235f565b600c805460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152929183018282801561136c5780601f106113415761010080835404028352916020019161136c565b820191906000526020600020905b81548152906001019060200180831161134f57829003601f168201915b50505050509050919050565b606481565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b600f5460ff1681565b600e5481565b6113c2611488565b6001600160a01b03166113d3610e56565b6001600160a01b0316146113f95760405162461bcd60e51b815260040161075990612827565b6001600160a01b03811661141f5760405162461bcd60e51b8152600401610759906123e8565b600a546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600a80546001600160a01b0319166001600160a01b0392909216919091179055565b60006108da600283611899565b3390565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906114c182610a28565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006108da826118a5565b60006115108261147b565b61152c5760405162461bcd60e51b8152600401610759906125ef565b600061153783610a28565b9050806001600160a01b0316846001600160a01b031614806115725750836001600160a01b031661156784610732565b6001600160a01b0316145b806115825750611582818561137d565b949350505050565b826001600160a01b031661159d82610a28565b6001600160a01b0316146115c35760405162461bcd60e51b81526004016107599061285c565b6001600160a01b0382166115e95760405162461bcd60e51b815260040161075990612506565b6115f4838383610811565b6115ff60008261148c565b6001600160a01b038316600090815260016020526040902061162190826118a9565b506001600160a01b038216600090815260016020526040902061164490826118b5565b50611651600282846118c1565b5080826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60006108d783836118d7565b60008080806116b3868661191c565b9097909650945050505050565b8051610868906009906020840190611e54565b60006116e0848484611978565b90505b9392505050565b6108688282604051806020016040528060008152506119d7565b6000828211156117265760405162461bcd60e51b8152600401610759906125b8565b50900390565b6000828201838110156108d75760405162461bcd60e51b815260040161075990612465565b600082611760575060006108da565b8282028284828161176d57fe5b04146108d75760405162461bcd60e51b81526004016107599061279a565b61179684848461158a565b6117a284848484611a0a565b61109d5760405162461bcd60e51b815260040161075990612396565b6060816117e357506040805180820190915260018152600360fc1b6020820152610697565b8160005b81156117fb57600101600a820491506117e7565b60008167ffffffffffffffff8111801561181457600080fd5b506040519080825280601f01601f19166020018201604052801561183f576020820181803683370190505b50859350905060001982015b831561189057600a840660300160f81b8282806001900393508151811061186e57fe5b60200101906001600160f81b031916908160001a905350600a8404935061184b565b50949350505050565b60006108d78383611ae9565b5490565b60006108d78383611b01565b60006108d78383611bc7565b60006116e084846001600160a01b038516611c11565b815460009082106118fa5760405162461bcd60e51b81526004016107599061231d565b82600001828154811061190957fe5b9060005260206000200154905092915050565b8154600090819083106119415760405162461bcd60e51b815260040161075990612723565b600084600001848154811061195257fe5b906000526020600020906002020190508060000154816001015492509250509250929050565b600082815260018401602052604081205482816119a85760405162461bcd60e51b81526004016107599190612280565b508460000160018203815481106119bb57fe5b9060005260206000209060020201600101549150509392505050565b6119e18383611ca8565b6119ee6000848484611a0a565b6108115760405162461bcd60e51b815260040161075990612396565b6000611a1e846001600160a01b0316611d6c565b611a2a57506001611582565b6000611ab2630a85bd0160e11b611a3f611488565b888787604051602401611a5594939291906121f4565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050604051806060016040528060328152602001612a8e603291396001600160a01b0388169190611d72565b9050600081806020019051810190611aca91906120ef565b6001600160e01b031916630a85bd0160e11b1492505050949350505050565b60009081526001919091016020526040902054151590565b60008181526001830160205260408120548015611bbd5783546000198083019190810190600090879083908110611b3457fe5b9060005260206000200154905080876000018481548110611b5157fe5b600091825260208083209091019290925582815260018981019092526040902090840190558654879080611b8157fe5b600190038181906000526020600020016000905590558660010160008781526020019081526020016000206000905560019450505050506108da565b60009150506108da565b6000611bd38383611ae9565b611c09575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556108da565b5060006108da565b600082815260018401602052604081205480611c765750506040805180820182528381526020808201848152865460018181018955600089815284812095516002909302909501918255915190820155865486845281880190925292909120556116e3565b82856000016001830381548110611c8957fe5b90600052602060002090600202016001018190555060009150506116e3565b6001600160a01b038216611cce5760405162461bcd60e51b815260040161075990612765565b611cd78161147b565b15611cf45760405162461bcd60e51b81526004016107599061242e565b611d0060008383610811565b6001600160a01b0382166000908152600160205260409020611d2290826118b5565b50611d2f600282846118c1565b5060405181906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b3b151590565b60606116e0848460008585611d8685611d6c565b611da25760405162461bcd60e51b8152600401610759906129b6565b600080866001600160a01b03168587604051611dbe9190612195565b60006040518083038185875af1925050503d8060008114611dfb576040519150601f19603f3d011682016040523d82523d6000602084013e611e00565b606091505b5091509150611e10828286611e1b565b979650505050505050565b60608315611e2a5750816116e3565b825115611e3a5782518084602001fd5b8160405162461bcd60e51b81526004016107599190612280565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282611e8a5760008555611ed0565b82601f10611ea357805160ff1916838001178555611ed0565b82800160010185558215611ed0579182015b82811115611ed0578251825591602001919060010190611eb5565b50611edc929150611ee0565b5090565b5b80821115611edc5760008155600101611ee1565b600067ffffffffffffffff80841115611f0a57fe5b604051601f8501601f191681016020018281118282101715611f2857fe5b604052848152915081838501861015611f4057600080fd5b8484602083013760006020868301015250509392505050565b80356001600160a01b038116811461069757600080fd5b600060208284031215611f81578081fd5b6108d782611f59565b60008060408385031215611f9c578081fd5b611fa583611f59565b9150611fb360208401611f59565b90509250929050565b600080600060608486031215611fd0578081fd5b611fd984611f59565b9250611fe760208501611f59565b9150604084013590509250925092565b6000806000806080858703121561200c578081fd5b61201585611f59565b935061202360208601611f59565b925060408501359150606085013567ffffffffffffffff811115612045578182fd5b8501601f81018713612055578182fd5b61206487823560208401611ef5565b91505092959194509250565b60008060408385031215612082578182fd5b61208b83611f59565b91506020830135801515811461209f578182fd5b809150509250929050565b600080604083850312156120bc578182fd5b6120c583611f59565b946020939093013593505050565b6000602082840312156120e4578081fd5b81356108d781612a77565b600060208284031215612100578081fd5b81516108d781612a77565b60006020828403121561211c578081fd5b813567ffffffffffffffff811115612132578182fd5b8201601f81018413612142578182fd5b61158284823560208401611ef5565b600060208284031215612162578081fd5b5035919050565b60008151808452612181816020860160208601612a4b565b601f01601f19169290920160200192915050565b600082516121a7818460208701612a4b565b9190910192915050565b600083516121c3818460208801612a4b565b8351908301906121d7818360208801612a4b565b01949350505050565b6001600160a01b0391909116815260200190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061222790830184612169565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156122695783518352928401929184019160010161224d565b50909695505050505050565b901515815260200190565b6000602082526108d76020830184612169565b600060208083018184528285546001808216600081146122ba57600181146122d857612310565b60028304607f16855260ff1983166040890152606088019350612310565b600283048086526122e88a612a3f565b885b828110156123065781548b8201604001529084019088016122ea565b8a01604001955050505b5091979650505050505050565b60208082526022908201527f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e604082015261647360f01b606082015260800190565b6020808252601a908201527f43484f4f5345204120474149412057495448494e2052414e4745000000000000604082015260600190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b6020808252818101527f53616c65206d7573742062652061637469766520746f206d696e742047616961604082015260600190565b6020808252818101527f4e6f7420656e6f7567682072657365727665206c65667420666f72207465616d604082015260600190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b6020808252601f908201527f45746865722076616c75652073656e74206973206e6f7420636f727265637400604082015260600190565b6020808252601e908201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604082015260600190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b60208082526021908201527f43616e206f6e6c79206d696e7420353020746f6b656e7320617420612074696d6040820152606560f81b606082015260800190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526022908201527f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e604082015261647360f01b606082015260800190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b6020808252602f908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201526e3732bc34b9ba32b73a103a37b5b2b760891b606082015260800190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b602080825260169082015275131a58d95b9cd948185b1c9958591e481b1bd8dad95960521b604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b60208082526029908201527f507572636861736520776f756c6420657863656564206d617820737570706c79604082015268206f6620476169617360b81b606082015260800190565b90815260200190565b60009081526020902090565b60005b83811015612a66578181015183820152602001612a4e565b8381111561109d5750506000910152565b6001600160e01b031981168114610a2557600080fdfe4552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea26469706673582212206740162767ea3ce318ec2065a1cdeb4096665774438165286160fda8e31f00c364736f6c63430007060033
Deployed Bytecode
0x6080604052600436106102255760003560e01c80637786ed5411610123578063bc2122ab116100ab578063e40386651161006f578063e4038665146105fa578063e985e9c51461060f578063eb8d24441461062f578063ef7c664714610644578063f2fde38b1461065957610225565b8063bc2122ab1461057b578063bf4702fc14610590578063c87b56dd146105a5578063d6cf9c45146105c5578063d9b137b2146105da57610225565b80639c3e72bd116100f25780639c3e72bd146104e6578063a22cb465146104fb578063b09904b51461051b578063b88d4fde1461053b578063bab5d0251461055b57610225565b80637786ed541461047c5780638462151c1461048f5780638da5cb5b146104bc57806395d89b41146104d157610225565b80633ccfd60b116101b15780636c0360eb116101755780636c0360eb146103fd5780636d572312146104125780636f05c2161461042757806370a0823114610447578063715018a61461046757610225565b80633ccfd60b1461036857806342842e0e1461037d5780634f6ccce71461039d57806355f804b3146103bd5780636352211e146103dd57610225565b806310969523116101f857806310969523146102d157806318160ddd146102f157806323b872dd146103135780632f745c591461033357806334918dfd1461035357610225565b806301ffc9a71461022a57806306fdde0314610260578063081812fc14610282578063095ea7b3146102af575b600080fd5b34801561023657600080fd5b5061024a6102453660046120d3565b610679565b6040516102579190612275565b60405180910390f35b34801561026c57600080fd5b5061027561069c565b6040516102579190612280565b34801561028e57600080fd5b506102a261029d366004612151565b610732565b60405161025791906121e0565b3480156102bb57600080fd5b506102cf6102ca3660046120aa565b61077e565b005b3480156102dd57600080fd5b506102cf6102ec36600461210b565b610816565b3480156102fd57600080fd5b5061030661086c565b6040516102579190612a36565b34801561031f57600080fd5b506102cf61032e366004611fbc565b61087d565b34801561033f57600080fd5b5061030661034e3660046120aa565b6108b5565b34801561035f57600080fd5b506102cf6108e0565b34801561037457600080fd5b506102cf610933565b34801561038957600080fd5b506102cf610398366004611fbc565b6109ac565b3480156103a957600080fd5b506103066103b8366004612151565b6109c7565b3480156103c957600080fd5b506102cf6103d836600461210b565b6109dd565b3480156103e957600080fd5b506102a26103f8366004612151565b610a28565b34801561040957600080fd5b50610275610a50565b34801561041e57600080fd5b50610275610ab1565b34801561043357600080fd5b506102cf6104423660046120aa565b610b3f565b34801561045357600080fd5b50610306610462366004611f70565b610bed565b34801561047357600080fd5b506102cf610c36565b6102cf61048a366004612151565b610cbf565b34801561049b57600080fd5b506104af6104aa366004611f70565b610da8565b6040516102579190612231565b3480156104c857600080fd5b506102a2610e56565b3480156104dd57600080fd5b50610275610e65565b3480156104f257600080fd5b50610275610ec6565b34801561050757600080fd5b506102cf610516366004612070565b610f21565b34801561052757600080fd5b506102cf61053636600461210b565b610fef565b34801561054757600080fd5b506102cf610556366004611ff7565b611064565b34801561056757600080fd5b506102cf610576366004612151565b6110a3565b34801561058757600080fd5b506103066110e7565b34801561059c57600080fd5b506102cf6110ed565b3480156105b157600080fd5b506102756105c0366004612151565b611174565b3480156105d157600080fd5b506103066112b8565b3480156105e657600080fd5b506102756105f5366004612151565b6112be565b34801561060657600080fd5b50610306611378565b34801561061b57600080fd5b5061024a61062a366004611f8a565b61137d565b34801561063b57600080fd5b5061024a6113ab565b34801561065057600080fd5b506103066113b4565b34801561066557600080fd5b506102cf610674366004611f70565b6113ba565b6001600160e01b0319811660009081526020819052604090205460ff165b919050565b60068054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156107285780601f106106fd57610100808354040283529160200191610728565b820191906000526020600020905b81548152906001019060200180831161070b57829003601f168201915b5050505050905090565b600061073d8261147b565b6107625760405162461bcd60e51b8152600401610759906127db565b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061078982610a28565b9050806001600160a01b0316836001600160a01b031614156107bd5760405162461bcd60e51b8152600401610759906128f4565b806001600160a01b03166107cf611488565b6001600160a01b031614806107eb57506107eb8161062a611488565b6108075760405162461bcd60e51b81526004016107599061263b565b610811838361148c565b505050565b61081e611488565b6001600160a01b031661082f610e56565b6001600160a01b0316146108555760405162461bcd60e51b815260040161075990612827565b805161086890600b906020840190611e54565b5050565b600061087860026114fa565b905090565b61088e610888611488565b82611505565b6108aa5760405162461bcd60e51b815260040161075990612965565b61081183838361158a565b6001600160a01b03821660009081526001602052604081206108d79083611698565b90505b92915050565b6108e8611488565b6001600160a01b03166108f9610e56565b6001600160a01b03161461091f5760405162461bcd60e51b815260040161075990612827565b600f805460ff19811660ff90911615179055565b61093b611488565b6001600160a01b031661094c610e56565b6001600160a01b0316146109725760405162461bcd60e51b815260040161075990612827565b60115460405147916001600160a01b03169082156108fc029083906000818181858888f19350505050158015610868573d6000803e3d6000fd5b61081183838360405180602001604052806000815250611064565b6000806109d56002846116a4565b509392505050565b6109e5611488565b6001600160a01b03166109f6610e56565b6001600160a01b031614610a1c5760405162461bcd60e51b815260040161075990612827565b610a25816116c0565b50565b60006108da82604051806060016040528060298152602001612ac060299139600291906116d3565b60098054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156107285780601f106106fd57610100808354040283529160200191610728565b600b805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015610b375780601f10610b0c57610100808354040283529160200191610b37565b820191906000526020600020905b815481529060010190602001808311610b1a57829003601f168201915b505050505081565b610b47611488565b6001600160a01b0316610b58610e56565b6001600160a01b031614610b7e5760405162461bcd60e51b815260040161075990612827565b6000610b8861086c565b9050600082118015610b9c57506010548211155b610bb85760405162461bcd60e51b8152600401610759906124d1565b60005b82811015610bd757610bcf848284016116ea565b600101610bbb565b50601054610be59083611704565b601055505050565b60006001600160a01b038216610c155760405162461bcd60e51b8152600401610759906126d9565b6001600160a01b03821660009081526001602052604090206108da906114fa565b610c3e611488565b6001600160a01b0316610c4f610e56565b6001600160a01b031614610c755760405162461bcd60e51b815260040161075990612827565b600a546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600a80546001600160a01b0319169055565b600f5460ff16610ce15760405162461bcd60e51b81526004016107599061249c565b600081118015610cf2575060648111155b610d0e5760405162461bcd60e51b815260040161075990612698565b612710610d2382610d1d61086c565b9061172c565b1115610d415760405162461bcd60e51b8152600401610759906129ed565b600e54610d4e9082611751565b341015610d6d5760405162461bcd60e51b815260040161075990612581565b60005b81811015610868576000610d8261086c565b9050612710610d8f61086c565b1015610d9f57610d9f33826116ea565b50600101610d70565b60606000610db583610bed565b905080610dd2575050604080516000815260208101909152610697565b60008167ffffffffffffffff81118015610deb57600080fd5b50604051908082528060200260200182016040528015610e15578160200160208202803683370190505b50905060005b82811015610e4c57610e2d85826108b5565b828281518110610e3957fe5b6020908102919091010152600101610e1b565b5091506106979050565b600a546001600160a01b031690565b60078054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156107285780601f106106fd57610100808354040283529160200191610728565b600c805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015610b375780601f10610b0c57610100808354040283529160200191610b37565b610f29611488565b6001600160a01b0316826001600160a01b03161415610f5a5760405162461bcd60e51b81526004016107599061254a565b8060056000610f67611488565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155610fab611488565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610fe39190612275565b60405180910390a35050565b610ff7611488565b6001600160a01b0316611008610e56565b6001600160a01b03161461102e5760405162461bcd60e51b815260040161075990612827565b600d5460ff16156110515760405162461bcd60e51b815260040161075990612935565b805161086890600c906020840190611e54565b61107561106f611488565b83611505565b6110915760405162461bcd60e51b815260040161075990612965565b61109d8484848461178b565b50505050565b6110ab611488565b6001600160a01b03166110bc610e56565b6001600160a01b0316146110e25760405162461bcd60e51b815260040161075990612827565b600e55565b61271081565b6110f5611488565b6001600160a01b0316611106610e56565b6001600160a01b03161461112c5760405162461bcd60e51b815260040161075990612827565b600d805460ff191660011790556040517f92423ccd40e13759d50d24569dcbaccb20ade47247f3cf3e3951a9f29d2048b09061116a90600c90612293565b60405180910390a1565b606061117f8261147b565b61119b5760405162461bcd60e51b8152600401610759906128a5565b60008281526008602090815260408083208054825160026001831615610100026000190190921691909104601f81018590048502820185019093528281529290919083018282801561122e5780601f106112035761010080835404028352916020019161122e565b820191906000526020600020905b81548152906001019060200180831161121157829003601f168201915b50505050509050600061123f610a50565b905080516000141561125357509050610697565b81511561128557808260405160200161126d9291906121b1565b60405160208183030381529060405292505050610697565b8061128f856117be565b6040516020016112a09291906121b1565b60405160208183030381529060405292505050919050565b60105481565b60606112c861086c565b82106112e65760405162461bcd60e51b81526004016107599061235f565b600c805460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152929183018282801561136c5780601f106113415761010080835404028352916020019161136c565b820191906000526020600020905b81548152906001019060200180831161134f57829003601f168201915b50505050509050919050565b606481565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b600f5460ff1681565b600e5481565b6113c2611488565b6001600160a01b03166113d3610e56565b6001600160a01b0316146113f95760405162461bcd60e51b815260040161075990612827565b6001600160a01b03811661141f5760405162461bcd60e51b8152600401610759906123e8565b600a546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600a80546001600160a01b0319166001600160a01b0392909216919091179055565b60006108da600283611899565b3390565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906114c182610a28565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006108da826118a5565b60006115108261147b565b61152c5760405162461bcd60e51b8152600401610759906125ef565b600061153783610a28565b9050806001600160a01b0316846001600160a01b031614806115725750836001600160a01b031661156784610732565b6001600160a01b0316145b806115825750611582818561137d565b949350505050565b826001600160a01b031661159d82610a28565b6001600160a01b0316146115c35760405162461bcd60e51b81526004016107599061285c565b6001600160a01b0382166115e95760405162461bcd60e51b815260040161075990612506565b6115f4838383610811565b6115ff60008261148c565b6001600160a01b038316600090815260016020526040902061162190826118a9565b506001600160a01b038216600090815260016020526040902061164490826118b5565b50611651600282846118c1565b5080826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60006108d783836118d7565b60008080806116b3868661191c565b9097909650945050505050565b8051610868906009906020840190611e54565b60006116e0848484611978565b90505b9392505050565b6108688282604051806020016040528060008152506119d7565b6000828211156117265760405162461bcd60e51b8152600401610759906125b8565b50900390565b6000828201838110156108d75760405162461bcd60e51b815260040161075990612465565b600082611760575060006108da565b8282028284828161176d57fe5b04146108d75760405162461bcd60e51b81526004016107599061279a565b61179684848461158a565b6117a284848484611a0a565b61109d5760405162461bcd60e51b815260040161075990612396565b6060816117e357506040805180820190915260018152600360fc1b6020820152610697565b8160005b81156117fb57600101600a820491506117e7565b60008167ffffffffffffffff8111801561181457600080fd5b506040519080825280601f01601f19166020018201604052801561183f576020820181803683370190505b50859350905060001982015b831561189057600a840660300160f81b8282806001900393508151811061186e57fe5b60200101906001600160f81b031916908160001a905350600a8404935061184b565b50949350505050565b60006108d78383611ae9565b5490565b60006108d78383611b01565b60006108d78383611bc7565b60006116e084846001600160a01b038516611c11565b815460009082106118fa5760405162461bcd60e51b81526004016107599061231d565b82600001828154811061190957fe5b9060005260206000200154905092915050565b8154600090819083106119415760405162461bcd60e51b815260040161075990612723565b600084600001848154811061195257fe5b906000526020600020906002020190508060000154816001015492509250509250929050565b600082815260018401602052604081205482816119a85760405162461bcd60e51b81526004016107599190612280565b508460000160018203815481106119bb57fe5b9060005260206000209060020201600101549150509392505050565b6119e18383611ca8565b6119ee6000848484611a0a565b6108115760405162461bcd60e51b815260040161075990612396565b6000611a1e846001600160a01b0316611d6c565b611a2a57506001611582565b6000611ab2630a85bd0160e11b611a3f611488565b888787604051602401611a5594939291906121f4565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050604051806060016040528060328152602001612a8e603291396001600160a01b0388169190611d72565b9050600081806020019051810190611aca91906120ef565b6001600160e01b031916630a85bd0160e11b1492505050949350505050565b60009081526001919091016020526040902054151590565b60008181526001830160205260408120548015611bbd5783546000198083019190810190600090879083908110611b3457fe5b9060005260206000200154905080876000018481548110611b5157fe5b600091825260208083209091019290925582815260018981019092526040902090840190558654879080611b8157fe5b600190038181906000526020600020016000905590558660010160008781526020019081526020016000206000905560019450505050506108da565b60009150506108da565b6000611bd38383611ae9565b611c09575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556108da565b5060006108da565b600082815260018401602052604081205480611c765750506040805180820182528381526020808201848152865460018181018955600089815284812095516002909302909501918255915190820155865486845281880190925292909120556116e3565b82856000016001830381548110611c8957fe5b90600052602060002090600202016001018190555060009150506116e3565b6001600160a01b038216611cce5760405162461bcd60e51b815260040161075990612765565b611cd78161147b565b15611cf45760405162461bcd60e51b81526004016107599061242e565b611d0060008383610811565b6001600160a01b0382166000908152600160205260409020611d2290826118b5565b50611d2f600282846118c1565b5060405181906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b3b151590565b60606116e0848460008585611d8685611d6c565b611da25760405162461bcd60e51b8152600401610759906129b6565b600080866001600160a01b03168587604051611dbe9190612195565b60006040518083038185875af1925050503d8060008114611dfb576040519150601f19603f3d011682016040523d82523d6000602084013e611e00565b606091505b5091509150611e10828286611e1b565b979650505050505050565b60608315611e2a5750816116e3565b825115611e3a5782518084602001fd5b8160405162461bcd60e51b81526004016107599190612280565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282611e8a5760008555611ed0565b82601f10611ea357805160ff1916838001178555611ed0565b82800160010185558215611ed0579182015b82811115611ed0578251825591602001919060010190611eb5565b50611edc929150611ee0565b5090565b5b80821115611edc5760008155600101611ee1565b600067ffffffffffffffff80841115611f0a57fe5b604051601f8501601f191681016020018281118282101715611f2857fe5b604052848152915081838501861015611f4057600080fd5b8484602083013760006020868301015250509392505050565b80356001600160a01b038116811461069757600080fd5b600060208284031215611f81578081fd5b6108d782611f59565b60008060408385031215611f9c578081fd5b611fa583611f59565b9150611fb360208401611f59565b90509250929050565b600080600060608486031215611fd0578081fd5b611fd984611f59565b9250611fe760208501611f59565b9150604084013590509250925092565b6000806000806080858703121561200c578081fd5b61201585611f59565b935061202360208601611f59565b925060408501359150606085013567ffffffffffffffff811115612045578182fd5b8501601f81018713612055578182fd5b61206487823560208401611ef5565b91505092959194509250565b60008060408385031215612082578182fd5b61208b83611f59565b91506020830135801515811461209f578182fd5b809150509250929050565b600080604083850312156120bc578182fd5b6120c583611f59565b946020939093013593505050565b6000602082840312156120e4578081fd5b81356108d781612a77565b600060208284031215612100578081fd5b81516108d781612a77565b60006020828403121561211c578081fd5b813567ffffffffffffffff811115612132578182fd5b8201601f81018413612142578182fd5b61158284823560208401611ef5565b600060208284031215612162578081fd5b5035919050565b60008151808452612181816020860160208601612a4b565b601f01601f19169290920160200192915050565b600082516121a7818460208701612a4b565b9190910192915050565b600083516121c3818460208801612a4b565b8351908301906121d7818360208801612a4b565b01949350505050565b6001600160a01b0391909116815260200190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061222790830184612169565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156122695783518352928401929184019160010161224d565b50909695505050505050565b901515815260200190565b6000602082526108d76020830184612169565b600060208083018184528285546001808216600081146122ba57600181146122d857612310565b60028304607f16855260ff1983166040890152606088019350612310565b600283048086526122e88a612a3f565b885b828110156123065781548b8201604001529084019088016122ea565b8a01604001955050505b5091979650505050505050565b60208082526022908201527f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e604082015261647360f01b606082015260800190565b6020808252601a908201527f43484f4f5345204120474149412057495448494e2052414e4745000000000000604082015260600190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b6020808252818101527f53616c65206d7573742062652061637469766520746f206d696e742047616961604082015260600190565b6020808252818101527f4e6f7420656e6f7567682072657365727665206c65667420666f72207465616d604082015260600190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b6020808252601f908201527f45746865722076616c75652073656e74206973206e6f7420636f727265637400604082015260600190565b6020808252601e908201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604082015260600190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b60208082526021908201527f43616e206f6e6c79206d696e7420353020746f6b656e7320617420612074696d6040820152606560f81b606082015260800190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526022908201527f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e604082015261647360f01b606082015260800190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b6020808252602f908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201526e3732bc34b9ba32b73a103a37b5b2b760891b606082015260800190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b602080825260169082015275131a58d95b9cd948185b1c9958591e481b1bd8dad95960521b604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b60208082526029908201527f507572636861736520776f756c6420657863656564206d617820737570706c79604082015268206f6620476169617360b81b606082015260800190565b90815260200190565b60009081526020902090565b60005b83811015612a66578181015183820152602001612a4e565b8381111561109d5750506000910152565b6001600160e01b031981168114610a2557600080fdfe4552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea26469706673582212206740162767ea3ce318ec2065a1cdeb4096665774438165286160fda8e31f00c364736f6c63430007060033
Deployed Bytecode Sourcemap
70511:3800:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10585:200;;;;;;;;;;-1:-1:-1;10585:200:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54065:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;57073:308::-;;;;;;;;;;-1:-1:-1;57073:308:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;56572:435::-;;;;;;;;;;-1:-1:-1;56572:435:0;;;;;:::i;:::-;;:::i;:::-;;71872:126;;;;;;;;;;-1:-1:-1;71872:126:0;;;;;:::i;:::-;;:::i;56000:211::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;58132:376::-;;;;;;;;;;-1:-1:-1;58132:376:0;;;;;:::i;:::-;;:::i;55712:212::-;;;;;;;;;;-1:-1:-1;55712:212:0;;;;;:::i;:::-;;:::i;72113:89::-;;;;;;;;;;;;;:::i;71253:147::-;;;;;;;;;;;;;:::i;58579:185::-;;;;;;;;;;-1:-1:-1;58579:185:0;;;;;:::i;:::-;;:::i;56288:222::-;;;;;;;;;;-1:-1:-1;56288:222:0;;;;;:::i;:::-;;:::i;72006:99::-;;;;;;;;;;-1:-1:-1;72006:99:0;;;;;:::i;:::-;;:::i;53709:289::-;;;;;;;;;;-1:-1:-1;53709:289:0;;;;;:::i;:::-;;:::i;55531:97::-;;;;;;;;;;;;;:::i;70587:35::-;;;;;;;;;;;;;:::i;71408:456::-;;;;;;;;;;-1:-1:-1;71408:456:0;;;;;:::i;:::-;;:::i;53339:308::-;;;;;;;;;;-1:-1:-1;53339:308:0;;;;;:::i;:::-;;:::i;69872:148::-;;;;;;;;;;;;;:::i;73409:793::-;;;;;;:::i;:::-;;:::i;72210:572::-;;;;;;;;;;-1:-1:-1;72210:572:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;69221:87::-;;;;;;;;;;;;;:::i;54234:104::-;;;;;;;;;;;;;:::i;70676:31::-;;;;;;;;;;;;;:::i;57453:327::-;;;;;;;;;;-1:-1:-1;57453:327:0;;;;;:::i;:::-;;:::i;73227:174::-;;;;;;;;;;-1:-1:-1;73227:174:0;;;;;:::i;:::-;;:::i;58835:365::-;;;;;;;;;;-1:-1:-1;58835:365:0;;;;;:::i;:::-;;:::i;74210:96::-;;;;;;;;;;-1:-1:-1;74210:96:0;;;;;:::i;:::-;;:::i;70877:41::-;;;;;;;;;;;;;:::i;73068:124::-;;;;;;;;;;;;;:::i;54409:879::-;;;;;;;;;;-1:-1:-1;54409:879:0;;;;;:::i;:::-;;:::i;70968:33::-;;;;;;;;;;;;;:::i;72829:178::-;;;;;;;;;;-1:-1:-1;72829:178:0;;;;;:::i;:::-;;:::i;70823:45::-;;;;;;;;;;;;;:::i;57851:214::-;;;;;;;;;;-1:-1:-1;57851:214:0;;;;;:::i;:::-;;:::i;70927:32::-;;;;;;;;;;;;;:::i;70755:44::-;;;;;;;;;;;;;:::i;70175:281::-;;;;;;;;;;-1:-1:-1;70175:281:0;;;;;:::i;:::-;;:::i;10585:200::-;-1:-1:-1;;;;;;10744:33:0;;10715:4;10744:33;;;;;;;;;;;;;10585:200;;;;:::o;54065:100::-;54152:5;54145:12;;;;;;;;-1:-1:-1;;54145:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54119:13;;54145:12;;54152:5;;54145:12;;54152:5;54145:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54065:100;:::o;57073:308::-;57194:7;57241:16;57249:7;57241;:16::i;:::-;57219:110;;;;-1:-1:-1;;;57219:110:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;57349:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;57349:24:0;;57073:308::o;56572:435::-;56653:13;56669:23;56684:7;56669:14;:23::i;:::-;56653:39;;56717:5;-1:-1:-1;;;;;56711:11:0;:2;-1:-1:-1;;;;;56711:11:0;;;56703:57;;;;-1:-1:-1;;;56703:57:0;;;;;;;:::i;:::-;56811:5;-1:-1:-1;;;;;56795:21:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;56795:21:0;;:86;;;;56837:44;56861:5;56868:12;:10;:12::i;56837:44::-;56773:192;;;;-1:-1:-1;;;56773:192:0;;;;;;;:::i;:::-;56978:21;56987:2;56991:7;56978:8;:21::i;:::-;56572:435;;;:::o;71872:126::-;69452:12;:10;:12::i;:::-;-1:-1:-1;;;;;69441:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;69441:23:0;;69433:68;;;;-1:-1:-1;;;69433:68:0;;;;;;;:::i;:::-;71957:33;;::::1;::::0;:16:::1;::::0;:33:::1;::::0;::::1;::::0;::::1;:::i;:::-;;71872:126:::0;:::o;56000:211::-;56061:7;56182:21;:12;:19;:21::i;:::-;56175:28;;56000:211;:::o;58132:376::-;58341:41;58360:12;:10;:12::i;:::-;58374:7;58341:18;:41::i;:::-;58319:140;;;;-1:-1:-1;;;58319:140:0;;;;;;;:::i;:::-;58472:28;58482:4;58488:2;58492:7;58472:9;:28::i;55712:212::-;-1:-1:-1;;;;;55886:20:0;;55854:7;55886:20;;;:13;:20;;;;;:30;;55910:5;55886:23;:30::i;:::-;55879:37;;55712:212;;;;;:::o;72113:89::-;69452:12;:10;:12::i;:::-;-1:-1:-1;;;;;69441:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;69441:23:0;;69433:68;;;;-1:-1:-1;;;69433:68:0;;;;;;;:::i;:::-;72182:12:::1;::::0;;-1:-1:-1;;72166:28:0;::::1;72182:12;::::0;;::::1;72181:13;72166:28;::::0;;72113:89::o;71253:147::-;69452:12;:10;:12::i;:::-;-1:-1:-1;;;;;69441:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;69441:23:0;;69433:68;;;;-1:-1:-1;;;69433:68:0;;;;;;;:::i;:::-;71361:12:::1;::::0;71353:39:::1;::::0;71321:21:::1;::::0;-1:-1:-1;;;;;71361:12:0::1;::::0;71353:39;::::1;;;::::0;71321:21;;71303:15:::1;71353:39:::0;71303:15;71353:39;71321:21;71361:12;71353:39;::::1;;;;;;;;;;;;;::::0;::::1;;;;58579:185:::0;58717:39;58734:4;58740:2;58744:7;58717:39;;;;;;;;;;;;:16;:39::i;56288:222::-;56408:7;;56455:22;:12;56471:5;56455:15;:22::i;:::-;-1:-1:-1;56433:44:0;56288:222;-1:-1:-1;;;56288:222:0:o;72006:99::-;69452:12;:10;:12::i;:::-;-1:-1:-1;;;;;69441:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;69441:23:0;;69433:68;;;;-1:-1:-1;;;69433:68:0;;;;;;;:::i;:::-;72077:20:::1;72089:7;72077:11;:20::i;:::-;72006:99:::0;:::o;53709:289::-;53826:7;53871:119;53906:7;53871:119;;;;;;;;;;;;;;;;;:12;;:119;:16;:119::i;55531:97::-;55612:8;55605:15;;;;;;;;-1:-1:-1;;55605:15:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55579:13;;55605:15;;55612:8;;55605:15;;55612:8;55605:15;;;;;;;;;;;;;;;;;;;;;;;;70587:35;;;;;;;;;;;;;;;-1:-1:-1;;70587:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;71408:456::-;69452:12;:10;:12::i;:::-;-1:-1:-1;;;;;69441:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;69441:23:0;;69433:68;;;;-1:-1:-1;;;69433:68:0;;;;;;;:::i;:::-;71518:14:::1;71535:13;:11;:13::i;:::-;71518:30;;71598:1;71581:14;:18;:51;;;;;71621:11;;71603:14;:29;;71581:51;71559:133;;;;-1:-1:-1::0;;;71559:133:0::1;;;;;;;:::i;:::-;71708:9;71703:98;71727:14;71723:1;:18;71703:98;;;71763:26;71773:3;71787:1;71778:6;:10;71763:9;:26::i;:::-;71743:3;;71703:98;;;-1:-1:-1::0;71825:11:0::1;::::0;:31:::1;::::0;71841:14;71825:15:::1;:31::i;:::-;71811:11;:45:::0;-1:-1:-1;;;71408:456:0:o;53339:308::-;53456:7;-1:-1:-1;;;;;53503:19:0;;53481:111;;;;-1:-1:-1;;;53481:111:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;53610:20:0;;;;;;:13;:20;;;;;:29;;:27;:29::i;69872:148::-;69452:12;:10;:12::i;:::-;-1:-1:-1;;;;;69441:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;69441:23:0;;69433:68;;;;-1:-1:-1;;;69433:68:0;;;;;;;:::i;:::-;69963:6:::1;::::0;69942:40:::1;::::0;69979:1:::1;::::0;-1:-1:-1;;;;;69963:6:0::1;::::0;69942:40:::1;::::0;69979:1;;69942:40:::1;69993:6;:19:::0;;-1:-1:-1;;;;;;69993:19:0::1;::::0;;69872:148::o;73409:793::-;73485:12;;;;73477:57;;;;-1:-1:-1;;;73477:57:0;;;;;;;:::i;:::-;73584:1;73567:14;:18;:55;;;;;70865:3;73589:14;:33;;73567:55;73545:138;;;;-1:-1:-1;;;73545:138:0;;;;;;;:::i;:::-;70913:5;73716:33;73734:14;73716:13;:11;:13::i;:::-;:17;;:33::i;:::-;:46;;73694:137;;;;-1:-1:-1;;;73694:137:0;;;;;;;:::i;:::-;73877:9;;:29;;73891:14;73877:13;:29::i;:::-;73864:9;:42;;73842:123;;;;-1:-1:-1;;;73842:123:0;;;;;;;:::i;:::-;73983:9;73978:217;74002:14;73998:1;:18;73978:217;;;74038:17;74058:13;:11;:13::i;:::-;74038:33;;70913:5;74090:13;:11;:13::i;:::-;:25;74086:98;;;74136:32;74146:10;74158:9;74136;:32::i;:::-;-1:-1:-1;74018:3:0;;73978:217;;72210:572;72299:16;72333:18;72354:17;72364:6;72354:9;:17::i;:::-;72333:38;-1:-1:-1;72386:15:0;72382:393;;-1:-1:-1;;72463:16:0;;;72477:1;72463:16;;;;;;;;72456:23;;72382:393;72512:23;72552:10;72538:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;72538:25:0;;72512:51;;72578:13;72606:130;72630:10;72622:5;:18;72606:130;;;72686:34;72706:6;72714:5;72686:19;:34::i;:::-;72670:6;72677:5;72670:13;;;;;;;;;;;;;;;;;:50;72642:7;;72606:130;;;-1:-1:-1;72757:6:0;-1:-1:-1;72750:13:0;;-1:-1:-1;72750:13:0;69221:87;69294:6;;-1:-1:-1;;;;;69294:6:0;69221:87;:::o;54234:104::-;54323:7;54316:14;;;;;;;;-1:-1:-1;;54316:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54290:13;;54316:14;;54323:7;;54316:14;;54323:7;54316:14;;;;;;;;;;;;;;;;;;;;;;;;70676:31;;;;;;;;;;;;;;;-1:-1:-1;;70676:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57453:327;57600:12;:10;:12::i;:::-;-1:-1:-1;;;;;57588:24:0;:8;-1:-1:-1;;;;;57588:24:0;;;57580:62;;;;-1:-1:-1;;;57580:62:0;;;;;;;:::i;:::-;57700:8;57655:18;:32;57674:12;:10;:12::i;:::-;-1:-1:-1;;;;;57655:32:0;;;;;;;;;;;;;;;;;-1:-1:-1;57655:32:0;;;:42;;;;;;;;;;;;:53;;-1:-1:-1;;57655:53:0;;;;;;;;;;;57739:12;:10;:12::i;:::-;-1:-1:-1;;;;;57724:48:0;;57763:8;57724:48;;;;;;:::i;:::-;;;;;;;;57453:327;;:::o;73227:174::-;69452:12;:10;:12::i;:::-;-1:-1:-1;;;;;69441:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;69441:23:0;;69433:68;;;;-1:-1:-1;;;69433:68:0;;;;;;;:::i;:::-;73310:13:::1;::::0;::::1;;:22;73302:57;;;;-1:-1:-1::0;;;73302:57:0::1;;;;;;;:::i;:::-;73370:23:::0;;::::1;::::0;:12:::1;::::0;:23:::1;::::0;::::1;::::0;::::1;:::i;58835:365::-:0;59024:41;59043:12;:10;:12::i;:::-;59057:7;59024:18;:41::i;:::-;59002:140;;;;-1:-1:-1;;;59002:140:0;;;;;;;:::i;:::-;59153:39;59167:4;59173:2;59177:7;59186:5;59153:13;:39::i;:::-;58835:365;;;;:::o;74210:96::-;69452:12;:10;:12::i;:::-;-1:-1:-1;;;;;69441:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;69441:23:0;;69433:68;;;;-1:-1:-1;;;69433:68:0;;;;;;;:::i;:::-;74278:9:::1;:20:::0;74210:96::o;70877:41::-;70913:5;70877:41;:::o;73068:124::-;69452:12;:10;:12::i;:::-;-1:-1:-1;;;;;69441:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;69441:23:0;;69433:68;;;;-1:-1:-1;;;69433:68:0;;;;;;;:::i;:::-;73119:13:::1;:20:::0;;-1:-1:-1;;73119:20:0::1;73135:4;73119:20;::::0;;73155:29:::1;::::0;::::1;::::0;::::1;::::0;73171:12:::1;::::0;73155:29:::1;:::i;:::-;;;;;;;;73068:124::o:0;54409:879::-;54527:13;54580:16;54588:7;54580;:16::i;:::-;54558:113;;;;-1:-1:-1;;;54558:113:0;;;;;;;:::i;:::-;54684:23;54710:19;;;:10;:19;;;;;;;;54684:45;;;;;;;;;;;-1:-1:-1;;54684:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;54710:19;;54684:45;;;54710:19;54684:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54740:18;54761:9;:7;:9::i;:::-;54740:30;;54852:4;54846:18;54868:1;54846:23;54842:72;;;-1:-1:-1;54893:9:0;-1:-1:-1;54886:16:0;;54842:72;55018:23;;:27;55014:108;;55093:4;55099:9;55076:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;55062:48;;;;;;55014:108;55254:4;55260:18;:7;:16;:18::i;:::-;55237:42;;;;;;;;;:::i;:::-;;;;;;;;;;;;;55223:57;;;;54409:879;;;:::o;70968:33::-;;;;:::o;72829:178::-;72885:13;72925;:11;:13::i;:::-;72919:3;:19;72911:58;;;;-1:-1:-1;;;72911:58:0;;;;;;;:::i;:::-;72987:12;72980:19;;;;;;;;;;;;;-1:-1:-1;;72980:19:0;;;;;;;;;;;;;;;;;;;;;;;;;;;72987:12;72980:19;;72987:12;72980:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72829:178;;;:::o;70823:45::-;70865:3;70823:45;:::o;57851:214::-;-1:-1:-1;;;;;58022:25:0;;;57993:4;58022:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;57851:214::o;70927:32::-;;;;;;:::o;70755:44::-;;;;:::o;70175:281::-;69452:12;:10;:12::i;:::-;-1:-1:-1;;;;;69441:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;69441:23:0;;69433:68;;;;-1:-1:-1;;;69433:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;70278:22:0;::::1;70256:110;;;;-1:-1:-1::0;;;70256:110:0::1;;;;;;;:::i;:::-;70403:6;::::0;70382:38:::1;::::0;-1:-1:-1;;;;;70382:38:0;;::::1;::::0;70403:6:::1;::::0;70382:38:::1;::::0;70403:6:::1;::::0;70382:38:::1;70431:6;:17:::0;;-1:-1:-1;;;;;;70431:17:0::1;-1:-1:-1::0;;;;;70431:17:0;;;::::1;::::0;;;::::1;::::0;;70175:281::o;60747:127::-;60812:4;60836:30;:12;60858:7;60836:21;:30::i;738:106::-;826:10;738:106;:::o;67161:192::-;67236:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;67236:29:0;-1:-1:-1;;;;;67236:29:0;;;;;;;;:24;;67290:23;67236:24;67290:14;:23::i;:::-;-1:-1:-1;;;;;67281:46:0;;;;;;;;;;;67161:192;;:::o;46402:155::-;46498:7;46530:19;46538:3;46530:7;:19::i;61041:459::-;61170:4;61214:16;61222:7;61214;:16::i;:::-;61192:110;;;;-1:-1:-1;;;61192:110:0;;;;;;;:::i;:::-;61313:13;61329:23;61344:7;61329:14;:23::i;:::-;61313:39;;61382:5;-1:-1:-1;;;;;61371:16:0;:7;-1:-1:-1;;;;;61371:16:0;;:64;;;;61428:7;-1:-1:-1;;;;;61404:31:0;:20;61416:7;61404:11;:20::i;:::-;-1:-1:-1;;;;;61404:31:0;;61371:64;:120;;;;61452:39;61476:5;61483:7;61452:23;:39::i;:::-;61363:129;61041:459;-1:-1:-1;;;;61041:459:0:o;64352:670::-;64525:4;-1:-1:-1;;;;;64498:31:0;:23;64513:7;64498:14;:23::i;:::-;-1:-1:-1;;;;;64498:31:0;;64476:122;;;;-1:-1:-1;;;64476:122:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;64635:16:0;;64627:65;;;;-1:-1:-1;;;64627:65:0;;;;;;;:::i;:::-;64705:39;64726:4;64732:2;64736:7;64705:20;:39::i;:::-;64809:29;64826:1;64830:7;64809:8;:29::i;:::-;-1:-1:-1;;;;;64851:19:0;;;;;;:13;:19;;;;;:35;;64878:7;64851:26;:35::i;:::-;-1:-1:-1;;;;;;64897:17:0;;;;;;:13;:17;;;;;:30;;64919:7;64897:21;:30::i;:::-;-1:-1:-1;64940:29:0;:12;64957:7;64966:2;64940:16;:29::i;:::-;;65006:7;65002:2;-1:-1:-1;;;;;64987:27:0;64996:4;-1:-1:-1;;;;;64987:27:0;;;;;;;;;;;64352:670;;;:::o;37844:169::-;37942:7;37982:22;37986:3;37998:5;37982:3;:22::i;46905:268::-;47012:7;;;;47077:22;47081:3;47093:5;47077:3;:22::i;:::-;47046:53;;;;-1:-1:-1;46905:268:0;-1:-1:-1;;;;;46905:268:0:o;65683:100::-;65756:19;;;;:8;;:19;;;;;:::i;48287:292::-;48428:7;48510:44;48515:3;48535;48541:12;48510:4;:44::i;:::-;48502:53;-1:-1:-1;48287:292:0;;;;;;:::o;61843:110::-;61919:26;61929:2;61933:7;61919:26;;;;;;;;;;;;:9;:26::i;14815:158::-;14873:7;14906:1;14901;:6;;14893:49;;;;-1:-1:-1;;;14893:49:0;;;;;;;:::i;:::-;-1:-1:-1;14960:5:0;;;14815:158::o;14353:179::-;14411:7;14443:5;;;14467:6;;;;14459:46;;;;-1:-1:-1;;;14459:46:0;;;;;;;:::i;15232:220::-;15290:7;15314:6;15310:20;;-1:-1:-1;15329:1:0;15322:8;;15310:20;15353:5;;;15357:1;15353;:5;:1;15377:5;;;;;:10;15369:56;;;;-1:-1:-1;;;15369:56:0;;;;;;;:::i;60082:352::-;60239:28;60249:4;60255:2;60259:7;60239:9;:28::i;:::-;60300:48;60323:4;60329:2;60333:7;60342:5;60300:22;:48::i;:::-;60278:148;;;;-1:-1:-1;;;60278:148:0;;;;;;;:::i;48826:748::-;48882:13;49103:10;49099:53;;-1:-1:-1;49130:10:0;;;;;;;;;;;;-1:-1:-1;;;49130:10:0;;;;;;49099:53;49177:5;49162:12;49218:78;49225:9;;49218:78;;49251:8;;49282:2;49274:10;;;;49218:78;;;49306:19;49338:6;49328:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49328:17:0;-1:-1:-1;49400:5:0;;-1:-1:-1;49306:39:0;-1:-1:-1;;;49372:10:0;;49416:119;49423:9;;49416:119;;49493:2;49486:4;:9;49480:2;:16;49467:31;;49449:6;49456:7;;;;;;;49449:15;;;;;;;;;;;:49;-1:-1:-1;;;;;49449:49:0;;;;;;;;-1:-1:-1;49521:2:0;49513:10;;;;49416:119;;;-1:-1:-1;49559:6:0;48826:748;-1:-1:-1;;;;48826:748:0:o;46131:183::-;46242:4;46271:35;46281:3;46301;46271:9;:35::i;42747:110::-;42830:19;;42747:110::o;36866:160::-;36954:4;36983:35;36991:3;37011:5;36983:7;:35::i;36559:131::-;36626:4;36650:32;36655:3;36675:5;36650:4;:32::i;45497:219::-;45620:4;45644:64;45649:3;45669;-1:-1:-1;;;;;45683:23:0;;45644:4;:64::i;32510:273::-;32651:18;;32604:7;;32651:26;-1:-1:-1;32629:110:0;;;;-1:-1:-1;;;32629:110:0;;;;;;;:::i;:::-;32757:3;:11;;32769:5;32757:18;;;;;;;;;;;;;;;;32750:25;;32510:273;;;;:::o;43222:348::-;43372:19;;43316:7;;;;43372:27;-1:-1:-1;43350:111:0;;;;-1:-1:-1;;;43350:111:0;;;;;;;:::i;:::-;43474:22;43499:3;:12;;43512:5;43499:19;;;;;;;;;;;;;;;;;;43474:44;;43537:5;:10;;;43549:5;:12;;;43529:33;;;;;43222:348;;;;;:::o;44820:353::-;44948:7;44987:17;;;:12;;;:17;;;;;;45038:12;45023:13;45015:36;;;;-1:-1:-1;;;45015:36:0;;;;;;;;:::i;:::-;;45105:3;:12;;45129:1;45118:8;:12;45105:26;;;;;;;;;;;;;;;;;;:33;;;45098:40;;;44820:353;;;;;:::o;62180:321::-;62310:18;62316:2;62320:7;62310:5;:18::i;:::-;62361:54;62392:1;62396:2;62400:7;62409:5;62361:22;:54::i;:::-;62339:154;;;;-1:-1:-1;;;62339:154:0;;;;;;;:::i;66348:694::-;66503:4;66525:15;:2;-1:-1:-1;;;;;66525:13:0;;:15::i;:::-;66520:60;;-1:-1:-1;66564:4:0;66557:11;;66520:60;66590:23;66616:313;-1:-1:-1;;;66751:12:0;:10;:12::i;:::-;66782:4;66805:7;66831:5;66646:205;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;-1:-1:-1;;;;;66646:205:0;;;;;;;-1:-1:-1;;;;;66646:205:0;;;;;;;;;;;66616:313;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;66616:15:0;;;:313;:15;:313::i;:::-;66590:339;;66940:13;66967:10;66956:32;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;67007:26:0;-1:-1:-1;;;67007:26:0;;-1:-1:-1;;;66348:694:0;;;;;;:::o;42495:157::-;42593:4;42622:17;;;:12;;;;;:17;;;;;;:22;;;42495:157::o;30157:1557::-;30223:4;30362:19;;;:12;;;:19;;;;;;30398:15;;30394:1313;;30846:18;;-1:-1:-1;;30797:14:0;;;;30846:22;;;;30773:21;;30846:3;;:22;;31133;;;;;;;;;;;;;;31113:42;;31279:9;31250:3;:11;;31262:13;31250:26;;;;;;;;;;;;;;;;;;;:38;;;;31356:23;;;31398:1;31356:12;;;:23;;;;;;31382:17;;;31356:43;;31508:17;;31356:3;;31508:17;;;;;;;;;;;;;;;;;;;;;;31603:3;:12;;:19;31616:5;31603:19;;;;;;;;;;;31596:26;;;31646:4;31639:11;;;;;;;;30394:1313;31690:5;31683:12;;;;;29567:414;29630:4;29652:21;29662:3;29667:5;29652:9;:21::i;:::-;29647:327;;-1:-1:-1;29690:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;29873:18;;29851:19;;;:12;;;:19;;;;;;:40;;;;29906:11;;29647:327;-1:-1:-1;29957:5:0;29950:12;;39937:737;40047:4;40182:17;;;:12;;;:17;;;;;;40216:13;40212:455;;-1:-1:-1;;40314:36:0;;;;;;;;;;;;;;;;;;40296:55;;;;;;;;:12;:55;;;;;;;;;;;;;;;;;;;;;;;;40509:19;;40489:17;;;:12;;;:17;;;;;;;:39;40543:11;;40212:455;40623:5;40587:3;:12;;40611:1;40600:8;:12;40587:26;;;;;;;;;;;;;;;;;;:33;;:41;;;;40650:5;40643:12;;;;;62837:404;-1:-1:-1;;;;;62917:16:0;;62909:61;;;;-1:-1:-1;;;62909:61:0;;;;;;;:::i;:::-;62990:16;62998:7;62990;:16::i;:::-;62989:17;62981:58;;;;-1:-1:-1;;;62981:58:0;;;;;;;:::i;:::-;63052:45;63081:1;63085:2;63089:7;63052:20;:45::i;:::-;-1:-1:-1;;;;;63110:17:0;;;;;;:13;:17;;;;;:30;;63132:7;63110:21;:30::i;:::-;-1:-1:-1;63153:29:0;:12;63170:7;63179:2;63153:16;:29::i;:::-;-1:-1:-1;63200:33:0;;63225:7;;-1:-1:-1;;;;;63200:33:0;;;63217:1;;63200:33;;63217:1;;63200:33;62837:404;;:::o;19892:444::-;20272:20;20320:8;;;19892:444::o;22929:229::-;23066:12;23098:52;23120:6;23128:4;23134:1;23137:12;23066;24477:18;24488:6;24477:10;:18::i;:::-;24469:60;;;;-1:-1:-1;;;24469:60:0;;;;;;;:::i;:::-;24603:12;24617:23;24644:6;-1:-1:-1;;;;;24644:11:0;24663:5;24684:4;24644:55;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24602:97;;;;24717:52;24735:7;24744:10;24756:12;24717:17;:52::i;:::-;24710:59;24145:632;-1:-1:-1;;;;;;;24145:632:0:o;27068:777::-;27218:12;27247:7;27243:595;;;-1:-1:-1;27278:10:0;27271:17;;27243:595;27392:17;;:21;27388:439;;27655:10;27649:17;27716:15;27703:10;27699:2;27695:19;27688:44;27603:148;27798:12;27791:20;;-1:-1:-1;;;27791:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:589:1;;110:18;151:2;143:6;140:14;137:2;;;157:9;137:2;197;191:9;270:2;247:17;;-1:-1:-1;;243:31:1;231:44;;277:4;227:55;297:18;;;317:22;;;294:46;291:2;;;343:9;291:2;370;363:22;418;;;403:6;-1:-1:-1;403:6:1;455:16;;;452:25;-1:-1:-1;449:2:1;;;490:1;487;480:12;449:2;540:6;535:3;528:4;520:6;516:17;503:44;595:1;588:4;579:6;571;567:19;563:30;556:41;;;90:513;;;;;:::o;608:175::-;678:20;;-1:-1:-1;;;;;727:31:1;;717:42;;707:2;;773:1;770;763:12;788:198;;900:2;888:9;879:7;875:23;871:32;868:2;;;921:6;913;906:22;868:2;949:31;970:9;949:31;:::i;991:274::-;;;1120:2;1108:9;1099:7;1095:23;1091:32;1088:2;;;1141:6;1133;1126:22;1088:2;1169:31;1190:9;1169:31;:::i;:::-;1159:41;;1219:40;1255:2;1244:9;1240:18;1219:40;:::i;:::-;1209:50;;1078:187;;;;;:::o;1270:342::-;;;;1416:2;1404:9;1395:7;1391:23;1387:32;1384:2;;;1437:6;1429;1422:22;1384:2;1465:31;1486:9;1465:31;:::i;:::-;1455:41;;1515:40;1551:2;1540:9;1536:18;1515:40;:::i;:::-;1505:50;;1602:2;1591:9;1587:18;1574:32;1564:42;;1374:238;;;;;:::o;1617:702::-;;;;;1789:3;1777:9;1768:7;1764:23;1760:33;1757:2;;;1811:6;1803;1796:22;1757:2;1839:31;1860:9;1839:31;:::i;:::-;1829:41;;1889:40;1925:2;1914:9;1910:18;1889:40;:::i;:::-;1879:50;;1976:2;1965:9;1961:18;1948:32;1938:42;;2031:2;2020:9;2016:18;2003:32;2058:18;2050:6;2047:30;2044:2;;;2095:6;2087;2080:22;2044:2;2123:22;;2176:4;2168:13;;2164:27;-1:-1:-1;2154:2:1;;2210:6;2202;2195:22;2154:2;2238:75;2305:7;2300:2;2287:16;2282:2;2278;2274:11;2238:75;:::i;:::-;2228:85;;;1747:572;;;;;;;:::o;2324:369::-;;;2450:2;2438:9;2429:7;2425:23;2421:32;2418:2;;;2471:6;2463;2456:22;2418:2;2499:31;2520:9;2499:31;:::i;:::-;2489:41;;2580:2;2569:9;2565:18;2552:32;2627:5;2620:13;2613:21;2606:5;2603:32;2593:2;;2654:6;2646;2639:22;2593:2;2682:5;2672:15;;;2408:285;;;;;:::o;2698:266::-;;;2827:2;2815:9;2806:7;2802:23;2798:32;2795:2;;;2848:6;2840;2833:22;2795:2;2876:31;2897:9;2876:31;:::i;:::-;2866:41;2954:2;2939:18;;;;2926:32;;-1:-1:-1;;;2785:179:1:o;2969:257::-;;3080:2;3068:9;3059:7;3055:23;3051:32;3048:2;;;3101:6;3093;3086:22;3048:2;3145:9;3132:23;3164:32;3190:5;3164:32;:::i;3231:261::-;;3353:2;3341:9;3332:7;3328:23;3324:32;3321:2;;;3374:6;3366;3359:22;3321:2;3411:9;3405:16;3430:32;3456:5;3430:32;:::i;3497:482::-;;3619:2;3607:9;3598:7;3594:23;3590:32;3587:2;;;3640:6;3632;3625:22;3587:2;3685:9;3672:23;3718:18;3710:6;3707:30;3704:2;;;3755:6;3747;3740:22;3704:2;3783:22;;3836:4;3828:13;;3824:27;-1:-1:-1;3814:2:1;;3870:6;3862;3855:22;3814:2;3898:75;3965:7;3960:2;3947:16;3942:2;3938;3934:11;3898:75;:::i;3984:190::-;;4096:2;4084:9;4075:7;4071:23;4067:32;4064:2;;;4117:6;4109;4102:22;4064:2;-1:-1:-1;4145:23:1;;4054:120;-1:-1:-1;4054:120:1:o;4179:259::-;;4260:5;4254:12;4287:6;4282:3;4275:19;4303:63;4359:6;4352:4;4347:3;4343:14;4336:4;4329:5;4325:16;4303:63;:::i;:::-;4420:2;4399:15;-1:-1:-1;;4395:29:1;4386:39;;;;4427:4;4382:50;;4230:208;-1:-1:-1;;4230:208:1:o;4443:274::-;;4610:6;4604:13;4626:53;4672:6;4667:3;4660:4;4652:6;4648:17;4626:53;:::i;:::-;4695:16;;;;;4580:137;-1:-1:-1;;4580:137:1:o;4722:470::-;;4939:6;4933:13;4955:53;5001:6;4996:3;4989:4;4981:6;4977:17;4955:53;:::i;:::-;5071:13;;5030:16;;;;5093:57;5071:13;5030:16;5127:4;5115:17;;5093:57;:::i;:::-;5166:20;;4909:283;-1:-1:-1;;;;4909:283:1:o;5197:203::-;-1:-1:-1;;;;;5361:32:1;;;;5343:51;;5331:2;5316:18;;5298:102::o;5405:506::-;-1:-1:-1;;;;;5690:15:1;;;5672:34;;5742:15;;5737:2;5722:18;;5715:43;5789:2;5774:18;;5767:34;;;5837:3;5832:2;5817:18;;5810:31;;;5405:506;;5858:47;;5885:19;;5877:6;5858:47;:::i;:::-;5850:55;5624:287;-1:-1:-1;;;;;;5624:287:1:o;5916:635::-;6087:2;6139:21;;;6209:13;;6112:18;;;6231:22;;;5916:635;;6087:2;6310:15;;;;6284:2;6269:18;;;5916:635;6356:169;6370:6;6367:1;6364:13;6356:169;;;6431:13;;6419:26;;6500:15;;;;6465:12;;;;6392:1;6385:9;6356:169;;;-1:-1:-1;6542:3:1;;6067:484;-1:-1:-1;;;;;;6067:484:1:o;6556:187::-;6721:14;;6714:22;6696:41;;6684:2;6669:18;;6651:92::o;6748:221::-;;6897:2;6886:9;6879:21;6917:46;6959:2;6948:9;6944:18;6936:6;6917:46;:::i;6974:979::-;;7112:2;7152;7141:9;7137:18;7182:2;7171:9;7164:21;7205:4;7241:6;7235:13;7267:1;7299:2;7288:9;7284:18;7316:1;7311:178;;;;7503:1;7498:429;;;;7277:650;;7311:178;7366:1;7351:17;;7370:4;7347:28;7332:44;;-1:-1:-1;;7416:24:1;;7411:2;7396:18;;7389:52;7476:2;7461:18;;;-1:-1:-1;7311:178:1;;7498:429;7548:1;7537:9;7533:17;7578:6;7570;7563:22;7613:39;7645:6;7613:39;:::i;:::-;7674:4;7691:180;7705:6;7702:1;7699:13;7691:180;;;7798:14;;7774:17;;;7793:2;7770:26;7763:50;7841:16;;;;7720:10;;7691:180;;;7895:17;;7914:2;7891:26;;-1:-1:-1;;;7277:650:1;-1:-1:-1;7944:3:1;;7092:861;-1:-1:-1;;;;;;;7092:861:1:o;7958:398::-;8160:2;8142:21;;;8199:2;8179:18;;;8172:30;8238:34;8233:2;8218:18;;8211:62;-1:-1:-1;;;8304:2:1;8289:18;;8282:32;8346:3;8331:19;;8132:224::o;8361:350::-;8563:2;8545:21;;;8602:2;8582:18;;;8575:30;8641:28;8636:2;8621:18;;8614:56;8702:2;8687:18;;8535:176::o;8716:414::-;8918:2;8900:21;;;8957:2;8937:18;;;8930:30;8996:34;8991:2;8976:18;;8969:62;-1:-1:-1;;;9062:2:1;9047:18;;9040:48;9120:3;9105:19;;8890:240::o;9135:402::-;9337:2;9319:21;;;9376:2;9356:18;;;9349:30;9415:34;9410:2;9395:18;;9388:62;-1:-1:-1;;;9481:2:1;9466:18;;9459:36;9527:3;9512:19;;9309:228::o;9542:352::-;9744:2;9726:21;;;9783:2;9763:18;;;9756:30;9822;9817:2;9802:18;;9795:58;9885:2;9870:18;;9716:178::o;9899:351::-;10101:2;10083:21;;;10140:2;10120:18;;;10113:30;10179:29;10174:2;10159:18;;10152:57;10241:2;10226:18;;10073:177::o;10255:356::-;10457:2;10439:21;;;10476:18;;;10469:30;10535:34;10530:2;10515:18;;10508:62;10602:2;10587:18;;10429:182::o;10616:356::-;10818:2;10800:21;;;10837:18;;;10830:30;10896:34;10891:2;10876:18;;10869:62;10963:2;10948:18;;10790:182::o;10977:400::-;11179:2;11161:21;;;11218:2;11198:18;;;11191:30;11257:34;11252:2;11237:18;;11230:62;-1:-1:-1;;;11323:2:1;11308:18;;11301:34;11367:3;11352:19;;11151:226::o;11382:349::-;11584:2;11566:21;;;11623:2;11603:18;;;11596:30;11662:27;11657:2;11642:18;;11635:55;11722:2;11707:18;;11556:175::o;11736:355::-;11938:2;11920:21;;;11977:2;11957:18;;;11950:30;12016:33;12011:2;11996:18;;11989:61;12082:2;12067:18;;11910:181::o;12096:354::-;12298:2;12280:21;;;12337:2;12317:18;;;12310:30;12376:32;12371:2;12356:18;;12349:60;12441:2;12426:18;;12270:180::o;12862:408::-;13064:2;13046:21;;;13103:2;13083:18;;;13076:30;13142:34;13137:2;13122:18;;13115:62;-1:-1:-1;;;13208:2:1;13193:18;;13186:42;13260:3;13245:19;;13036:234::o;13275:420::-;13477:2;13459:21;;;13516:2;13496:18;;;13489:30;13555:34;13550:2;13535:18;;13528:62;13626:26;13621:2;13606:18;;13599:54;13685:3;13670:19;;13449:246::o;13700:397::-;13902:2;13884:21;;;13941:2;13921:18;;;13914:30;13980:34;13975:2;13960:18;;13953:62;-1:-1:-1;;;14046:2:1;14031:18;;14024:31;14087:3;14072:19;;13874:223::o;14102:406::-;14304:2;14286:21;;;14343:2;14323:18;;;14316:30;14382:34;14377:2;14362:18;;14355:62;-1:-1:-1;;;14448:2:1;14433:18;;14426:40;14498:3;14483:19;;14276:232::o;14513:398::-;14715:2;14697:21;;;14754:2;14734:18;;;14727:30;14793:34;14788:2;14773:18;;14766:62;-1:-1:-1;;;14859:2:1;14844:18;;14837:32;14901:3;14886:19;;14687:224::o;14916:356::-;15118:2;15100:21;;;15137:18;;;15130:30;15196:34;15191:2;15176:18;;15169:62;15263:2;15248:18;;15090:182::o;15277:397::-;15479:2;15461:21;;;15518:2;15498:18;;;15491:30;15557:34;15552:2;15537:18;;15530:62;-1:-1:-1;;;15623:2:1;15608:18;;15601:31;15664:3;15649:19;;15451:223::o;15679:408::-;15881:2;15863:21;;;15920:2;15900:18;;;15893:30;15959:34;15954:2;15939:18;;15932:62;-1:-1:-1;;;16025:2:1;16010:18;;16003:42;16077:3;16062:19;;15853:234::o;16092:356::-;16294:2;16276:21;;;16313:18;;;16306:30;16372:34;16367:2;16352:18;;16345:62;16439:2;16424:18;;16266:182::o;16453:405::-;16655:2;16637:21;;;16694:2;16674:18;;;16667:30;16733:34;16728:2;16713:18;;16706:62;-1:-1:-1;;;16799:2:1;16784:18;;16777:39;16848:3;16833:19;;16627:231::o;16863:411::-;17065:2;17047:21;;;17104:2;17084:18;;;17077:30;17143:34;17138:2;17123:18;;17116:62;-1:-1:-1;;;17209:2:1;17194:18;;17187:45;17264:3;17249:19;;17037:237::o;17279:397::-;17481:2;17463:21;;;17520:2;17500:18;;;17493:30;17559:34;17554:2;17539:18;;17532:62;-1:-1:-1;;;17625:2:1;17610:18;;17603:31;17666:3;17651:19;;17453:223::o;17681:346::-;17883:2;17865:21;;;17922:2;17902:18;;;17895:30;-1:-1:-1;;;17956:2:1;17941:18;;17934:52;18018:2;18003:18;;17855:172::o;18032:413::-;18234:2;18216:21;;;18273:2;18253:18;;;18246:30;18312:34;18307:2;18292:18;;18285:62;-1:-1:-1;;;18378:2:1;18363:18;;18356:47;18435:3;18420:19;;18206:239::o;18450:353::-;18652:2;18634:21;;;18691:2;18671:18;;;18664:30;18730:31;18725:2;18710:18;;18703:59;18794:2;18779:18;;18624:179::o;18808:405::-;19010:2;18992:21;;;19049:2;19029:18;;;19022:30;19088:34;19083:2;19068:18;;19061:62;-1:-1:-1;;;19154:2:1;19139:18;;19132:39;19203:3;19188:19;;18982:231::o;19218:177::-;19364:25;;;19352:2;19337:18;;19319:76::o;19400:129::-;;19468:17;;;19518:4;19502:21;;;19458:71::o;19534:258::-;19606:1;19616:113;19630:6;19627:1;19624:13;19616:113;;;19706:11;;;19700:18;19687:11;;;19680:39;19652:2;19645:10;19616:113;;;19747:6;19744:1;19741:13;19738:2;;;-1:-1:-1;;19782:1:1;19764:16;;19757:27;19587:205::o;19797:133::-;-1:-1:-1;;;;;;19873:32:1;;19863:43;;19853:2;;19920:1;19917;19910:12
Swarm Source
ipfs://6740162767ea3ce318ec2065a1cdeb4096665774438165286160fda8e31f00c3
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.