Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
256 KAMA
Holders
77
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
5 KAMALoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Kamagang
Compiler Version
v0.8.1+commit.df193b15
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-04-21 */ // KAMAGANG ETH CONTRACT // File: http://github.com/OpenZeppelin/openzeppelin-contracts/contracts/utils/Strings.sol // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant alphabet = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = alphabet[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: http://github.com/OpenZeppelin/openzeppelin-contracts/contracts/utils/EnumerableMap.sol pragma solidity ^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: http://github.com/OpenZeppelin/openzeppelin-contracts/contracts/utils/EnumerableSet.sol pragma solidity ^0.8.0; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping (bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement. bytes32 lastvalue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastvalue; // Update the index for the moved value set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { require(set._values.length > index, "EnumerableSet: index out of bounds"); return set._values[index]; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } } // File: http://github.com/OpenZeppelin/openzeppelin-contracts/contracts/utils/Address.sol pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: http://github.com/OpenZeppelin/openzeppelin-contracts/contracts/introspection/ERC165.sol pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: http://github.com/OpenZeppelin/openzeppelin-contracts/contracts/token/ERC721/IERC721.sol pragma solidity ^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 { /** * @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(type(IERC165).interfaceId); } /** * @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: http://github.com/OpenZeppelin/openzeppelin-contracts/contracts/token/ERC721/IERC721Receiver.sol pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 tokenId) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external; } pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4); } // File: http://github.com/OpenZeppelin/openzeppelin-contracts/contracts/token/ERC721/IERC721Enumerable.sol pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 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: http://github.com/OpenZeppelin/openzeppelin-contracts/contracts/token/ERC721/IERC721Metadata.sol pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: http://github.com/OpenZeppelin/openzeppelin-contracts/contracts/introspection/IERC165.sol // File: http://github.com/OpenZeppelin/openzeppelin-contracts/contracts/utils/Context.sol pragma solidity ^0.8.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with 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) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File: http://github.com/OpenZeppelin/openzeppelin-contracts/contracts/token/ERC721/ERC721.sol pragma solidity ^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 Address for address; using EnumerableSet for EnumerableSet.UintSet; using EnumerableMap for EnumerableMap.UintToAddressMap; using Strings for uint256; // 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; /** * @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(type(IERC721).interfaceId); _registerInterface(type(IERC721Metadata).interfaceId); _registerInterface(type(IERC721Enumerable).interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _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()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { // solhint-disable-next-line no-inline-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } function _approve(address to, uint256 tokenId) private { _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: http://github.com/OpenZeppelin/openzeppelin-contracts/contracts/access/Ownable.sol pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () { 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; } } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/contracts/utils/math/SafeMath.sol pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler * now has built in overflow checking. */ 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) { unchecked { 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) { unchecked { 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) { unchecked { // 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) { unchecked { 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) { unchecked { 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) { return a + b; } /** * @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) { 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) { return a * b; } /** * @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. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { 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) { 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) { unchecked { 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. * * 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). * * 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) { unchecked { 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) { unchecked { require(b > 0, errorMessage); return a % b; } } } // File: browser/KAMA.sol pragma solidity ^0.8.0; contract Kamagang is ERC721, Ownable { using SafeMath for uint256; uint public constant MAX_KAMAS = 3163; bool public hasSaleStarted = false; // THE IPFS HASH OF ALL TOKEN DATAS WILL BE ADDED HERE WHEN ALL KAMAS ARE FINALIZED. string public METADATA_PROVENANCE_HASH = ""; constructor() ERC721("Kamagang","KAMA") { setBaseURI("https://www.kamagang.com/api/token/"); // I AM DA BEST _safeMint(address(0x1d2D8fc9540E73906c6fae482FC241468B20691f), 0); // marketingBitch _safeMint(address(0x1d2D8fc9540E73906c6fae482FC241468B20691f), 1); // marketingBitch _safeMint(address(0x1d2D8fc9540E73906c6fae482FC241468B20691f), 2); } 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; } } function calculatePrice() public view returns (uint256) { require(hasSaleStarted == true, "Sale hasn't started"); require(totalSupply() < MAX_KAMAS, "Sale has already ended"); uint currentSupply = totalSupply(); if (currentSupply == 3163) { return 69000000000000000000; } else if (currentSupply >= 3160) { return 3600000000000000000; } else if (currentSupply >= 3150) { return 2690000000000000000; } else if (currentSupply >= 3130) { return 1690000000000000000; } else if (currentSupply >= 3080) { return 1090000000000000000; } else if (currentSupply >= 3000) { return 790000000000000000; } else if (currentSupply >= 2500) { return 690000000000000000; } else if (currentSupply >= 2000) { return 590000000000000000; } else if (currentSupply >= 1500) { return 490000000000000000; } else if (currentSupply >= 1000) { return 390000000000000000; } else if (currentSupply >= 500) { return 290000000000000000; } else if (currentSupply >= 250) { return 190000000000000000; } else { return 90000000000000000; } } function mintKAMA(uint256 numKamas) public payable { require(totalSupply() < MAX_KAMAS, "Sale has already ended"); require(numKamas > 0 && numKamas <= 5, "You can adopt minimum 1, maximum 5 KAMAS"); require(totalSupply().add(numKamas) <= MAX_KAMAS, "Exceeds MAX_KAMAS"); require(msg.value >= calculatePrice().mul(numKamas), "Ether value sent is below the price"); for (uint i = 0; i < numKamas; i++) { uint mintIndex = totalSupply(); _safeMint(msg.sender, mintIndex); } } // ONLYOWNER FUNCTIONS function setProvenanceHash(string memory _hash) public onlyOwner { METADATA_PROVENANCE_HASH = _hash; } function setBaseURI(string memory baseURI) public onlyOwner { _setBaseURI(baseURI); } function startDrop() public onlyOwner { hasSaleStarted = true; } function pauseDrop() public onlyOwner { hasSaleStarted = false; } function withdrawAll() public payable onlyOwner { require(payable(msg.sender).send(address(this).balance)); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_KAMAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"METADATA_PROVENANCE_HASH","outputs":[{"internalType":"string","name":"","type":"string"}],"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":[],"name":"calculatePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hasSaleStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numKamas","type":"uint256"}],"name":"mintKAMA","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":"pauseDrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_hash","type":"string"}],"name":"setProvenanceHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startDrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":"withdrawAll","outputs":[],"stateMutability":"payable","type":"function"}]
Contract Creation Code
600a805460ff60a01b1916905560a06040819052600060808190526200002891600b91620006bc565b503480156200003657600080fd5b50604051806040016040528060088152602001674b616d6167616e6760c01b815250604051806040016040528060048152602001634b414d4160e01b8152506200008d6301ffc9a760e01b620001d960201b60201c565b8151620000a2906006906020850190620006bc565b508051620000b8906007906020840190620006bc565b50620000cb6380ac58cd60e01b620001d9565b620000dd635b5e139f60e01b620001d9565b620000ef63780e9d6360e01b620001d9565b5060009050620000fe62000234565b600a80546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35062000170604051806060016040528060238152602001620030af6023913962000238565b62000191731d2d8fc9540e73906c6fae482fc241468b20691f60006200028c565b620001b2731d2d8fc9540e73906c6fae482fc241468b20691f60016200028c565b620001d3731d2d8fc9540e73906c6fae482fc241468b20691f60026200028c565b62000990565b6001600160e01b031980821614156200020f5760405162461bcd60e51b8152600401620002069062000857565b60405180910390fd5b6001600160e01b0319166000908152602081905260409020805460ff19166001179055565b3390565b6200024262000234565b6001600160a01b031662000255620002b2565b6001600160a01b0316146200027e5760405162461bcd60e51b81526004016200020690620008fa565b6200028981620002c1565b50565b620002ae828260405180602001604052806000815250620002d660201b60201c565b5050565b600a546001600160a01b031690565b8051620002ae906009906020840190620006bc565b620002e2838362000315565b620002f1600084848462000403565b620003105760405162461bcd60e51b8152600401620002069062000805565b505050565b6001600160a01b0382166200033e5760405162461bcd60e51b81526004016200020690620008c5565b62000349816200053c565b15620003695760405162461bcd60e51b815260040162000206906200088e565b620003776000838362000310565b6001600160a01b0382166000908152600160209081526040909120620003a8918390620011d26200055f821b17901c565b50620003c6818360026200057460201b620011de179092919060201c565b5060405181906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600062000424846001600160a01b03166200058c60201b620011fe1760201c565b1562000530576001600160a01b03841663150b7a026200044362000234565b8786866040518563ffffffff1660e01b81526004016200046794939291906200078c565b602060405180830381600087803b1580156200048257600080fd5b505af1925050508015620004b5575060408051601f3d908101601f19168201909252620004b29181019062000762565b60015b62000515573d808015620004e6576040519150601f19603f3d011682016040523d82523d6000602084013e620004eb565b606091505b5080516200050d5760405162461bcd60e51b8152600401620002069062000805565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905062000534565b5060015b949350505050565b6000620005598260026200059260201b620012041790919060201c565b92915050565b60006200056d8383620005a0565b9392505050565b60006200053484846001600160a01b038516620005ef565b3b151590565b60006200056d8383620006a4565b6000620005ae8383620006a4565b620005e65750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915562000559565b50600062000559565b600082815260018401602052604081205480620006565750506040805180820182528381526020808201848152865460018181018955600089815284812095516002909302909501918255915190820155865486845281880190925292909120556200056d565b8285620006656001846200092f565b815481106200068457634e487b7160e01b600052603260045260246000fd5b90600052602060002090600202016001018190555060009150506200056d565b60009081526001919091016020526040902054151590565b828054620006ca9062000953565b90600052602060002090601f016020900481019282620006ee576000855562000739565b82601f106200070957805160ff191683800117855562000739565b8280016001018555821562000739579182015b82811115620007395782518255916020019190600101906200071c565b50620007479291506200074b565b5090565b5b808211156200074757600081556001016200074c565b60006020828403121562000774578081fd5b81516001600160e01b0319811681146200056d578182fd5b600060018060a01b0380871683526020818716818501528560408501526080606085015284519150816080850152825b82811015620007da5785810182015185820160a001528101620007bc565b82811115620007ec578360a084870101525b5050601f01601f19169190910160a00195945050505050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252601c908201527f4552433136353a20696e76616c696420696e7465726661636520696400000000604082015260600190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6000828210156200094e57634e487b7160e01b81526011600452602481fd5b500390565b6002810460018216806200096857607f821691505b602082108114156200098a57634e487b7160e01b600052602260045260246000fd5b50919050565b61270f80620009a06000396000f3fe6080604052600436106101d85760003560e01c80636c0360eb11610102578063a22cb46511610095578063e985e9c511610064578063e985e9c5146104f8578063f0c9dc6014610518578063f2fde38b1461052d578063f30818bf1461054d576101d8565b8063a22cb46514610483578063b88d4fde146104a3578063c87b56dd146104c3578063d348b409146104e3576101d8565b8063853828b6116100d1578063853828b61461043c5780638da5cb5b1461044457806395d89b4114610459578063a216c4621461046e576101d8565b80636c0360eb146103c557806370a08231146103da578063715018a6146103fa5780638462151c1461040f576101d8565b806323b872dd1161017a57806342842e0e1161014957806342842e0e146103455780634f6ccce71461036557806355f804b3146103855780636352211e146103a5576101d8565b806323b872dd146102db5780632808c92c146102fb5780632f745c591461031057806334d84c7b14610330576101d8565b8063095ea7b3116101b6578063095ea7b314610262578063109695231461028457806318160ddd146102a45780631c8b232d146102c6576101d8565b806301ffc9a7146101dd57806306fdde0314610213578063081812fc14610235575b600080fd5b3480156101e957600080fd5b506101fd6101f8366004611e05565b610560565b60405161020a9190611f8b565b60405180910390f35b34801561021f57600080fd5b50610228610583565b60405161020a9190611f96565b34801561024157600080fd5b50610255610250366004611e83565b610616565b60405161020a9190611ef6565b34801561026e57600080fd5b5061028261027d366004611ddc565b610662565b005b34801561029057600080fd5b5061028261029f366004611e3d565b6106fa565b3480156102b057600080fd5b506102b9610750565b60405161020a919061255d565b3480156102d257600080fd5b506101fd610761565b3480156102e757600080fd5b506102826102f6366004611cee565b610771565b34801561030757600080fd5b506102826107a9565b34801561031c57600080fd5b506102b961032b366004611ddc565b6107f7565b34801561033c57600080fd5b50610282610822565b34801561035157600080fd5b50610282610360366004611cee565b610876565b34801561037157600080fd5b506102b9610380366004611e83565b610891565b34801561039157600080fd5b506102826103a0366004611e3d565b6108a7565b3480156103b157600080fd5b506102556103c0366004611e83565b6108f2565b3480156103d157600080fd5b5061022861091a565b3480156103e657600080fd5b506102b96103f5366004611ca2565b610929565b34801561040657600080fd5b50610282610972565b34801561041b57600080fd5b5061042f61042a366004611ca2565b6109fb565b60405161020a9190611f47565b610282610adc565b34801561045057600080fd5b50610255610b41565b34801561046557600080fd5b50610228610b50565b34801561047a57600080fd5b506102b9610b5f565b34801561048f57600080fd5b5061028261049e366004611da2565b610b65565b3480156104af57600080fd5b506102826104be366004611d29565b610c33565b3480156104cf57600080fd5b506102286104de366004611e83565b610c72565b3480156104ef57600080fd5b506102b9610db5565b34801561050457600080fd5b506101fd610513366004611cbc565b610f68565b34801561052457600080fd5b50610228610f96565b34801561053957600080fd5b50610282610548366004611ca2565b611024565b61028261055b366004611e83565b6110e5565b6001600160e01b0319811660009081526020819052604090205460ff165b919050565b606060068054610592906125f4565b80601f01602080910402602001604051908101604052809291908181526020018280546105be906125f4565b801561060b5780601f106105e05761010080835404028352916020019161060b565b820191906000526020600020905b8154815290600101906020018083116105ee57829003601f168201915b505050505090505b90565b600061062182611210565b6106465760405162461bcd60e51b815260040161063d9061230d565b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061066d826108f2565b9050806001600160a01b0316836001600160a01b031614156106a15760405162461bcd60e51b815260040161063d9061246e565b806001600160a01b03166106b361121d565b6001600160a01b031614806106cf57506106cf8161051361121d565b6106eb5760405162461bcd60e51b815260040161063d906121ac565b6106f58383611221565b505050565b61070261121d565b6001600160a01b0316610713610b41565b6001600160a01b0316146107395760405162461bcd60e51b815260040161063d90612359565b805161074c90600b906020840190611b85565b5050565b600061075c600261128f565b905090565b600a54600160a01b900460ff1681565b61078261077c61121d565b8261129a565b61079e5760405162461bcd60e51b815260040161063d906124df565b6106f583838361131f565b6107b161121d565b6001600160a01b03166107c2610b41565b6001600160a01b0316146107e85760405162461bcd60e51b815260040161063d90612359565b600a805460ff60a01b19169055565b6001600160a01b0382166000908152600160205260408120610819908361142d565b90505b92915050565b61082a61121d565b6001600160a01b031661083b610b41565b6001600160a01b0316146108615760405162461bcd60e51b815260040161063d90612359565b600a805460ff60a01b1916600160a01b179055565b6106f583838360405180602001604052806000815250610c33565b60008061089f600284611439565b509392505050565b6108af61121d565b6001600160a01b03166108c0610b41565b6001600160a01b0316146108e65760405162461bcd60e51b815260040161063d90612359565b6108ef81611455565b50565b600061081c826040518060600160405280602981526020016126b16029913960029190611468565b606060098054610592906125f4565b60006001600160a01b0382166109515760405162461bcd60e51b815260040161063d90612209565b6001600160a01b038216600090815260016020526040902061081c9061128f565b61097a61121d565b6001600160a01b031661098b610b41565b6001600160a01b0316146109b15760405162461bcd60e51b815260040161063d90612359565b600a546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600a80546001600160a01b0319169055565b60606000610a0883610929565b905080610a2557505060408051600081526020810190915261057e565b60008167ffffffffffffffff811115610a4e57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015610a77578160200160208202803683370190505b50905060005b82811015610acc57610a8f85826107f7565b828281518110610aaf57634e487b7160e01b600052603260045260246000fd5b602090810291909101015280610ac481612629565b915050610a7d565b50915061057e9050565b50919050565b610ae461121d565b6001600160a01b0316610af5610b41565b6001600160a01b031614610b1b5760405162461bcd60e51b815260040161063d90612359565b60405133904780156108fc02916000818181858888f19350505050610b3f57600080fd5b565b600a546001600160a01b031690565b606060078054610592906125f4565b610c5b81565b610b6d61121d565b6001600160a01b0316826001600160a01b03161415610b9e5760405162461bcd60e51b815260040161063d906120fe565b8060056000610bab61121d565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155610bef61121d565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610c279190611f8b565b60405180910390a35050565b610c44610c3e61121d565b8361129a565b610c605760405162461bcd60e51b815260040161063d906124df565b610c6c84848484611475565b50505050565b6060610c7d82611210565b610c995760405162461bcd60e51b815260040161063d906123d7565b60008281526008602052604081208054610cb2906125f4565b80601f0160208091040260200160405190810160405280929190818152602001828054610cde906125f4565b8015610d2b5780601f10610d0057610100808354040283529160200191610d2b565b820191906000526020600020905b815481529060010190602001808311610d0e57829003601f168201915b505050505090506000610d3c61091a565b9050805160001415610d505750905061057e565b815115610d82578082604051602001610d6a929190611ec7565b6040516020818303038152906040529250505061057e565b80610d8c856114a8565b604051602001610d9d929190611ec7565b60405160208183030381529060405292505050919050565b600a54600090600160a01b900460ff161515600114610de65760405162461bcd60e51b815260040161063d90612530565b610c5b610df1610750565b10610e0e5760405162461bcd60e51b815260040161063d906124af565b6000610e18610750565b905080610c5b1415610e36576803bd913e6c1df40000915050610613565b610c588110610e50576731f5c4ed27680000915050610613565b610c4e8110610e6a57672554ccbf6dcd0000915050610613565b610c3a8110610e8457671774160bc6690000915050610613565b610c088110610e9e57670f207539952d0000915050610613565b610bb88110610eb857670af6a4d07c8f0000915050610613565b6109c48110610ed2576709935f581f050000915050610613565b6107d08110610eec5767083019dfc17b0000915050610613565b6105dc8110610f06576706ccd46763f10000915050610613565b6103e88110610f20576705698eef06670000915050610613565b6101f48110610f3a576704064976a8dd0000915050610613565b60fa8110610f53576702a303fe4b530000915050610613565b67013fbe85edc90000915050610613565b5090565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b600b8054610fa3906125f4565b80601f0160208091040260200160405190810160405280929190818152602001828054610fcf906125f4565b801561101c5780601f10610ff15761010080835404028352916020019161101c565b820191906000526020600020905b815481529060010190602001808311610fff57829003601f168201915b505050505081565b61102c61121d565b6001600160a01b031661103d610b41565b6001600160a01b0316146110635760405162461bcd60e51b815260040161063d90612359565b6001600160a01b0381166110895760405162461bcd60e51b815260040161063d9061203d565b600a546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600a80546001600160a01b0319166001600160a01b0392909216919091179055565b610c5b6110f0610750565b1061110d5760405162461bcd60e51b815260040161063d906124af565b60008111801561111e575060058111155b61113a5760405162461bcd60e51b815260040161063d90612426565b610c5b61114f82611149610750565b906115c3565b111561116d5760405162461bcd60e51b815260040161063d90612181565b61117f81611179610db5565b906115cf565b34101561119e5760405162461bcd60e51b815260040161063d90612253565b60005b8181101561074c5760006111b3610750565b90506111bf33826115db565b50806111ca81612629565b9150506111a1565b600061081983836115f5565b60006111f484846001600160a01b03851661163f565b90505b9392505050565b3b151590565b600061081983836116ee565b600061081c600283611204565b3390565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611256826108f2565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061081c82611706565b60006112a582611210565b6112c15760405162461bcd60e51b815260040161063d90612135565b60006112cc836108f2565b9050806001600160a01b0316846001600160a01b031614806113075750836001600160a01b03166112fc84610616565b6001600160a01b0316145b8061131757506113178185610f68565b949350505050565b826001600160a01b0316611332826108f2565b6001600160a01b0316146113585760405162461bcd60e51b815260040161063d9061238e565b6001600160a01b03821661137e5760405162461bcd60e51b815260040161063d906120ba565b6113898383836106f5565b611394600082611221565b6001600160a01b03831660009081526001602052604090206113b6908261170a565b506001600160a01b03821660009081526001602052604090206113d990826111d2565b506113e6600282846111de565b5080826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60006108198383611716565b6000808080611448868661176f565b9097909650945050505050565b805161074c906009906020840190611b85565b60006111f48484846117df565b61148084848461131f565b61148c84848484611856565b610c6c5760405162461bcd60e51b815260040161063d90611feb565b6060816114cd57506040805180820190915260018152600360fc1b602082015261057e565b8160005b81156114f757806114e181612629565b91506114f09050600a8361257e565b91506114d1565b60008167ffffffffffffffff81111561152057634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561154a576020820181803683370190505b5090505b84156113175761155f6001836125b1565b915061156c600a86612644565b611577906030612566565b60f81b81838151811061159a57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053506115bc600a8661257e565b945061154e565b60006108198284612566565b60006108198284612592565b61074c828260405180602001604052806000815250611971565b600061160183836116ee565b6116375750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561081c565b50600061081c565b6000828152600184016020526040812054806116a45750506040805180820182528381526020808201848152865460018181018955600089815284812095516002909302909501918255915190820155865486845281880190925292909120556111f7565b82856116b16001846125b1565b815481106116cf57634e487b7160e01b600052603260045260246000fd5b90600052602060002090600202016001018190555060009150506111f7565b60009081526001919091016020526040902054151590565b5490565b600061081983836119a4565b815460009082106117395760405162461bcd60e51b815260040161063d90611fa9565b82600001828154811061175c57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905092915050565b8154600090819083106117945760405162461bcd60e51b815260040161063d90612296565b60008460000184815481106117b957634e487b7160e01b600052603260045260246000fd5b906000526020600020906002020190508060000154816001015492509250509250929050565b6000828152600184016020526040812054828161180f5760405162461bcd60e51b815260040161063d9190611f96565b508461181c6001836125b1565b8154811061183a57634e487b7160e01b600052603260045260246000fd5b9060005260206000209060020201600101549150509392505050565b600061186a846001600160a01b03166111fe565b1561196657836001600160a01b031663150b7a0261188661121d565b8786866040518563ffffffff1660e01b81526004016118a89493929190611f0a565b602060405180830381600087803b1580156118c257600080fd5b505af19250505080156118f2575060408051601f3d908101601f191682019092526118ef91810190611e21565b60015b61194c573d808015611920576040519150601f19603f3d011682016040523d82523d6000602084013e611925565b606091505b5080516119445760405162461bcd60e51b815260040161063d90611feb565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611317565b506001949350505050565b61197b8383611ac1565b6119886000848484611856565b6106f55760405162461bcd60e51b815260040161063d90611feb565b60008181526001830160205260408120548015611ab75760006119c86001836125b1565b85549091506000906119dc906001906125b1565b90506000866000018281548110611a0357634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905080876000018481548110611a3457634e487b7160e01b600052603260045260246000fd5b600091825260209091200155611a4b836001612566565b60008281526001890160205260409020558654879080611a7b57634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905586600101600087815260200190815260200160002060009055600194505050505061081c565b600091505061081c565b6001600160a01b038216611ae75760405162461bcd60e51b815260040161063d906122d8565b611af081611210565b15611b0d5760405162461bcd60e51b815260040161063d90612083565b611b19600083836106f5565b6001600160a01b0382166000908152600160205260409020611b3b90826111d2565b50611b48600282846111de565b5060405181906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b828054611b91906125f4565b90600052602060002090601f016020900481019282611bb35760008555611bf9565b82601f10611bcc57805160ff1916838001178555611bf9565b82800160010185558215611bf9579182015b82811115611bf9578251825591602001919060010190611bde565b50610f649291505b80821115610f645760008155600101611c01565b600067ffffffffffffffff80841115611c3057611c30612684565b604051601f8501601f19908116603f01168101908282118183101715611c5857611c58612684565b81604052809350858152868686011115611c7157600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b038116811461057e57600080fd5b600060208284031215611cb3578081fd5b61081982611c8b565b60008060408385031215611cce578081fd5b611cd783611c8b565b9150611ce560208401611c8b565b90509250929050565b600080600060608486031215611d02578081fd5b611d0b84611c8b565b9250611d1960208501611c8b565b9150604084013590509250925092565b60008060008060808587031215611d3e578081fd5b611d4785611c8b565b9350611d5560208601611c8b565b925060408501359150606085013567ffffffffffffffff811115611d77578182fd5b8501601f81018713611d87578182fd5b611d9687823560208401611c15565b91505092959194509250565b60008060408385031215611db4578182fd5b611dbd83611c8b565b915060208301358015158114611dd1578182fd5b809150509250929050565b60008060408385031215611dee578182fd5b611df783611c8b565b946020939093013593505050565b600060208284031215611e16578081fd5b81356111f78161269a565b600060208284031215611e32578081fd5b81516111f78161269a565b600060208284031215611e4e578081fd5b813567ffffffffffffffff811115611e64578182fd5b8201601f81018413611e74578182fd5b61131784823560208401611c15565b600060208284031215611e94578081fd5b5035919050565b60008151808452611eb38160208601602086016125c8565b601f01601f19169290920160200192915050565b60008351611ed98184602088016125c8565b835190830190611eed8183602088016125c8565b01949350505050565b6001600160a01b0391909116815260200190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611f3d90830184611e9b565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015611f7f57835183529284019291840191600101611f63565b50909695505050505050565b901515815260200190565b6000602082526108196020830184611e9b565b60208082526022908201527f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e604082015261647360f01b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b60208082526011908201527045786365656473204d41585f4b414d415360781b604082015260600190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526023908201527f45746865722076616c75652073656e742069732062656c6f772074686520707260408201526269636560e81b606082015260800190565b60208082526022908201527f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e604082015261647360f01b606082015260800190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b6020808252602f908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201526e3732bc34b9ba32b73a103a37b5b2b760891b606082015260800190565b60208082526028908201527f596f752063616e2061646f7074206d696e696d756d20312c206d6178696d756d6040820152672035204b414d415360c01b606082015260800190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b60208082526016908201527514d85b19481a185cc8185b1c9958591e48195b99195960521b604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60208082526013908201527214d85b19481a185cdb89dd081cdd185c9d1959606a1b604082015260600190565b90815260200190565b6000821982111561257957612579612658565b500190565b60008261258d5761258d61266e565b500490565b60008160001904831182151516156125ac576125ac612658565b500290565b6000828210156125c3576125c3612658565b500390565b60005b838110156125e35781810151838201526020016125cb565b83811115610c6c5750506000910152565b60028104600182168061260857607f821691505b60208210811415610ad657634e487b7160e01b600052602260045260246000fd5b600060001982141561263d5761263d612658565b5060010190565b6000826126535761265361266e565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146108ef57600080fdfe4552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea264697066735822122013a3602731b5340ab1a24cf2fb5cb12a88e0e15c95dac3592cfb5d0fd0da1e9564736f6c6343000801003368747470733a2f2f7777772e6b616d6167616e672e636f6d2f6170692f746f6b656e2f
Deployed Bytecode
0x6080604052600436106101d85760003560e01c80636c0360eb11610102578063a22cb46511610095578063e985e9c511610064578063e985e9c5146104f8578063f0c9dc6014610518578063f2fde38b1461052d578063f30818bf1461054d576101d8565b8063a22cb46514610483578063b88d4fde146104a3578063c87b56dd146104c3578063d348b409146104e3576101d8565b8063853828b6116100d1578063853828b61461043c5780638da5cb5b1461044457806395d89b4114610459578063a216c4621461046e576101d8565b80636c0360eb146103c557806370a08231146103da578063715018a6146103fa5780638462151c1461040f576101d8565b806323b872dd1161017a57806342842e0e1161014957806342842e0e146103455780634f6ccce71461036557806355f804b3146103855780636352211e146103a5576101d8565b806323b872dd146102db5780632808c92c146102fb5780632f745c591461031057806334d84c7b14610330576101d8565b8063095ea7b3116101b6578063095ea7b314610262578063109695231461028457806318160ddd146102a45780631c8b232d146102c6576101d8565b806301ffc9a7146101dd57806306fdde0314610213578063081812fc14610235575b600080fd5b3480156101e957600080fd5b506101fd6101f8366004611e05565b610560565b60405161020a9190611f8b565b60405180910390f35b34801561021f57600080fd5b50610228610583565b60405161020a9190611f96565b34801561024157600080fd5b50610255610250366004611e83565b610616565b60405161020a9190611ef6565b34801561026e57600080fd5b5061028261027d366004611ddc565b610662565b005b34801561029057600080fd5b5061028261029f366004611e3d565b6106fa565b3480156102b057600080fd5b506102b9610750565b60405161020a919061255d565b3480156102d257600080fd5b506101fd610761565b3480156102e757600080fd5b506102826102f6366004611cee565b610771565b34801561030757600080fd5b506102826107a9565b34801561031c57600080fd5b506102b961032b366004611ddc565b6107f7565b34801561033c57600080fd5b50610282610822565b34801561035157600080fd5b50610282610360366004611cee565b610876565b34801561037157600080fd5b506102b9610380366004611e83565b610891565b34801561039157600080fd5b506102826103a0366004611e3d565b6108a7565b3480156103b157600080fd5b506102556103c0366004611e83565b6108f2565b3480156103d157600080fd5b5061022861091a565b3480156103e657600080fd5b506102b96103f5366004611ca2565b610929565b34801561040657600080fd5b50610282610972565b34801561041b57600080fd5b5061042f61042a366004611ca2565b6109fb565b60405161020a9190611f47565b610282610adc565b34801561045057600080fd5b50610255610b41565b34801561046557600080fd5b50610228610b50565b34801561047a57600080fd5b506102b9610b5f565b34801561048f57600080fd5b5061028261049e366004611da2565b610b65565b3480156104af57600080fd5b506102826104be366004611d29565b610c33565b3480156104cf57600080fd5b506102286104de366004611e83565b610c72565b3480156104ef57600080fd5b506102b9610db5565b34801561050457600080fd5b506101fd610513366004611cbc565b610f68565b34801561052457600080fd5b50610228610f96565b34801561053957600080fd5b50610282610548366004611ca2565b611024565b61028261055b366004611e83565b6110e5565b6001600160e01b0319811660009081526020819052604090205460ff165b919050565b606060068054610592906125f4565b80601f01602080910402602001604051908101604052809291908181526020018280546105be906125f4565b801561060b5780601f106105e05761010080835404028352916020019161060b565b820191906000526020600020905b8154815290600101906020018083116105ee57829003601f168201915b505050505090505b90565b600061062182611210565b6106465760405162461bcd60e51b815260040161063d9061230d565b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061066d826108f2565b9050806001600160a01b0316836001600160a01b031614156106a15760405162461bcd60e51b815260040161063d9061246e565b806001600160a01b03166106b361121d565b6001600160a01b031614806106cf57506106cf8161051361121d565b6106eb5760405162461bcd60e51b815260040161063d906121ac565b6106f58383611221565b505050565b61070261121d565b6001600160a01b0316610713610b41565b6001600160a01b0316146107395760405162461bcd60e51b815260040161063d90612359565b805161074c90600b906020840190611b85565b5050565b600061075c600261128f565b905090565b600a54600160a01b900460ff1681565b61078261077c61121d565b8261129a565b61079e5760405162461bcd60e51b815260040161063d906124df565b6106f583838361131f565b6107b161121d565b6001600160a01b03166107c2610b41565b6001600160a01b0316146107e85760405162461bcd60e51b815260040161063d90612359565b600a805460ff60a01b19169055565b6001600160a01b0382166000908152600160205260408120610819908361142d565b90505b92915050565b61082a61121d565b6001600160a01b031661083b610b41565b6001600160a01b0316146108615760405162461bcd60e51b815260040161063d90612359565b600a805460ff60a01b1916600160a01b179055565b6106f583838360405180602001604052806000815250610c33565b60008061089f600284611439565b509392505050565b6108af61121d565b6001600160a01b03166108c0610b41565b6001600160a01b0316146108e65760405162461bcd60e51b815260040161063d90612359565b6108ef81611455565b50565b600061081c826040518060600160405280602981526020016126b16029913960029190611468565b606060098054610592906125f4565b60006001600160a01b0382166109515760405162461bcd60e51b815260040161063d90612209565b6001600160a01b038216600090815260016020526040902061081c9061128f565b61097a61121d565b6001600160a01b031661098b610b41565b6001600160a01b0316146109b15760405162461bcd60e51b815260040161063d90612359565b600a546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600a80546001600160a01b0319169055565b60606000610a0883610929565b905080610a2557505060408051600081526020810190915261057e565b60008167ffffffffffffffff811115610a4e57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015610a77578160200160208202803683370190505b50905060005b82811015610acc57610a8f85826107f7565b828281518110610aaf57634e487b7160e01b600052603260045260246000fd5b602090810291909101015280610ac481612629565b915050610a7d565b50915061057e9050565b50919050565b610ae461121d565b6001600160a01b0316610af5610b41565b6001600160a01b031614610b1b5760405162461bcd60e51b815260040161063d90612359565b60405133904780156108fc02916000818181858888f19350505050610b3f57600080fd5b565b600a546001600160a01b031690565b606060078054610592906125f4565b610c5b81565b610b6d61121d565b6001600160a01b0316826001600160a01b03161415610b9e5760405162461bcd60e51b815260040161063d906120fe565b8060056000610bab61121d565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155610bef61121d565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610c279190611f8b565b60405180910390a35050565b610c44610c3e61121d565b8361129a565b610c605760405162461bcd60e51b815260040161063d906124df565b610c6c84848484611475565b50505050565b6060610c7d82611210565b610c995760405162461bcd60e51b815260040161063d906123d7565b60008281526008602052604081208054610cb2906125f4565b80601f0160208091040260200160405190810160405280929190818152602001828054610cde906125f4565b8015610d2b5780601f10610d0057610100808354040283529160200191610d2b565b820191906000526020600020905b815481529060010190602001808311610d0e57829003601f168201915b505050505090506000610d3c61091a565b9050805160001415610d505750905061057e565b815115610d82578082604051602001610d6a929190611ec7565b6040516020818303038152906040529250505061057e565b80610d8c856114a8565b604051602001610d9d929190611ec7565b60405160208183030381529060405292505050919050565b600a54600090600160a01b900460ff161515600114610de65760405162461bcd60e51b815260040161063d90612530565b610c5b610df1610750565b10610e0e5760405162461bcd60e51b815260040161063d906124af565b6000610e18610750565b905080610c5b1415610e36576803bd913e6c1df40000915050610613565b610c588110610e50576731f5c4ed27680000915050610613565b610c4e8110610e6a57672554ccbf6dcd0000915050610613565b610c3a8110610e8457671774160bc6690000915050610613565b610c088110610e9e57670f207539952d0000915050610613565b610bb88110610eb857670af6a4d07c8f0000915050610613565b6109c48110610ed2576709935f581f050000915050610613565b6107d08110610eec5767083019dfc17b0000915050610613565b6105dc8110610f06576706ccd46763f10000915050610613565b6103e88110610f20576705698eef06670000915050610613565b6101f48110610f3a576704064976a8dd0000915050610613565b60fa8110610f53576702a303fe4b530000915050610613565b67013fbe85edc90000915050610613565b5090565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b600b8054610fa3906125f4565b80601f0160208091040260200160405190810160405280929190818152602001828054610fcf906125f4565b801561101c5780601f10610ff15761010080835404028352916020019161101c565b820191906000526020600020905b815481529060010190602001808311610fff57829003601f168201915b505050505081565b61102c61121d565b6001600160a01b031661103d610b41565b6001600160a01b0316146110635760405162461bcd60e51b815260040161063d90612359565b6001600160a01b0381166110895760405162461bcd60e51b815260040161063d9061203d565b600a546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600a80546001600160a01b0319166001600160a01b0392909216919091179055565b610c5b6110f0610750565b1061110d5760405162461bcd60e51b815260040161063d906124af565b60008111801561111e575060058111155b61113a5760405162461bcd60e51b815260040161063d90612426565b610c5b61114f82611149610750565b906115c3565b111561116d5760405162461bcd60e51b815260040161063d90612181565b61117f81611179610db5565b906115cf565b34101561119e5760405162461bcd60e51b815260040161063d90612253565b60005b8181101561074c5760006111b3610750565b90506111bf33826115db565b50806111ca81612629565b9150506111a1565b600061081983836115f5565b60006111f484846001600160a01b03851661163f565b90505b9392505050565b3b151590565b600061081983836116ee565b600061081c600283611204565b3390565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611256826108f2565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061081c82611706565b60006112a582611210565b6112c15760405162461bcd60e51b815260040161063d90612135565b60006112cc836108f2565b9050806001600160a01b0316846001600160a01b031614806113075750836001600160a01b03166112fc84610616565b6001600160a01b0316145b8061131757506113178185610f68565b949350505050565b826001600160a01b0316611332826108f2565b6001600160a01b0316146113585760405162461bcd60e51b815260040161063d9061238e565b6001600160a01b03821661137e5760405162461bcd60e51b815260040161063d906120ba565b6113898383836106f5565b611394600082611221565b6001600160a01b03831660009081526001602052604090206113b6908261170a565b506001600160a01b03821660009081526001602052604090206113d990826111d2565b506113e6600282846111de565b5080826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60006108198383611716565b6000808080611448868661176f565b9097909650945050505050565b805161074c906009906020840190611b85565b60006111f48484846117df565b61148084848461131f565b61148c84848484611856565b610c6c5760405162461bcd60e51b815260040161063d90611feb565b6060816114cd57506040805180820190915260018152600360fc1b602082015261057e565b8160005b81156114f757806114e181612629565b91506114f09050600a8361257e565b91506114d1565b60008167ffffffffffffffff81111561152057634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561154a576020820181803683370190505b5090505b84156113175761155f6001836125b1565b915061156c600a86612644565b611577906030612566565b60f81b81838151811061159a57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053506115bc600a8661257e565b945061154e565b60006108198284612566565b60006108198284612592565b61074c828260405180602001604052806000815250611971565b600061160183836116ee565b6116375750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561081c565b50600061081c565b6000828152600184016020526040812054806116a45750506040805180820182528381526020808201848152865460018181018955600089815284812095516002909302909501918255915190820155865486845281880190925292909120556111f7565b82856116b16001846125b1565b815481106116cf57634e487b7160e01b600052603260045260246000fd5b90600052602060002090600202016001018190555060009150506111f7565b60009081526001919091016020526040902054151590565b5490565b600061081983836119a4565b815460009082106117395760405162461bcd60e51b815260040161063d90611fa9565b82600001828154811061175c57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905092915050565b8154600090819083106117945760405162461bcd60e51b815260040161063d90612296565b60008460000184815481106117b957634e487b7160e01b600052603260045260246000fd5b906000526020600020906002020190508060000154816001015492509250509250929050565b6000828152600184016020526040812054828161180f5760405162461bcd60e51b815260040161063d9190611f96565b508461181c6001836125b1565b8154811061183a57634e487b7160e01b600052603260045260246000fd5b9060005260206000209060020201600101549150509392505050565b600061186a846001600160a01b03166111fe565b1561196657836001600160a01b031663150b7a0261188661121d565b8786866040518563ffffffff1660e01b81526004016118a89493929190611f0a565b602060405180830381600087803b1580156118c257600080fd5b505af19250505080156118f2575060408051601f3d908101601f191682019092526118ef91810190611e21565b60015b61194c573d808015611920576040519150601f19603f3d011682016040523d82523d6000602084013e611925565b606091505b5080516119445760405162461bcd60e51b815260040161063d90611feb565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611317565b506001949350505050565b61197b8383611ac1565b6119886000848484611856565b6106f55760405162461bcd60e51b815260040161063d90611feb565b60008181526001830160205260408120548015611ab75760006119c86001836125b1565b85549091506000906119dc906001906125b1565b90506000866000018281548110611a0357634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905080876000018481548110611a3457634e487b7160e01b600052603260045260246000fd5b600091825260209091200155611a4b836001612566565b60008281526001890160205260409020558654879080611a7b57634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905586600101600087815260200190815260200160002060009055600194505050505061081c565b600091505061081c565b6001600160a01b038216611ae75760405162461bcd60e51b815260040161063d906122d8565b611af081611210565b15611b0d5760405162461bcd60e51b815260040161063d90612083565b611b19600083836106f5565b6001600160a01b0382166000908152600160205260409020611b3b90826111d2565b50611b48600282846111de565b5060405181906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b828054611b91906125f4565b90600052602060002090601f016020900481019282611bb35760008555611bf9565b82601f10611bcc57805160ff1916838001178555611bf9565b82800160010185558215611bf9579182015b82811115611bf9578251825591602001919060010190611bde565b50610f649291505b80821115610f645760008155600101611c01565b600067ffffffffffffffff80841115611c3057611c30612684565b604051601f8501601f19908116603f01168101908282118183101715611c5857611c58612684565b81604052809350858152868686011115611c7157600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b038116811461057e57600080fd5b600060208284031215611cb3578081fd5b61081982611c8b565b60008060408385031215611cce578081fd5b611cd783611c8b565b9150611ce560208401611c8b565b90509250929050565b600080600060608486031215611d02578081fd5b611d0b84611c8b565b9250611d1960208501611c8b565b9150604084013590509250925092565b60008060008060808587031215611d3e578081fd5b611d4785611c8b565b9350611d5560208601611c8b565b925060408501359150606085013567ffffffffffffffff811115611d77578182fd5b8501601f81018713611d87578182fd5b611d9687823560208401611c15565b91505092959194509250565b60008060408385031215611db4578182fd5b611dbd83611c8b565b915060208301358015158114611dd1578182fd5b809150509250929050565b60008060408385031215611dee578182fd5b611df783611c8b565b946020939093013593505050565b600060208284031215611e16578081fd5b81356111f78161269a565b600060208284031215611e32578081fd5b81516111f78161269a565b600060208284031215611e4e578081fd5b813567ffffffffffffffff811115611e64578182fd5b8201601f81018413611e74578182fd5b61131784823560208401611c15565b600060208284031215611e94578081fd5b5035919050565b60008151808452611eb38160208601602086016125c8565b601f01601f19169290920160200192915050565b60008351611ed98184602088016125c8565b835190830190611eed8183602088016125c8565b01949350505050565b6001600160a01b0391909116815260200190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611f3d90830184611e9b565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015611f7f57835183529284019291840191600101611f63565b50909695505050505050565b901515815260200190565b6000602082526108196020830184611e9b565b60208082526022908201527f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e604082015261647360f01b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b60208082526011908201527045786365656473204d41585f4b414d415360781b604082015260600190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526023908201527f45746865722076616c75652073656e742069732062656c6f772074686520707260408201526269636560e81b606082015260800190565b60208082526022908201527f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e604082015261647360f01b606082015260800190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b6020808252602f908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201526e3732bc34b9ba32b73a103a37b5b2b760891b606082015260800190565b60208082526028908201527f596f752063616e2061646f7074206d696e696d756d20312c206d6178696d756d6040820152672035204b414d415360c01b606082015260800190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b60208082526016908201527514d85b19481a185cc8185b1c9958591e48195b99195960521b604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60208082526013908201527214d85b19481a185cdb89dd081cdd185c9d1959606a1b604082015260600190565b90815260200190565b6000821982111561257957612579612658565b500190565b60008261258d5761258d61266e565b500490565b60008160001904831182151516156125ac576125ac612658565b500290565b6000828210156125c3576125c3612658565b500390565b60005b838110156125e35781810151838201526020016125cb565b83811115610c6c5750506000910152565b60028104600182168061260857607f821691505b60208210811415610ad657634e487b7160e01b600052602260045260246000fd5b600060001982141561263d5761263d612658565b5060010190565b6000826126535761265361266e565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146108ef57600080fdfe4552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea264697066735822122013a3602731b5340ab1a24cf2fb5cb12a88e0e15c95dac3592cfb5d0fd0da1e9564736f6c63430008010033
Deployed Bytecode Sourcemap
66099:3839:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31801:150;;;;;;;;;;-1:-1:-1;31801:150:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43489:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;46275:221::-;;;;;;;;;;-1:-1:-1;46275:221:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;45805:404::-;;;;;;;;;;-1:-1:-1;45805:404:0;;;;;:::i;:::-;;:::i;:::-;;69382:116;;;;;;;;;;-1:-1:-1;69382:116:0;;;;;:::i;:::-;;:::i;45283:211::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;66220:34::-;;;;;;;;;;;;;:::i;47165:305::-;;;;;;;;;;-1:-1:-1;47165:305:0;;;;;:::i;:::-;;:::i;69705:79::-;;;;;;;;;;;;;:::i;45045:162::-;;;;;;;;;;-1:-1:-1;45045:162:0;;;;;:::i;:::-;;:::i;69621:78::-;;;;;;;;;;;;;:::i;47541:151::-;;;;;;;;;;-1:-1:-1;47541:151:0;;;;;:::i;:::-;;:::i;45571:172::-;;;;;;;;;;-1:-1:-1;45571:172:0;;;;;:::i;:::-;;:::i;69510:99::-;;;;;;;;;;-1:-1:-1;69510:99:0;;;;;:::i;:::-;;:::i;43245:177::-;;;;;;;;;;-1:-1:-1;43245:177:0;;;;;:::i;:::-;;:::i;44864:97::-;;;;;;;;;;;;;:::i;42950:221::-;;;;;;;;;;-1:-1:-1;42950:221:0;;;;;:::i;:::-;;:::i;58348:148::-;;;;;;;;;;;;;:::i;66864:540::-;;;;;;;;;;-1:-1:-1;66864:540:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;69802:123::-;;;:::i;57697:87::-;;;;;;;;;;;;;:::i;43658:104::-;;;;;;;;;;;;;:::i;66176:37::-;;;;;;;;;;;;;:::i;46568:295::-;;;;;;;;;;-1:-1:-1;46568:295:0;;;;;:::i;:::-;;:::i;47763:285::-;;;;;;;;;;-1:-1:-1;47763:285:0;;;;;:::i;:::-;;:::i;43833:792::-;;;;;;;;;;-1:-1:-1;43833:792:0;;;;;:::i;:::-;;:::i;67418:1341::-;;;;;;;;;;;;;:::i;46934:164::-;;;;;;;;;;-1:-1:-1;46934:164:0;;;;;:::i;:::-;;:::i;66351:43::-;;;;;;;;;;;;;:::i;58651:244::-;;;;;;;;;;-1:-1:-1;58651:244:0;;;;;:::i;:::-;;:::i;68772:560::-;;;;;;:::i;:::-;;:::i;31801:150::-;-1:-1:-1;;;;;;31910:33:0;;31886:4;31910:33;;;;;;;;;;;;;31801:150;;;;:::o;43489:100::-;43543:13;43576:5;43569:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43489:100;;:::o;46275:221::-;46351:7;46379:16;46387:7;46379;:16::i;:::-;46371:73;;;;-1:-1:-1;;;46371:73:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;46464:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;46464:24:0;;46275:221::o;45805:404::-;45886:13;45902:23;45917:7;45902:14;:23::i;:::-;45886:39;;45950:5;-1:-1:-1;;;;;45944:11:0;:2;-1:-1:-1;;;;;45944:11:0;;;45936:57;;;;-1:-1:-1;;;45936:57:0;;;;;;;:::i;:::-;46030:5;-1:-1:-1;;;;;46014:21:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;46014:21:0;;:69;;;;46039:44;46063:5;46070:12;:10;:12::i;46039:44::-;46006:161;;;;-1:-1:-1;;;46006:161:0;;;;;;;:::i;:::-;46180:21;46189:2;46193:7;46180:8;:21::i;:::-;45805:404;;;:::o;69382:116::-;57928:12;:10;:12::i;:::-;-1:-1:-1;;;;;57917:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;57917:23:0;;57909:68;;;;-1:-1:-1;;;57909:68:0;;;;;;;:::i;:::-;69458:32;;::::1;::::0;:24:::1;::::0;:32:::1;::::0;::::1;::::0;::::1;:::i;:::-;;69382:116:::0;:::o;45283:211::-;45344:7;45465:21;:12;:19;:21::i;:::-;45458:28;;45283:211;:::o;66220:34::-;;;-1:-1:-1;;;66220:34:0;;;;;:::o;47165:305::-;47326:41;47345:12;:10;:12::i;:::-;47359:7;47326:18;:41::i;:::-;47318:103;;;;-1:-1:-1;;;47318:103:0;;;;;;;:::i;:::-;47434:28;47444:4;47450:2;47454:7;47434:9;:28::i;69705:79::-;57928:12;:10;:12::i;:::-;-1:-1:-1;;;;;57917:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;57917:23:0;;57909:68;;;;-1:-1:-1;;;57909:68:0;;;;;;;:::i;:::-;69754:14:::1;:22:::0;;-1:-1:-1;;;;69754:22:0::1;::::0;;69705:79::o;45045:162::-;-1:-1:-1;;;;;45169:20:0;;45142:7;45169:20;;;:13;:20;;;;;:30;;45193:5;45169:23;:30::i;:::-;45162:37;;45045:162;;;;;:::o;69621:78::-;57928:12;:10;:12::i;:::-;-1:-1:-1;;;;;57917:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;57917:23:0;;57909:68;;;;-1:-1:-1;;;57909:68:0;;;;;;;:::i;:::-;69670:14:::1;:21:::0;;-1:-1:-1;;;;69670:21:0::1;-1:-1:-1::0;;;69670:21:0::1;::::0;;69621:78::o;47541:151::-;47645:39;47662:4;47668:2;47672:7;47645:39;;;;;;;;;;;;:16;:39::i;45571:172::-;45646:7;;45688:22;:12;45704:5;45688:15;:22::i;:::-;-1:-1:-1;45666:44:0;45571:172;-1:-1:-1;;;45571:172:0:o;69510:99::-;57928:12;:10;:12::i;:::-;-1:-1:-1;;;;;57917:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;57917:23:0;;57909:68;;;;-1:-1:-1;;;57909:68:0;;;;;;;:::i;:::-;69581:20:::1;69593:7;69581:11;:20::i;:::-;69510:99:::0;:::o;43245:177::-;43317:7;43344:70;43361:7;43344:70;;;;;;;;;;;;;;;;;:12;;:70;:16;:70::i;44864:97::-;44912:13;44945:8;44938:15;;;;;:::i;42950:221::-;43022:7;-1:-1:-1;;;;;43050:19:0;;43042:74;;;;-1:-1:-1;;;43042:74:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;43134:20:0;;;;;;:13;:20;;;;;:29;;:27;:29::i;58348:148::-;57928:12;:10;:12::i;:::-;-1:-1:-1;;;;;57917:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;57917:23:0;;57909:68;;;;-1:-1:-1;;;57909:68:0;;;;;;;:::i;:::-;58439:6:::1;::::0;58418:40:::1;::::0;58455:1:::1;::::0;-1:-1:-1;;;;;58439:6:0::1;::::0;58418:40:::1;::::0;58455:1;;58418:40:::1;58469:6;:19:::0;;-1:-1:-1;;;;;;58469:19:0::1;::::0;;58348:148::o;66864:540::-;66925:16;66955:18;66976:17;66986:6;66976:9;:17::i;:::-;66955:38;-1:-1:-1;67008:15:0;67004:393;;-1:-1:-1;;67085:16:0;;;67099:1;67085:16;;;;;;;;67078:23;;67004:393;67134:23;67174:10;67160:25;;;;;;-1:-1:-1;;;67160:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;67160:25:0;;67134:51;;67200:13;67228:130;67252:10;67244:5;:18;67228:130;;;67308:34;67328:6;67336:5;67308:19;:34::i;:::-;67292:6;67299:5;67292:13;;;;;;-1:-1:-1;;;67292:13:0;;;;;;;;;;;;;;;;;;:50;67264:7;;;;:::i;:::-;;;;67228:130;;;-1:-1:-1;67379:6:0;-1:-1:-1;67372:13:0;;-1:-1:-1;67372:13:0;67004:393;66864:540;;;;:::o;69802:123::-;57928:12;:10;:12::i;:::-;-1:-1:-1;;;;;57917:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;57917:23:0;;57909:68;;;;-1:-1:-1;;;57909:68:0;;;;;;;:::i;:::-;69869:47:::1;::::0;69877:10:::1;::::0;69894:21:::1;69869:47:::0;::::1;;;::::0;::::1;::::0;;;69894:21;69877:10;69869:47;::::1;;;;;;69861:56;;;::::0;::::1;;69802:123::o:0;57697:87::-;57770:6;;-1:-1:-1;;;;;57770:6:0;57697:87;:::o;43658:104::-;43714:13;43747:7;43740:14;;;;;:::i;66176:37::-;66209:4;66176:37;:::o;46568:295::-;46683:12;:10;:12::i;:::-;-1:-1:-1;;;;;46671:24:0;:8;-1:-1:-1;;;;;46671:24:0;;;46663:62;;;;-1:-1:-1;;;46663:62:0;;;;;;;:::i;:::-;46783:8;46738:18;:32;46757:12;:10;:12::i;:::-;-1:-1:-1;;;;;46738:32:0;;;;;;;;;;;;;;;;;-1:-1:-1;46738:32:0;;;:42;;;;;;;;;;;;:53;;-1:-1:-1;;46738:53:0;;;;;;;;;;;46822:12;:10;:12::i;:::-;-1:-1:-1;;;;;46807:48:0;;46846:8;46807:48;;;;;;:::i;:::-;;;;;;;;46568:295;;:::o;47763:285::-;47895:41;47914:12;:10;:12::i;:::-;47928:7;47895:18;:41::i;:::-;47887:103;;;;-1:-1:-1;;;47887:103:0;;;;;;;:::i;:::-;48001:39;48015:4;48021:2;48025:7;48034:5;48001:13;:39::i;:::-;47763:285;;;;:::o;43833:792::-;43906:13;43940:16;43948:7;43940;:16::i;:::-;43932:76;;;;-1:-1:-1;;;43932:76:0;;;;;;;:::i;:::-;44021:23;44047:19;;;:10;:19;;;;;44021:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44077:18;44098:9;:7;:9::i;:::-;44077:30;;44189:4;44183:18;44205:1;44183:23;44179:72;;;-1:-1:-1;44230:9:0;-1:-1:-1;44223:16:0;;44179:72;44355:23;;:27;44351:108;;44430:4;44436:9;44413:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;44399:48;;;;;;44351:108;44591:4;44597:18;:7;:16;:18::i;:::-;44574:42;;;;;;;;;:::i;:::-;;;;;;;;;;;;;44560:57;;;;43833:792;;;:::o;67418:1341::-;67493:14;;67465:7;;-1:-1:-1;;;67493:14:0;;;;:22;;67511:4;67493:22;67485:54;;;;-1:-1:-1;;;67485:54:0;;;;;;;:::i;:::-;66209:4;67558:13;:11;:13::i;:::-;:25;67550:60;;;;-1:-1:-1;;;67550:60:0;;;;;;;:::i;:::-;67623:18;67644:13;:11;:13::i;:::-;67623:34;;67672:13;67689:4;67672:21;67668:1084;;;67717:20;67710:27;;;;;67668:1084;67776:4;67759:13;:21;67755:997;;67804:19;67797:26;;;;;67755:997;67862:4;67845:13;:21;67841:911;;67890:19;67883:26;;;;;67841:911;67948:4;67931:13;:21;67927:825;;67976:19;67969:26;;;;;67927:825;68034:4;68017:13;:21;68013:739;;68062:19;68055:26;;;;;68013:739;68120:4;68103:13;:21;68099:653;;68148:18;68141:25;;;;;68099:653;68205:4;68188:13;:21;68184:568;;68233:18;68226:25;;;;;68184:568;68290:4;68273:13;:21;68269:483;;68318:18;68311:25;;;;;68269:483;68375:4;68358:13;:21;68354:398;;68403:18;68396:25;;;;;68354:398;68460:4;68443:13;:21;68439:313;;68488:18;68481:25;;;;;68439:313;68553:3;68536:13;:20;68532:220;;68580:18;68573:25;;;;;68532:220;68637:3;68620:13;:20;68616:136;;68664:18;68657:25;;;;;68616:136;68723:17;68716:24;;;;;68616:136;67418:1341;;:::o;46934:164::-;-1:-1:-1;;;;;47055:25:0;;;47031:4;47055:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;46934:164::o;66351:43::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;58651:244::-;57928:12;:10;:12::i;:::-;-1:-1:-1;;;;;57917:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;57917:23:0;;57909:68;;;;-1:-1:-1;;;57909:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;58740:22:0;::::1;58732:73;;;;-1:-1:-1::0;;;58732:73:0::1;;;;;;;:::i;:::-;58842:6;::::0;58821:38:::1;::::0;-1:-1:-1;;;;;58821:38:0;;::::1;::::0;58842:6:::1;::::0;58821:38:::1;::::0;58842:6:::1;::::0;58821:38:::1;58870:6;:17:::0;;-1:-1:-1;;;;;;58870:17:0::1;-1:-1:-1::0;;;;;58870:17:0;;;::::1;::::0;;;::::1;::::0;;58651:244::o;68772:560::-;66209:4;68842:13;:11;:13::i;:::-;:25;68834:60;;;;-1:-1:-1;;;68834:60:0;;;;;;;:::i;:::-;68924:1;68913:8;:12;:29;;;;;68941:1;68929:8;:13;;68913:29;68905:82;;;;-1:-1:-1;;;68905:82:0;;;;;;;:::i;:::-;66209:4;69006:27;69024:8;69006:13;:11;:13::i;:::-;:17;;:27::i;:::-;:40;;68998:70;;;;-1:-1:-1;;;68998:70:0;;;;;;;:::i;:::-;69100:30;69121:8;69100:16;:14;:16::i;:::-;:20;;:30::i;:::-;69087:9;:43;;69079:91;;;;-1:-1:-1;;;69079:91:0;;;;;;;:::i;:::-;69188:6;69183:140;69204:8;69200:1;:12;69183:140;;;69234:14;69251:13;:11;:13::i;:::-;69234:30;;69279:32;69289:10;69301:9;69279;:32::i;:::-;-1:-1:-1;69214:3:0;;;;:::i;:::-;;;;69183:140;;20612:131;20679:4;20703:32;20708:3;20728:5;20703:4;:32::i;9442:185::-;9531:4;9555:64;9560:3;9580;-1:-1:-1;;;;;9594:23:0;;9555:4;:64::i;:::-;9548:71;;9442:185;;;;;;:::o;22784:422::-;23151:20;23190:8;;;22784:422::o;10019:151::-;10103:4;10127:35;10137:3;10157;10127:9;:35::i;49515:127::-;49580:4;49604:30;:12;49626:7;49604:21;:30::i;40732:98::-;40812:10;40732:98;:::o;55661:183::-;55727:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;55727:29:0;-1:-1:-1;;;;;55727:29:0;;;;;;;;:24;;55781:23;55727:24;55781:14;:23::i;:::-;-1:-1:-1;;;;;55772:46:0;;;;;;;;;;;55661:183;;:::o;10258:123::-;10327:7;10354:19;10362:3;10354:7;:19::i;49809:355::-;49902:4;49927:16;49935:7;49927;:16::i;:::-;49919:73;;;;-1:-1:-1;;;49919:73:0;;;;;;;:::i;:::-;50003:13;50019:23;50034:7;50019:14;:23::i;:::-;50003:39;;50072:5;-1:-1:-1;;;;;50061:16:0;:7;-1:-1:-1;;;;;50061:16:0;;:51;;;;50105:7;-1:-1:-1;;;;;50081:31:0;:20;50093:7;50081:11;:20::i;:::-;-1:-1:-1;;;;;50081:31:0;;50061:51;:94;;;;50116:39;50140:5;50147:7;50116:23;:39::i;:::-;50053:103;49809:355;-1:-1:-1;;;;49809:355:0:o;52945:599::-;53070:4;-1:-1:-1;;;;;53043:31:0;:23;53058:7;53043:14;:23::i;:::-;-1:-1:-1;;;;;53043:31:0;;53035:85;;;;-1:-1:-1;;;53035:85:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;53157:16:0;;53149:65;;;;-1:-1:-1;;;53149:65:0;;;;;;;:::i;:::-;53227:39;53248:4;53254:2;53258:7;53227:20;:39::i;:::-;53331:29;53348:1;53352:7;53331:8;:29::i;:::-;-1:-1:-1;;;;;53373:19:0;;;;;;:13;:19;;;;;:35;;53400:7;53373:26;:35::i;:::-;-1:-1:-1;;;;;;53419:17:0;;;;;;:13;:17;;;;;:30;;53441:7;53419:21;:30::i;:::-;-1:-1:-1;53462:29:0;:12;53479:7;53488:2;53462:16;:29::i;:::-;;53528:7;53524:2;-1:-1:-1;;;;;53509:27:0;53518:4;-1:-1:-1;;;;;53509:27:0;;;;;;;;;;;52945:599;;;:::o;21832:137::-;21903:7;21938:22;21942:3;21954:5;21938:3;:22::i;10720:236::-;10800:7;;;;10860:22;10864:3;10876:5;10860:3;:22::i;:::-;10829:53;;;;-1:-1:-1;10720:236:0;-1:-1:-1;;;;;10720:236:0:o;54145:100::-;54218:19;;;;:8;;:19;;;;;:::i;12006:213::-;12113:7;12164:44;12169:3;12189;12195:12;12164:4;:44::i;48930:272::-;49044:28;49054:4;49060:2;49064:7;49044:9;:28::i;:::-;49091:48;49114:4;49120:2;49124:7;49133:5;49091:22;:48::i;:::-;49083:111;;;;-1:-1:-1;;;49083:111:0;;;;;;;:::i;402:723::-;458:13;679:10;675:53;;-1:-1:-1;706:10:0;;;;;;;;;;;;-1:-1:-1;;;706:10:0;;;;;;675:53;753:5;738:12;794:78;801:9;;794:78;;827:8;;;;:::i;:::-;;-1:-1:-1;850:10:0;;-1:-1:-1;858:2:0;850:10;;:::i;:::-;;;794:78;;;882:19;914:6;904:17;;;;;;-1:-1:-1;;;904:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;904:17:0;;882:39;;932:154;939:10;;932:154;;966:11;976:1;966:11;;:::i;:::-;;-1:-1:-1;1035:10:0;1043:2;1035:5;:10;:::i;:::-;1022:24;;:2;:24;:::i;:::-;1009:39;;992:6;999;992:14;;;;;;-1:-1:-1;;;992:14:0;;;;;;;;;;;;:56;-1:-1:-1;;;;;992:56:0;;;;;;;;-1:-1:-1;1063:11:0;1072:2;1063:11;;:::i;:::-;;;932:154;;61737:98;61795:7;61822:5;61826:1;61822;:5;:::i;62475:98::-;62533:7;62560:5;62564:1;62560;:5;:::i;50507:110::-;50583:26;50593:2;50597:7;50583:26;;;;;;;;;;;;:9;:26::i;13982:414::-;14045:4;14067:21;14077:3;14082:5;14067:9;:21::i;:::-;14062:327;;-1:-1:-1;14105:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;14288:18;;14266:19;;;:12;;;:19;;;;;;:40;;;;14321:11;;14062:327;-1:-1:-1;14372:5:0;14365:12;;4117:692;4193:4;4328:17;;;:12;;;:17;;;;;;4362:13;4358:444;;-1:-1:-1;;4447:38:0;;;;;;;;;;;;;;;;;;4429:57;;;;;;;;:12;:57;;;;;;;;;;;;;;;;;;;;;;;;4644:19;;4624:17;;;:12;;;:17;;;;;;;:39;4678:11;;4358:444;4758:5;4722:3;4735:12;4746:1;4735:8;:12;:::i;:::-;4722:26;;;;;;-1:-1:-1;;;4722:26:0;;;;;;;;;;;;;;;;;;;:33;;:41;;;;4785:5;4778:12;;;;;6617:125;6688:4;6712:17;;;:12;;;;;:17;;;;;;:22;;;6617:125::o;6837:110::-;6920:19;;6837:110::o;20919:137::-;20989:4;21013:35;21021:3;21041:5;21013:7;:35::i;16870:204::-;16965:18;;16937:7;;16965:26;-1:-1:-1;16957:73:0;;;;-1:-1:-1;;;16957:73:0;;;;;;;:::i;:::-;17048:3;:11;;17060:5;17048:18;;;;;;-1:-1:-1;;;17048:18:0;;;;;;;;;;;;;;;;;17041:25;;16870:204;;;;:::o;7302:279::-;7406:19;;7369:7;;;;7406:27;-1:-1:-1;7398:74:0;;;;-1:-1:-1;;;7398:74:0;;;;;;;:::i;:::-;7485:22;7510:3;:12;;7523:5;7510:19;;;;;;-1:-1:-1;;;7510:19:0;;;;;;;;;;;;;;;;;;;7485:44;;7548:5;:10;;;7560:5;:12;;;7540:33;;;;;7302:279;;;;;:::o;8799:319::-;8893:7;8932:17;;;:12;;;:17;;;;;;8983:12;8968:13;8960:36;;;;-1:-1:-1;;;8960:36:0;;;;;;;;:::i;:::-;-1:-1:-1;9050:3:0;9063:12;9074:1;9063:8;:12;:::i;:::-;9050:26;;;;;;-1:-1:-1;;;9050:26:0;;;;;;;;;;;;;;;;;;;:33;;;9043:40;;;8799:319;;;;;:::o;54810:843::-;54931:4;54957:15;:2;-1:-1:-1;;;;;54957:13:0;;:15::i;:::-;54953:693;;;55009:2;-1:-1:-1;;;;;54993:36:0;;55030:12;:10;:12::i;:::-;55044:4;55050:7;55059:5;54993:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54993:72:0;;;;;;;;-1:-1:-1;;54993:72:0;;;;;;;;;;;;:::i;:::-;;;54989:602;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55239:13:0;;55235:341;;55282:60;;-1:-1:-1;;;55282:60:0;;;;;;;:::i;55235:341::-;55526:6;55520:13;55511:6;55507:2;55503:15;55496:38;54989:602;-1:-1:-1;;;;;;55116:55:0;-1:-1:-1;;;55116:55:0;;-1:-1:-1;55109:62:0;;54953:693;-1:-1:-1;55630:4:0;54810:843;;;;;;:::o;50844:250::-;50940:18;50946:2;50950:7;50940:5;:18::i;:::-;50977:54;51008:1;51012:2;51016:7;51025:5;50977:22;:54::i;:::-;50969:117;;;;-1:-1:-1;;;50969:117:0;;;;;;;:::i;14572:1544::-;14638:4;14777:19;;;:12;;;:19;;;;;;14813:15;;14809:1300;;15175:21;15199:14;15212:1;15199:10;:14;:::i;:::-;15248:18;;15175:38;;-1:-1:-1;15228:17:0;;15248:22;;15269:1;;15248:22;:::i;:::-;15228:42;;15515:17;15535:3;:11;;15547:9;15535:22;;;;;;-1:-1:-1;;;15535:22:0;;;;;;;;;;;;;;;;;15515:42;;15681:9;15652:3;:11;;15664:13;15652:26;;;;;;-1:-1:-1;;;15652:26:0;;;;;;;;;;;;;;;;;;:38;15784:17;:13;15800:1;15784:17;:::i;:::-;15758:23;;;;:12;;;:23;;;;;:43;15910:17;;15758:3;;15910:17;;;-1:-1:-1;;;15910:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;16005:3;:12;;:19;16018:5;16005:19;;;;;;;;;;;15998:26;;;16048:4;16041:11;;;;;;;;14809:1300;16092:5;16085:12;;;;;51430:404;-1:-1:-1;;;;;51510:16:0;;51502:61;;;;-1:-1:-1;;;51502:61:0;;;;;;;:::i;:::-;51583:16;51591:7;51583;:16::i;:::-;51582:17;51574:58;;;;-1:-1:-1;;;51574:58:0;;;;;;;:::i;:::-;51645:45;51674:1;51678:2;51682:7;51645:20;:45::i;:::-;-1:-1:-1;;;;;51703:17:0;;;;;;:13;:17;;;;;:30;;51725:7;51703:21;:30::i;:::-;-1:-1:-1;51746:29:0;:12;51763:7;51772:2;51746:16;:29::i;:::-;-1:-1:-1;51793:33:0;;51818:7;;-1:-1:-1;;;;;51793:33:0;;;51810:1;;51793:33;;51810:1;;51793:33;51430:404;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:633:1;;110:18;151:2;143:6;140:14;137:2;;;157:18;;:::i;:::-;232:2;226:9;200:2;286:15;;-1:-1:-1;;282:24:1;;;308:2;278:33;274:42;262:55;;;332:18;;;352:22;;;329:46;326:2;;;378:18;;:::i;:::-;418:10;414:2;407:22;447:6;438:15;;477:6;469;462:22;517:3;508:6;503:3;499:16;496:25;493:2;;;534:1;531;524:12;493:2;584:6;579:3;572:4;564:6;560:17;547:44;639:1;632:4;623:6;615;611:19;607:30;600:41;;;;90:557;;;;;:::o;652:175::-;722:20;;-1:-1:-1;;;;;771:31:1;;761:42;;751:2;;817:1;814;807:12;832:198;;944:2;932:9;923:7;919:23;915:32;912:2;;;965:6;957;950:22;912:2;993:31;1014:9;993:31;:::i;1035:274::-;;;1164:2;1152:9;1143:7;1139:23;1135:32;1132:2;;;1185:6;1177;1170:22;1132:2;1213:31;1234:9;1213:31;:::i;:::-;1203:41;;1263:40;1299:2;1288:9;1284:18;1263:40;:::i;:::-;1253:50;;1122:187;;;;;:::o;1314:342::-;;;;1460:2;1448:9;1439:7;1435:23;1431:32;1428:2;;;1481:6;1473;1466:22;1428:2;1509:31;1530:9;1509:31;:::i;:::-;1499:41;;1559:40;1595:2;1584:9;1580:18;1559:40;:::i;:::-;1549:50;;1646:2;1635:9;1631:18;1618:32;1608:42;;1418:238;;;;;:::o;1661:702::-;;;;;1833:3;1821:9;1812:7;1808:23;1804:33;1801:2;;;1855:6;1847;1840:22;1801:2;1883:31;1904:9;1883:31;:::i;:::-;1873:41;;1933:40;1969:2;1958:9;1954:18;1933:40;:::i;:::-;1923:50;;2020:2;2009:9;2005:18;1992:32;1982:42;;2075:2;2064:9;2060:18;2047:32;2102:18;2094:6;2091:30;2088:2;;;2139:6;2131;2124:22;2088:2;2167:22;;2220:4;2212:13;;2208:27;-1:-1:-1;2198:2:1;;2254:6;2246;2239:22;2198:2;2282:75;2349:7;2344:2;2331:16;2326:2;2322;2318:11;2282:75;:::i;:::-;2272:85;;;1791:572;;;;;;;:::o;2368:369::-;;;2494:2;2482:9;2473:7;2469:23;2465:32;2462:2;;;2515:6;2507;2500:22;2462:2;2543:31;2564:9;2543:31;:::i;:::-;2533:41;;2624:2;2613:9;2609:18;2596:32;2671:5;2664:13;2657:21;2650:5;2647:32;2637:2;;2698:6;2690;2683:22;2637:2;2726:5;2716:15;;;2452:285;;;;;:::o;2742:266::-;;;2871:2;2859:9;2850:7;2846:23;2842:32;2839:2;;;2892:6;2884;2877:22;2839:2;2920:31;2941:9;2920:31;:::i;:::-;2910:41;2998:2;2983:18;;;;2970:32;;-1:-1:-1;;;2829:179:1:o;3013:257::-;;3124:2;3112:9;3103:7;3099:23;3095:32;3092:2;;;3145:6;3137;3130:22;3092:2;3189:9;3176:23;3208:32;3234:5;3208:32;:::i;3275:261::-;;3397:2;3385:9;3376:7;3372:23;3368:32;3365:2;;;3418:6;3410;3403:22;3365:2;3455:9;3449:16;3474:32;3500:5;3474:32;:::i;3541:482::-;;3663:2;3651:9;3642:7;3638:23;3634:32;3631:2;;;3684:6;3676;3669:22;3631:2;3729:9;3716:23;3762:18;3754:6;3751:30;3748:2;;;3799:6;3791;3784:22;3748:2;3827:22;;3880:4;3872:13;;3868:27;-1:-1:-1;3858:2:1;;3914:6;3906;3899:22;3858:2;3942:75;4009:7;4004:2;3991:16;3986:2;3982;3978:11;3942:75;:::i;4028:190::-;;4140:2;4128:9;4119:7;4115:23;4111:32;4108:2;;;4161:6;4153;4146:22;4108:2;-1:-1:-1;4189:23:1;;4098:120;-1:-1:-1;4098:120:1:o;4223:259::-;;4304:5;4298:12;4331:6;4326:3;4319:19;4347:63;4403:6;4396:4;4391:3;4387:14;4380:4;4373:5;4369:16;4347:63;:::i;:::-;4464:2;4443:15;-1:-1:-1;;4439:29:1;4430:39;;;;4471:4;4426:50;;4274:208;-1:-1:-1;;4274:208:1:o;4487:470::-;;4704:6;4698:13;4720:53;4766:6;4761:3;4754:4;4746:6;4742:17;4720:53;:::i;:::-;4836:13;;4795:16;;;;4858:57;4836:13;4795:16;4892:4;4880:17;;4858:57;:::i;:::-;4931:20;;4674:283;-1:-1:-1;;;;4674:283:1:o;4962:203::-;-1:-1:-1;;;;;5126:32:1;;;;5108:51;;5096:2;5081:18;;5063:102::o;5170:490::-;-1:-1:-1;;;;;5439:15:1;;;5421:34;;5491:15;;5486:2;5471:18;;5464:43;5538:2;5523:18;;5516:34;;;5586:3;5581:2;5566:18;;5559:31;;;5170:490;;5607:47;;5634:19;;5626:6;5607:47;:::i;:::-;5599:55;5373:287;-1:-1:-1;;;;;;5373:287:1:o;5665:635::-;5836:2;5888:21;;;5958:13;;5861:18;;;5980:22;;;5665:635;;5836:2;6059:15;;;;6033:2;6018:18;;;5665:635;6105:169;6119:6;6116:1;6113:13;6105:169;;;6180:13;;6168:26;;6249:15;;;;6214:12;;;;6141:1;6134:9;6105:169;;;-1:-1:-1;6291:3:1;;5816:484;-1:-1:-1;;;;;;5816:484:1:o;6305:187::-;6470:14;;6463:22;6445:41;;6433:2;6418:18;;6400:92::o;6497:221::-;;6646:2;6635:9;6628:21;6666:46;6708:2;6697:9;6693:18;6685:6;6666:46;:::i;6723:398::-;6925:2;6907:21;;;6964:2;6944:18;;;6937:30;7003:34;6998:2;6983:18;;6976:62;-1:-1:-1;;;7069:2:1;7054:18;;7047:32;7111:3;7096:19;;6897:224::o;7126:414::-;7328:2;7310:21;;;7367:2;7347:18;;;7340:30;7406:34;7401:2;7386:18;;7379:62;-1:-1:-1;;;7472:2:1;7457:18;;7450:48;7530:3;7515:19;;7300:240::o;7545:402::-;7747:2;7729:21;;;7786:2;7766:18;;;7759:30;7825:34;7820:2;7805:18;;7798:62;-1:-1:-1;;;7891:2:1;7876:18;;7869:36;7937:3;7922:19;;7719:228::o;7952:352::-;8154:2;8136:21;;;8193:2;8173:18;;;8166:30;8232;8227:2;8212:18;;8205:58;8295:2;8280:18;;8126:178::o;8309:400::-;8511:2;8493:21;;;8550:2;8530:18;;;8523:30;8589:34;8584:2;8569:18;;8562:62;-1:-1:-1;;;8655:2:1;8640:18;;8633:34;8699:3;8684:19;;8483:226::o;8714:349::-;8916:2;8898:21;;;8955:2;8935:18;;;8928:30;8994:27;8989:2;8974:18;;8967:55;9054:2;9039:18;;8888:175::o;9068:408::-;9270:2;9252:21;;;9309:2;9289:18;;;9282:30;9348:34;9343:2;9328:18;;9321:62;-1:-1:-1;;;9414:2:1;9399:18;;9392:42;9466:3;9451:19;;9242:234::o;9481:341::-;9683:2;9665:21;;;9722:2;9702:18;;;9695:30;-1:-1:-1;;;9756:2:1;9741:18;;9734:47;9813:2;9798:18;;9655:167::o;9827:420::-;10029:2;10011:21;;;10068:2;10048:18;;;10041:30;10107:34;10102:2;10087:18;;10080:62;10178:26;10173:2;10158:18;;10151:54;10237:3;10222:19;;10001:246::o;10252:406::-;10454:2;10436:21;;;10493:2;10473:18;;;10466:30;10532:34;10527:2;10512:18;;10505:62;-1:-1:-1;;;10598:2:1;10583:18;;10576:40;10648:3;10633:19;;10426:232::o;10663:399::-;10865:2;10847:21;;;10904:2;10884:18;;;10877:30;10943:34;10938:2;10923:18;;10916:62;-1:-1:-1;;;11009:2:1;10994:18;;10987:33;11052:3;11037:19;;10837:225::o;11067:398::-;11269:2;11251:21;;;11308:2;11288:18;;;11281:30;11347:34;11342:2;11327:18;;11320:62;-1:-1:-1;;;11413:2:1;11398:18;;11391:32;11455:3;11440:19;;11241:224::o;11470:356::-;11672:2;11654:21;;;11691:18;;;11684:30;11750:34;11745:2;11730:18;;11723:62;11817:2;11802:18;;11644:182::o;11831:408::-;12033:2;12015:21;;;12072:2;12052:18;;;12045:30;12111:34;12106:2;12091:18;;12084:62;-1:-1:-1;;;12177:2:1;12162:18;;12155:42;12229:3;12214:19;;12005:234::o;12244:356::-;12446:2;12428:21;;;12465:18;;;12458:30;12524:34;12519:2;12504:18;;12497:62;12591:2;12576:18;;12418:182::o;12605:405::-;12807:2;12789:21;;;12846:2;12826:18;;;12819:30;12885:34;12880:2;12865:18;;12858:62;-1:-1:-1;;;12951:2:1;12936:18;;12929:39;13000:3;12985:19;;12779:231::o;13015:411::-;13217:2;13199:21;;;13256:2;13236:18;;;13229:30;13295:34;13290:2;13275:18;;13268:62;-1:-1:-1;;;13361:2:1;13346:18;;13339:45;13416:3;13401:19;;13189:237::o;13431:404::-;13633:2;13615:21;;;13672:2;13652:18;;;13645:30;13711:34;13706:2;13691:18;;13684:62;-1:-1:-1;;;13777:2:1;13762:18;;13755:38;13825:3;13810:19;;13605:230::o;13840:397::-;14042:2;14024:21;;;14081:2;14061:18;;;14054:30;14120:34;14115:2;14100:18;;14093:62;-1:-1:-1;;;14186:2:1;14171:18;;14164:31;14227:3;14212:19;;14014:223::o;14242:346::-;14444:2;14426:21;;;14483:2;14463:18;;;14456:30;-1:-1:-1;;;14517:2:1;14502:18;;14495:52;14579:2;14564:18;;14416:172::o;14593:413::-;14795:2;14777:21;;;14834:2;14814:18;;;14807:30;14873:34;14868:2;14853:18;;14846:62;-1:-1:-1;;;14939:2:1;14924:18;;14917:47;14996:3;14981:19;;14767:239::o;15011:343::-;15213:2;15195:21;;;15252:2;15232:18;;;15225:30;-1:-1:-1;;;15286:2:1;15271:18;;15264:49;15345:2;15330:18;;15185:169::o;15359:177::-;15505:25;;;15493:2;15478:18;;15460:76::o;15541:128::-;;15612:1;15608:6;15605:1;15602:13;15599:2;;;15618:18;;:::i;:::-;-1:-1:-1;15654:9:1;;15589:80::o;15674:120::-;;15740:1;15730:2;;15745:18;;:::i;:::-;-1:-1:-1;15779:9:1;;15720:74::o;15799:168::-;;15905:1;15901;15897:6;15893:14;15890:1;15887:21;15882:1;15875:9;15868:17;15864:45;15861:2;;;15912:18;;:::i;:::-;-1:-1:-1;15952:9:1;;15851:116::o;15972:125::-;;16040:1;16037;16034:8;16031:2;;;16045:18;;:::i;:::-;-1:-1:-1;16082:9:1;;16021:76::o;16102:258::-;16174:1;16184:113;16198:6;16195:1;16192:13;16184:113;;;16274:11;;;16268:18;16255:11;;;16248:39;16220:2;16213:10;16184:113;;;16315:6;16312:1;16309:13;16306:2;;;-1:-1:-1;;16350:1:1;16332:16;;16325:27;16155:205::o;16365:380::-;16450:1;16440:12;;16497:1;16487:12;;;16508:2;;16562:4;16554:6;16550:17;16540:27;;16508:2;16615;16607:6;16604:14;16584:18;16581:38;16578:2;;;16661:10;16656:3;16652:20;16649:1;16642:31;16696:4;16693:1;16686:15;16724:4;16721:1;16714:15;16750:135;;-1:-1:-1;;16810:17:1;;16807:2;;;16830:18;;:::i;:::-;-1:-1:-1;16877:1:1;16866:13;;16797:88::o;16890:112::-;;16948:1;16938:2;;16953:18;;:::i;:::-;-1:-1:-1;16987:9:1;;16928:74::o;17007:127::-;17068:10;17063:3;17059:20;17056:1;17049:31;17099:4;17096:1;17089:15;17123:4;17120:1;17113:15;17139:127;17200:10;17195:3;17191:20;17188:1;17181:31;17231:4;17228:1;17221:15;17255:4;17252:1;17245:15;17271:127;17332:10;17327:3;17323:20;17320:1;17313:31;17363:4;17360:1;17353:15;17387:4;17384:1;17377:15;17403:133;-1:-1:-1;;;;;;17479:32:1;;17469:43;;17459:2;;17526:1;17523;17516:12
Swarm Source
ipfs://13a3602731b5340ab1a24cf2fb5cb12a88e0e15c95dac3592cfb5d0fd0da1e95
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.