ERC-721
Overview
Max Total Supply
180 SALT
Holders
114
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 SALTLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Salt
Compiler Version
v0.6.8+commit.0bbfe453
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-07-28 */ // File: @openzeppelin/contracts/GSN/Context.sol // spd-License-Identifier: MIT pragma solidity ^0.6.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally availablea * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // spd-License-Identifier: MIT pragma solidity ^0.6.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. */ 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 () internal { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view 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: @openzeppelin/contracts/introspection/IERC165.sol // spd-License-Identifier: MIT pragma solidity ^0.6.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // spd-License-Identifier: MIT pragma solidity ^0.6.2; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 tokenId) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external; } // File: @openzeppelin/contracts/token/ERC721/IERC721Metadata.sol // spd-License-Identifier: MIT pragma solidity ^0.6.2; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/token/ERC721/IERC721Enumerable.sol // spd-License-Identifier: MIT pragma solidity ^0.6.2; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // spd-License-Identifier: MIT pragma solidity ^0.6.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4); } // File: @openzeppelin/contracts/introspection/ERC165.sol // spd-License-Identifier: MIT pragma solidity ^0.6.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts may inherit from this and call {_registerInterface} to declare * their support of an interface. */ contract ERC165 is IERC165 { /* * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7 */ bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7; /** * @dev Mapping of interface ids to whether or not it's supported. */ mapping(bytes4 => bool) private _supportedInterfaces; constructor () internal { // Derived contracts need only register support for their own interfaces, // we register support for ERC165 itself here _registerInterface(_INTERFACE_ID_ERC165); } /** * @dev See {IERC165-supportsInterface}. * * Time complexity O(1), guaranteed to always use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) public view override returns (bool) { return _supportedInterfaces[interfaceId]; } /** * @dev Registers the contract as an implementer of the interface defined by * `interfaceId`. Support of the actual ERC165 interface is automatic and * registering its interface id is not required. * * See {IERC165-supportsInterface}. * * Requirements: * * - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`). */ function _registerInterface(bytes4 interfaceId) internal virtual { require(interfaceId != 0xffffffff, "ERC165: invalid interface id"); _supportedInterfaces[interfaceId] = true; } } // File: @openzeppelin/contracts/math/SafeMath.sol // spd-License-Identifier: MIT pragma solidity ^0.6.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @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) { // 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 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts 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 mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message 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, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // File: @openzeppelin/contracts/utils/Address.sol // spd-License-Identifier: MIT pragma solidity ^0.6.2; /** * @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 in 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"); return _functionCallWithValue(target, data, value, errorMessage); } function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) { require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: weiValue }(data); if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/utils/EnumerableSet.sol // spd-License-Identifier: MIT pragma solidity ^0.6.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.0.0, only sets of type `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]; } // 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(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(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(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(uint256(_at(set._inner, index))); } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } } // File: @openzeppelin/contracts/utils/EnumerableMap.sol // spd-License-Identifier: MIT pragma solidity ^0.6.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 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) { return _get(map, key, "EnumerableMap: nonexistent key"); } /** * @dev Same as {_get}, with a custom error message when `key` is not in the map. */ 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(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(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(uint256(_get(map._inner, bytes32(key)))); } /** * @dev Same as {get}, with a custom error message when `key` is not in the map. */ function get(UintToAddressMap storage map, uint256 key, string memory errorMessage) internal view returns (address) { return address(uint256(_get(map._inner, bytes32(key), errorMessage))); } } // File: @openzeppelin/contracts/utils/Strings.sol // spd-License-Identifier: MIT pragma solidity ^0.6.0; /** * @dev String operations. */ library Strings { /** * @dev Converts a `uint256` to its ASCII `string` representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); uint256 index = digits - 1; temp = value; while (temp != 0) { buffer[index--] = byte(uint8(48 + temp % 10)); temp /= 10; } return string(buffer); } } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol // spd-License-Identifier: MIT pragma solidity ^0.6.0; /** * @title ERC721 Non-Fungible Token Standard basic implementation * @dev see https://eips.ethereum.org/EIPS/eip-721 */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable { using SafeMath for uint256; using Address for address; using EnumerableSet for EnumerableSet.UintSet; using EnumerableMap for EnumerableMap.UintToAddressMap; using Strings for uint256; // Equals to `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))` // which can be also obtained as `IERC721Receiver(0).onERC721Received.selector` bytes4 private constant _ERC721_RECEIVED = 0x150b7a02; // Mapping from holder address to their (enumerable) set of owned tokens mapping (address => EnumerableSet.UintSet) private _holderTokens; // Enumerable mapping from token ids to their owners EnumerableMap.UintToAddressMap private _tokenOwners; // Mapping from token ID to approved address mapping (uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping (address => mapping (address => bool)) private _operatorApprovals; // Token name string private _name; // Token symbol string private _symbol; // Optional mapping for token URIs mapping (uint256 => string) private _tokenURIs; // Base URI string private _baseURI; /* * bytes4(keccak256('balanceOf(address)')) == 0x70a08231 * bytes4(keccak256('ownerOf(uint256)')) == 0x6352211e * bytes4(keccak256('approve(address,uint256)')) == 0x095ea7b3 * bytes4(keccak256('getApproved(uint256)')) == 0x081812fc * bytes4(keccak256('setApprovalForAll(address,bool)')) == 0xa22cb465 * bytes4(keccak256('isApprovedForAll(address,address)')) == 0xe985e9c5 * bytes4(keccak256('transferFrom(address,address,uint256)')) == 0x23b872dd * bytes4(keccak256('safeTransferFrom(address,address,uint256)')) == 0x42842e0e * bytes4(keccak256('safeTransferFrom(address,address,uint256,bytes)')) == 0xb88d4fde * * => 0x70a08231 ^ 0x6352211e ^ 0x095ea7b3 ^ 0x081812fc ^ * 0xa22cb465 ^ 0xe985e9c5 ^ 0x23b872dd ^ 0x42842e0e ^ 0xb88d4fde == 0x80ac58cd */ bytes4 private constant _INTERFACE_ID_ERC721 = 0x80ac58cd; /* * bytes4(keccak256('name()')) == 0x06fdde03 * bytes4(keccak256('symbol()')) == 0x95d89b41 * bytes4(keccak256('tokenURI(uint256)')) == 0xc87b56dd * * => 0x06fdde03 ^ 0x95d89b41 ^ 0xc87b56dd == 0x5b5e139f */ bytes4 private constant _INTERFACE_ID_ERC721_METADATA = 0x5b5e139f; /* * bytes4(keccak256('totalSupply()')) == 0x18160ddd * bytes4(keccak256('tokenOfOwnerByIndex(address,uint256)')) == 0x2f745c59 * bytes4(keccak256('tokenByIndex(uint256)')) == 0x4f6ccce7 * * => 0x18160ddd ^ 0x2f745c59 ^ 0x4f6ccce7 == 0x780e9d63 */ bytes4 private constant _INTERFACE_ID_ERC721_ENUMERABLE = 0x780e9d63; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor (string memory name, string memory symbol) public { _name = name; _symbol = symbol; // register the supported interfaces to conform to ERC721 via ERC165 _registerInterface(_INTERFACE_ID_ERC721); _registerInterface(_INTERFACE_ID_ERC721_METADATA); _registerInterface(_INTERFACE_ID_ERC721_ENUMERABLE); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view 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 override returns (address) { return _tokenOwners.get(tokenId, "ERC721: owner query for nonexistent token"); } /** * @dev See {IERC721Metadata-name}. */ function name() public view override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view 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]; // If there is no base URI, return the token URI. if (bytes(_baseURI).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(_baseURI, _tokenURI)); } // If there is a baseURI but no tokenURI, concatenate the tokenID to the baseURI. return string(abi.encodePacked(_baseURI, 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 returns (string memory) { return _baseURI; } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) { return _holderTokens[owner].at(index); } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view 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 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 = ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require(_msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view 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 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 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 returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || 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 = ownerOf(tokenId); _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(ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _holderTokens[from].remove(tokenId); _holderTokens[to].add(tokenId); _tokenOwners.set(tokenId, to); emit Transfer(from, to, tokenId); } /** * @dev Sets `_tokenURI` as the tokenURI of `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual { require(_exists(tokenId), "ERC721Metadata: URI set of nonexistent token"); _tokenURIs[tokenId] = _tokenURI; } /** * @dev Internal function to set the base URI for all token IDs. It is * automatically added as a prefix to the value returned in {tokenURI}, * or to the token ID if {tokenURI} is empty. */ function _setBaseURI(string memory baseURI_) internal virtual { _baseURI = baseURI_; } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory _data) private returns (bool) { if (!to.isContract()) { return true; } bytes memory returndata = to.functionCall(abi.encodeWithSelector( IERC721Receiver(to).onERC721Received.selector, _msgSender(), from, tokenId, _data ), "ERC721: transfer to non ERC721Receiver implementer"); bytes4 retval = abi.decode(returndata, (bytes4)); return (retval == _ERC721_RECEIVED); } function _approve(address to, uint256 tokenId) private { _tokenApprovals[tokenId] = to; emit Approval(ownerOf(tokenId), to, tokenId); } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual { } } // File: @openzeppelin/contracts/token/ERC721/ERC721Burnable.sol // spd-License-Identifier: MIT pragma solidity ^0.6.0; /** * @title ERC721 Burnable Token * @dev ERC721 Token that can be irreversibly burned (destroyed). */ abstract contract ERC721Burnable is Context, ERC721 { /** * @dev Burns `tokenId`. See {ERC721-_burn}. * * Requirements: * * - The caller must own `tokenId` or be an approved operator. */ function burn(uint256 tokenId) public virtual { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721Burnable: caller is not owner nor approved"); _burn(tokenId); } } // File: contracts/ITokenURI.sol // spd-License-Identifier: AGPL-3.0-or-later pragma solidity ^0.6.8; interface ITokenURI { function tokenURI(uint256 id) external view returns (string memory); } // File: contracts/Salt.sol // spd-License-Identifier: AGPL-3.0-or-later pragma solidity ^0.6.8; pragma experimental ABIEncoderV2; contract Salt is ERC721Burnable, Ownable { ITokenURI public uri; // The initial timestamp (in seconds) to start rotation uint256 public startDate; constructor() public ERC721("SALT", "SALT") { _setBaseURI("https://arweave.net/"); } function tokenURI(uint256 id) public view override returns (string memory) { return uri.tokenURI(id); } function rawURI(uint256 tokenId) public view returns (string memory) { return super.tokenURI(tokenId); } function mint(string[] calldata uris) external onlyOwner { for (uint256 i = 0; i < uris.length; i++) { uint256 id = totalSupply(); _mint(msg.sender, id); _setTokenURI(id, uris[i]); } } function setTokenURI(uint256 id, string memory newUri) public onlyOwner { _setTokenURI(id, newUri); } function setBaseURI(string memory base) public onlyOwner { _setBaseURI(base); } function setStartDate(uint256 d) public onlyOwner { startDate = d; } function updateURI(address a) public onlyOwner { uri = ITokenURI(a); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string[]","name":"uris","type":"string[]"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"rawURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"base","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"d","type":"uint256"}],"name":"setStartDate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"string","name":"newUri","type":"string"}],"name":"setTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"id","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"a","type":"address"}],"name":"updateURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uri","outputs":[{"internalType":"contract ITokenURI","name":"","type":"address"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060408051808201825260048082526314d0531560e21b6020808401829052845180860190955291845290830152906200005b6301ffc9a760e01b6001600160e01b036200018c16565b81516200007090600690602085019062000205565b5080516200008690600790602084019062000205565b50620000a26380ac58cd60e01b6001600160e01b036200018c16565b620000bd635b5e139f60e01b6001600160e01b036200018c16565b620000d863780e9d6360e01b6001600160e01b036200018c16565b5060009050620000f06001600160e01b03620001e716565b600a80546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35060408051808201909152601481527f68747470733a2f2f617277656176652e6e65742f000000000000000000000000602082015262000186906001600160e01b03620001ec16565b620002de565b6001600160e01b03198082161415620001c25760405162461bcd60e51b8152600401620001b990620002a7565b60405180910390fd5b6001600160e01b0319166000908152602081905260409020805460ff19166001179055565b335b90565b80516200020190600990602084019062000205565b5050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200024857805160ff191683800117855562000278565b8280016001018555821562000278579182015b82811115620002785782518255916020019190600101906200025b565b50620002869291506200028a565b5090565b620001e991905b8082111562000286576000815560010162000291565b6020808252601c908201527f4552433136353a20696e76616c696420696e7465726661636520696400000000604082015260600190565b61256a80620002ee6000396000f3fe608060405234801561001057600080fd5b50600436106101cf5760003560e01c80636352211e116101045780639bd1972e116100a2578063c87b56dd11610071578063c87b56dd146103a1578063e985e9c5146103b4578063eac989f8146103c7578063f2fde38b146103cf576101cf565b80639bd1972e14610355578063a22cb46514610368578063b88d4fde1461037b578063bd62fd1f1461038e576101cf565b8063715018a6116100de578063715018a61461032a57806382d95df5146103325780638da5cb5b1461034557806395d89b411461034d576101cf565b80636352211e146102fc5780636c0360eb1461030f57806370a0823114610317576101cf565b806323b872dd1161017157806342966c681161014b57806342966c68146102b05780634f6ccce7146102c357806355f804b3146102d65780635768f271146102e9576101cf565b806323b872dd146102775780632f745c591461028a57806342842e0e1461029d576101cf565b8063095ea7b3116101ad578063095ea7b3146102325780630b97bc8614610247578063162094c41461025c57806318160ddd1461026f576101cf565b806301ffc9a7146101d457806306fdde03146101fd578063081812fc14610212575b600080fd5b6101e76101e2366004611bfd565b6103e2565b6040516101f49190611e55565b60405180910390f35b610205610405565b6040516101f49190611e60565b610225610220366004611cde565b61049c565b6040516101f49190611e04565b610245610240366004611b67565b6104e8565b005b61024f610580565b6040516101f491906123e7565b61024561026a366004611cf6565b610586565b61024f6105c9565b610245610285366004611a84565b6105da565b61024f610298366004611b67565b610612565b6102456102ab366004611a84565b610643565b6102456102be366004611cde565b61065e565b61024f6102d1366004611cde565b610691565b6102456102e4366004611c35565b6106ad565b6102456102f7366004611b91565b6106eb565b61022561030a366004611cde565b6107a6565b6102056107d4565b61024f610325366004611a35565b610835565b61024561087e565b610245610340366004611cde565b6108fd565b610225610937565b610205610946565b610205610363366004611cde565b6109a7565b610245610376366004611b2c565b6109b2565b610245610389366004611ac4565b610a80565b61024561039c366004611a35565b610abf565b6102056103af366004611cde565b610b16565b6101e76103c2366004611a50565b610b9b565b610225610bc9565b6102456103dd366004611a35565b610bd8565b6001600160e01b0319811660009081526020819052604090205460ff165b919050565b60068054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156104915780601f1061046657610100808354040283529160200191610491565b820191906000526020600020905b81548152906001019060200180831161047457829003601f168201915b505050505090505b90565b60006104a782610c8f565b6104cc5760405162461bcd60e51b81526004016104c390612169565b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006104f3826107a6565b9050806001600160a01b0316836001600160a01b031614156105275760405162461bcd60e51b81526004016104c3906122ce565b806001600160a01b0316610539610ca2565b6001600160a01b031614806105555750610555816103c2610ca2565b6105715760405162461bcd60e51b81526004016104c39061204b565b61057b8383610ca6565b505050565b600c5481565b61058e610ca2565b600a546001600160a01b039081169116146105bb5760405162461bcd60e51b81526004016104c390612201565b6105c58282610d14565b5050565b60006105d56002610d58565b905090565b6105eb6105e5610ca2565b82610d63565b6106075760405162461bcd60e51b81526004016104c39061230f565b61057b838383610de8565b6001600160a01b038216600090815260016020526040812061063a908363ffffffff610f0816565b90505b92915050565b61057b83838360405180602001604052806000815250610a80565b6106696105e5610ca2565b6106855760405162461bcd60e51b81526004016104c390612397565b61068e81610f14565b50565b6000806106a560028463ffffffff610fed16565b509392505050565b6106b5610ca2565b600a546001600160a01b039081169116146106e25760405162461bcd60e51b81526004016104c390612201565b61068e8161100b565b6106f3610ca2565b600a546001600160a01b039081169116146107205760405162461bcd60e51b81526004016104c390612201565b60005b8181101561057b5760006107356105c9565b9050610741338261101e565b61079d8185858581811061075157fe5b905060200281019061076391906123f0565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610d1492505050565b50600101610723565b600061063d8260405180606001604052806029815260200161250c602991396002919063ffffffff6110ee16565b60098054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156104915780601f1061046657610100808354040283529160200191610491565b60006001600160a01b03821661085d5760405162461bcd60e51b81526004016104c3906120a8565b6001600160a01b038216600090815260016020526040902061063d90610d58565b610886610ca2565b600a546001600160a01b039081169116146108b35760405162461bcd60e51b81526004016104c390612201565b600a546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600a80546001600160a01b0319169055565b610905610ca2565b600a546001600160a01b039081169116146109325760405162461bcd60e51b81526004016104c390612201565b600c55565b600a546001600160a01b031690565b60078054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156104915780601f1061046657610100808354040283529160200191610491565b606061063d82611105565b6109ba610ca2565b6001600160a01b0316826001600160a01b031614156109eb5760405162461bcd60e51b81526004016104c390611fc8565b80600560006109f8610ca2565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155610a3c610ca2565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610a749190611e55565b60405180910390a35050565b610a91610a8b610ca2565b83610d63565b610aad5760405162461bcd60e51b81526004016104c39061230f565b610ab98484848461124f565b50505050565b610ac7610ca2565b600a546001600160a01b03908116911614610af45760405162461bcd60e51b81526004016104c390612201565b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b600b5460405163c87b56dd60e01b81526060916001600160a01b03169063c87b56dd90610b479085906004016123e7565b60006040518083038186803b158015610b5f57600080fd5b505afa158015610b73573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261063d9190810190611c68565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b600b546001600160a01b031681565b610be0610ca2565b600a546001600160a01b03908116911614610c0d5760405162461bcd60e51b81526004016104c390612201565b6001600160a01b038116610c335760405162461bcd60e51b81526004016104c390611f07565b600a546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600a80546001600160a01b0319166001600160a01b0392909216919091179055565b600061063d60028363ffffffff61128216565b3390565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190610cdb826107a6565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b610d1d82610c8f565b610d395760405162461bcd60e51b81526004016104c3906121b5565b6000828152600860209081526040909120825161057b928401906118f3565b600061063d8261128e565b6000610d6e82610c8f565b610d8a5760405162461bcd60e51b81526004016104c390611fff565b6000610d95836107a6565b9050806001600160a01b0316846001600160a01b03161480610dd05750836001600160a01b0316610dc58461049c565b6001600160a01b0316145b80610de05750610de08185610b9b565b949350505050565b826001600160a01b0316610dfb826107a6565b6001600160a01b031614610e215760405162461bcd60e51b81526004016104c390612236565b6001600160a01b038216610e475760405162461bcd60e51b81526004016104c390611f84565b610e5283838361057b565b610e5d600082610ca6565b6001600160a01b0383166000908152600160205260409020610e85908263ffffffff61129216565b506001600160a01b0382166000908152600160205260409020610eae908263ffffffff61129e16565b50610ec16002828463ffffffff6112aa16565b5080826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600061063a83836112c0565b6000610f1f826107a6565b9050610f2d8160008461057b565b610f38600083610ca6565b6000828152600860205260409020546002600019610100600184161502019091160415610f76576000828152600860205260408120610f7691611971565b6001600160a01b0381166000908152600160205260409020610f9e908363ffffffff61129216565b50610fb060028363ffffffff61130516565b5060405182906000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6000808080610ffc8686611311565b909450925050505b9250929050565b80516105c59060099060208401906118f3565b6001600160a01b0382166110445760405162461bcd60e51b81526004016104c390612134565b61104d81610c8f565b1561106a5760405162461bcd60e51b81526004016104c390611f4d565b6110766000838361057b565b6001600160a01b038216600090815260016020526040902061109e908263ffffffff61129e16565b506110b16002828463ffffffff6112aa16565b5060405181906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006110fb84848461136d565b90505b9392505050565b606061111082610c8f565b61112c5760405162461bcd60e51b81526004016104c39061227f565b60008281526008602090815260409182902080548351601f60026000196101006001861615020190931692909204918201849004840281018401909452808452606093928301828280156111c15780601f10611196576101008083540402835291602001916111c1565b820191906000526020600020905b8154815290600101906020018083116111a457829003601f168201915b5050600954939450505050600260001961010060018416150201909116046111ea579050610400565b80511561121c57600981604051602001611205929190611d83565b604051602081830303815290604052915050610400565b6009611227846113cc565b604051602001611238929190611d83565b604051602081830303815290604052915050919050565b61125a848484610de8565b611266848484846114a7565b610ab95760405162461bcd60e51b81526004016104c390611eb5565b600061063a838361158c565b5490565b600061063a83836115a4565b600061063a838361166a565b60006110fb84846001600160a01b0385166116b4565b815460009082106112e35760405162461bcd60e51b81526004016104c390611e73565b8260000182815481106112f257fe5b9060005260206000200154905092915050565b600061063a838361174b565b8154600090819083106113365760405162461bcd60e51b81526004016104c3906120f2565b600084600001848154811061134757fe5b906000526020600020906002020190508060000154816001015492509250509250929050565b6000828152600184016020526040812054828161139d5760405162461bcd60e51b81526004016104c39190611e60565b508460000160018203815481106113b057fe5b9060005260206000209060020201600101549150509392505050565b6060816113f157506040805180820190915260018152600360fc1b6020820152610400565b8160005b811561140957600101600a820491506113f5565b60608167ffffffffffffffff8111801561142257600080fd5b506040519080825280601f01601f19166020018201604052801561144d576020820181803683370190505b50859350905060001982015b831561149e57600a840660300160f81b8282806001900393508151811061147c57fe5b60200101906001600160f81b031916908160001a905350600a84049350611459565b50949350505050565b60006114bb846001600160a01b031661181f565b6114c757506001610de0565b6060611555630a85bd0160e11b6114dc610ca2565b8887876040516024016114f29493929190611e18565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b0383818316178352505050506040518060600160405280603281526020016124da603291396001600160a01b038816919063ffffffff61182516565b905060008180602001905181019061156d9190611c19565b6001600160e01b031916630a85bd0160e11b1492505050949350505050565b60009081526001919091016020526040902054151590565b6000818152600183016020526040812054801561166057835460001980830191908101906000908790839081106115d757fe5b90600052602060002001549050808760000184815481106115f457fe5b60009182526020808320909101929092558281526001898101909252604090209084019055865487908061162457fe5b6001900381819060005260206000200160009055905586600101600087815260200190815260200160002060009055600194505050505061063d565b600091505061063d565b6000611676838361158c565b6116ac5750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561063d565b50600061063d565b6000828152600184016020526040812054806117195750506040805180820182528381526020808201848152865460018181018955600089815284812095516002909302909501918255915190820155865486845281880190925292909120556110fe565b8285600001600183038154811061172c57fe5b90600052602060002090600202016001018190555060009150506110fe565b60008181526001830160205260408120548015611660578354600019808301919081019060009087908390811061177e57fe5b906000526020600020906002020190508087600001848154811061179e57fe5b6000918252602080832084546002909302019182556001938401549184019190915583548252898301905260409020908401905586548790806117dd57fe5b600082815260208082206002600019909401938402018281556001908101839055929093558881528982019092526040822091909155945061063d9350505050565b3b151590565b60606110fb8484600085606061183a8561181f565b6118565760405162461bcd60e51b81526004016104c390612360565b60006060866001600160a01b031685876040516118739190611d67565b60006040518083038185875af1925050503d80600081146118b0576040519150601f19603f3d011682016040523d82523d6000602084013e6118b5565b606091505b509150915081156118c9579150610de09050565b8051156118d95780518082602001fd5b8360405162461bcd60e51b81526004016104c39190611e60565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061193457805160ff1916838001178555611961565b82800160010185558215611961579182015b82811115611961578251825591602001919060010190611946565b5061196d9291506119b1565b5090565b50805460018160011615610100020316600290046000825580601f10611997575061068e565b601f01602090049060005260206000209081019061068e91905b61049991905b8082111561196d57600081556001016119b7565b80356001600160a01b038116811461063d57600080fd5b600082601f8301126119f2578081fd5b8135611a05611a008261245e565b612437565b9150808252836020828501011115611a1c57600080fd5b8060208401602084013760009082016020015292915050565b600060208284031215611a46578081fd5b61063a83836119cb565b60008060408385031215611a62578081fd5b611a6c84846119cb565b9150611a7b84602085016119cb565b90509250929050565b600080600060608486031215611a98578081fd5b8335611aa3816124ae565b92506020840135611ab3816124ae565b929592945050506040919091013590565b60008060008060808587031215611ad9578081fd5b611ae386866119cb565b9350611af286602087016119cb565b925060408501359150606085013567ffffffffffffffff811115611b14578182fd5b611b20878288016119e2565b91505092959194509250565b60008060408385031215611b3e578182fd5b611b4884846119cb565b915060208301358015158114611b5c578182fd5b809150509250929050565b60008060408385031215611b79578182fd5b611b8384846119cb565b946020939093013593505050565b60008060208385031215611ba3578182fd5b823567ffffffffffffffff80821115611bba578384fd5b81850186601f820112611bcb578485fd5b8035925081831115611bdb578485fd5b8660208085028301011115611bee578485fd5b60200196919550909350505050565b600060208284031215611c0e578081fd5b81356110fe816124c3565b600060208284031215611c2a578081fd5b81516110fe816124c3565b600060208284031215611c46578081fd5b813567ffffffffffffffff811115611c5c578182fd5b610de0848285016119e2565b600060208284031215611c79578081fd5b815167ffffffffffffffff811115611c8f578182fd5b80830184601f820112611ca0578283fd5b80519150611cb0611a008361245e565b828152856020848401011115611cc4578384fd5b611cd5836020830160208501612482565b95945050505050565b600060208284031215611cef578081fd5b5035919050565b60008060408385031215611d08578182fd5b82359150602083013567ffffffffffffffff811115611d25578182fd5b611d31858286016119e2565b9150509250929050565b60008151808452611d53816020860160208601612482565b601f01601f19169290920160200192915050565b60008251611d79818460208701612482565b9190910192915050565b6000808454600180821660008114611da25760018114611db957611de8565b60ff198316865260028304607f1686019350611de8565b600283048886526020808720875b83811015611de05781548a820152908501908201611dc7565b505050860193505b5050508351611dfb818360208801612482565b01949350505050565b6001600160a01b0391909116815260200190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611e4b90830184611d3b565b9695505050505050565b901515815260200190565b60006020825261063a6020830184611d3b565b60208082526022908201527f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e604082015261647360f01b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526022908201527f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e604082015261647360f01b606082015260800190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252602c908201527f4552433732314d657461646174613a2055524920736574206f66206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b6020808252602f908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201526e3732bc34b9ba32b73a103a37b5b2b760891b606082015260800190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b60208082526030908201527f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760408201526f1b995c881b9bdc88185c1c1c9bdd995960821b606082015260800190565b90815260200190565b6000808335601e19843603018112612406578283fd5b8084018035925067ffffffffffffffff831115612421578384fd5b6020019250503681900382131561100457600080fd5b60405181810167ffffffffffffffff8111828210171561245657600080fd5b604052919050565b600067ffffffffffffffff821115612474578081fd5b50601f01601f191660200190565b60005b8381101561249d578181015183820152602001612485565b83811115610ab95750506000910152565b6001600160a01b038116811461068e57600080fd5b6001600160e01b03198116811461068e57600080fdfe4552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea2646970667358221220bbc29d21b917fd09fe3090adea0b15c41824ae00482cd67b5b008020933d188c64736f6c63430006080033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101cf5760003560e01c80636352211e116101045780639bd1972e116100a2578063c87b56dd11610071578063c87b56dd146103a1578063e985e9c5146103b4578063eac989f8146103c7578063f2fde38b146103cf576101cf565b80639bd1972e14610355578063a22cb46514610368578063b88d4fde1461037b578063bd62fd1f1461038e576101cf565b8063715018a6116100de578063715018a61461032a57806382d95df5146103325780638da5cb5b1461034557806395d89b411461034d576101cf565b80636352211e146102fc5780636c0360eb1461030f57806370a0823114610317576101cf565b806323b872dd1161017157806342966c681161014b57806342966c68146102b05780634f6ccce7146102c357806355f804b3146102d65780635768f271146102e9576101cf565b806323b872dd146102775780632f745c591461028a57806342842e0e1461029d576101cf565b8063095ea7b3116101ad578063095ea7b3146102325780630b97bc8614610247578063162094c41461025c57806318160ddd1461026f576101cf565b806301ffc9a7146101d457806306fdde03146101fd578063081812fc14610212575b600080fd5b6101e76101e2366004611bfd565b6103e2565b6040516101f49190611e55565b60405180910390f35b610205610405565b6040516101f49190611e60565b610225610220366004611cde565b61049c565b6040516101f49190611e04565b610245610240366004611b67565b6104e8565b005b61024f610580565b6040516101f491906123e7565b61024561026a366004611cf6565b610586565b61024f6105c9565b610245610285366004611a84565b6105da565b61024f610298366004611b67565b610612565b6102456102ab366004611a84565b610643565b6102456102be366004611cde565b61065e565b61024f6102d1366004611cde565b610691565b6102456102e4366004611c35565b6106ad565b6102456102f7366004611b91565b6106eb565b61022561030a366004611cde565b6107a6565b6102056107d4565b61024f610325366004611a35565b610835565b61024561087e565b610245610340366004611cde565b6108fd565b610225610937565b610205610946565b610205610363366004611cde565b6109a7565b610245610376366004611b2c565b6109b2565b610245610389366004611ac4565b610a80565b61024561039c366004611a35565b610abf565b6102056103af366004611cde565b610b16565b6101e76103c2366004611a50565b610b9b565b610225610bc9565b6102456103dd366004611a35565b610bd8565b6001600160e01b0319811660009081526020819052604090205460ff165b919050565b60068054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156104915780601f1061046657610100808354040283529160200191610491565b820191906000526020600020905b81548152906001019060200180831161047457829003601f168201915b505050505090505b90565b60006104a782610c8f565b6104cc5760405162461bcd60e51b81526004016104c390612169565b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006104f3826107a6565b9050806001600160a01b0316836001600160a01b031614156105275760405162461bcd60e51b81526004016104c3906122ce565b806001600160a01b0316610539610ca2565b6001600160a01b031614806105555750610555816103c2610ca2565b6105715760405162461bcd60e51b81526004016104c39061204b565b61057b8383610ca6565b505050565b600c5481565b61058e610ca2565b600a546001600160a01b039081169116146105bb5760405162461bcd60e51b81526004016104c390612201565b6105c58282610d14565b5050565b60006105d56002610d58565b905090565b6105eb6105e5610ca2565b82610d63565b6106075760405162461bcd60e51b81526004016104c39061230f565b61057b838383610de8565b6001600160a01b038216600090815260016020526040812061063a908363ffffffff610f0816565b90505b92915050565b61057b83838360405180602001604052806000815250610a80565b6106696105e5610ca2565b6106855760405162461bcd60e51b81526004016104c390612397565b61068e81610f14565b50565b6000806106a560028463ffffffff610fed16565b509392505050565b6106b5610ca2565b600a546001600160a01b039081169116146106e25760405162461bcd60e51b81526004016104c390612201565b61068e8161100b565b6106f3610ca2565b600a546001600160a01b039081169116146107205760405162461bcd60e51b81526004016104c390612201565b60005b8181101561057b5760006107356105c9565b9050610741338261101e565b61079d8185858581811061075157fe5b905060200281019061076391906123f0565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610d1492505050565b50600101610723565b600061063d8260405180606001604052806029815260200161250c602991396002919063ffffffff6110ee16565b60098054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156104915780601f1061046657610100808354040283529160200191610491565b60006001600160a01b03821661085d5760405162461bcd60e51b81526004016104c3906120a8565b6001600160a01b038216600090815260016020526040902061063d90610d58565b610886610ca2565b600a546001600160a01b039081169116146108b35760405162461bcd60e51b81526004016104c390612201565b600a546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600a80546001600160a01b0319169055565b610905610ca2565b600a546001600160a01b039081169116146109325760405162461bcd60e51b81526004016104c390612201565b600c55565b600a546001600160a01b031690565b60078054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156104915780601f1061046657610100808354040283529160200191610491565b606061063d82611105565b6109ba610ca2565b6001600160a01b0316826001600160a01b031614156109eb5760405162461bcd60e51b81526004016104c390611fc8565b80600560006109f8610ca2565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155610a3c610ca2565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610a749190611e55565b60405180910390a35050565b610a91610a8b610ca2565b83610d63565b610aad5760405162461bcd60e51b81526004016104c39061230f565b610ab98484848461124f565b50505050565b610ac7610ca2565b600a546001600160a01b03908116911614610af45760405162461bcd60e51b81526004016104c390612201565b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b600b5460405163c87b56dd60e01b81526060916001600160a01b03169063c87b56dd90610b479085906004016123e7565b60006040518083038186803b158015610b5f57600080fd5b505afa158015610b73573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261063d9190810190611c68565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b600b546001600160a01b031681565b610be0610ca2565b600a546001600160a01b03908116911614610c0d5760405162461bcd60e51b81526004016104c390612201565b6001600160a01b038116610c335760405162461bcd60e51b81526004016104c390611f07565b600a546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600a80546001600160a01b0319166001600160a01b0392909216919091179055565b600061063d60028363ffffffff61128216565b3390565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190610cdb826107a6565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b610d1d82610c8f565b610d395760405162461bcd60e51b81526004016104c3906121b5565b6000828152600860209081526040909120825161057b928401906118f3565b600061063d8261128e565b6000610d6e82610c8f565b610d8a5760405162461bcd60e51b81526004016104c390611fff565b6000610d95836107a6565b9050806001600160a01b0316846001600160a01b03161480610dd05750836001600160a01b0316610dc58461049c565b6001600160a01b0316145b80610de05750610de08185610b9b565b949350505050565b826001600160a01b0316610dfb826107a6565b6001600160a01b031614610e215760405162461bcd60e51b81526004016104c390612236565b6001600160a01b038216610e475760405162461bcd60e51b81526004016104c390611f84565b610e5283838361057b565b610e5d600082610ca6565b6001600160a01b0383166000908152600160205260409020610e85908263ffffffff61129216565b506001600160a01b0382166000908152600160205260409020610eae908263ffffffff61129e16565b50610ec16002828463ffffffff6112aa16565b5080826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600061063a83836112c0565b6000610f1f826107a6565b9050610f2d8160008461057b565b610f38600083610ca6565b6000828152600860205260409020546002600019610100600184161502019091160415610f76576000828152600860205260408120610f7691611971565b6001600160a01b0381166000908152600160205260409020610f9e908363ffffffff61129216565b50610fb060028363ffffffff61130516565b5060405182906000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6000808080610ffc8686611311565b909450925050505b9250929050565b80516105c59060099060208401906118f3565b6001600160a01b0382166110445760405162461bcd60e51b81526004016104c390612134565b61104d81610c8f565b1561106a5760405162461bcd60e51b81526004016104c390611f4d565b6110766000838361057b565b6001600160a01b038216600090815260016020526040902061109e908263ffffffff61129e16565b506110b16002828463ffffffff6112aa16565b5060405181906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006110fb84848461136d565b90505b9392505050565b606061111082610c8f565b61112c5760405162461bcd60e51b81526004016104c39061227f565b60008281526008602090815260409182902080548351601f60026000196101006001861615020190931692909204918201849004840281018401909452808452606093928301828280156111c15780601f10611196576101008083540402835291602001916111c1565b820191906000526020600020905b8154815290600101906020018083116111a457829003601f168201915b5050600954939450505050600260001961010060018416150201909116046111ea579050610400565b80511561121c57600981604051602001611205929190611d83565b604051602081830303815290604052915050610400565b6009611227846113cc565b604051602001611238929190611d83565b604051602081830303815290604052915050919050565b61125a848484610de8565b611266848484846114a7565b610ab95760405162461bcd60e51b81526004016104c390611eb5565b600061063a838361158c565b5490565b600061063a83836115a4565b600061063a838361166a565b60006110fb84846001600160a01b0385166116b4565b815460009082106112e35760405162461bcd60e51b81526004016104c390611e73565b8260000182815481106112f257fe5b9060005260206000200154905092915050565b600061063a838361174b565b8154600090819083106113365760405162461bcd60e51b81526004016104c3906120f2565b600084600001848154811061134757fe5b906000526020600020906002020190508060000154816001015492509250509250929050565b6000828152600184016020526040812054828161139d5760405162461bcd60e51b81526004016104c39190611e60565b508460000160018203815481106113b057fe5b9060005260206000209060020201600101549150509392505050565b6060816113f157506040805180820190915260018152600360fc1b6020820152610400565b8160005b811561140957600101600a820491506113f5565b60608167ffffffffffffffff8111801561142257600080fd5b506040519080825280601f01601f19166020018201604052801561144d576020820181803683370190505b50859350905060001982015b831561149e57600a840660300160f81b8282806001900393508151811061147c57fe5b60200101906001600160f81b031916908160001a905350600a84049350611459565b50949350505050565b60006114bb846001600160a01b031661181f565b6114c757506001610de0565b6060611555630a85bd0160e11b6114dc610ca2565b8887876040516024016114f29493929190611e18565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b0383818316178352505050506040518060600160405280603281526020016124da603291396001600160a01b038816919063ffffffff61182516565b905060008180602001905181019061156d9190611c19565b6001600160e01b031916630a85bd0160e11b1492505050949350505050565b60009081526001919091016020526040902054151590565b6000818152600183016020526040812054801561166057835460001980830191908101906000908790839081106115d757fe5b90600052602060002001549050808760000184815481106115f457fe5b60009182526020808320909101929092558281526001898101909252604090209084019055865487908061162457fe5b6001900381819060005260206000200160009055905586600101600087815260200190815260200160002060009055600194505050505061063d565b600091505061063d565b6000611676838361158c565b6116ac5750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561063d565b50600061063d565b6000828152600184016020526040812054806117195750506040805180820182528381526020808201848152865460018181018955600089815284812095516002909302909501918255915190820155865486845281880190925292909120556110fe565b8285600001600183038154811061172c57fe5b90600052602060002090600202016001018190555060009150506110fe565b60008181526001830160205260408120548015611660578354600019808301919081019060009087908390811061177e57fe5b906000526020600020906002020190508087600001848154811061179e57fe5b6000918252602080832084546002909302019182556001938401549184019190915583548252898301905260409020908401905586548790806117dd57fe5b600082815260208082206002600019909401938402018281556001908101839055929093558881528982019092526040822091909155945061063d9350505050565b3b151590565b60606110fb8484600085606061183a8561181f565b6118565760405162461bcd60e51b81526004016104c390612360565b60006060866001600160a01b031685876040516118739190611d67565b60006040518083038185875af1925050503d80600081146118b0576040519150601f19603f3d011682016040523d82523d6000602084013e6118b5565b606091505b509150915081156118c9579150610de09050565b8051156118d95780518082602001fd5b8360405162461bcd60e51b81526004016104c39190611e60565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061193457805160ff1916838001178555611961565b82800160010185558215611961579182015b82811115611961578251825591602001919060010190611946565b5061196d9291506119b1565b5090565b50805460018160011615610100020316600290046000825580601f10611997575061068e565b601f01602090049060005260206000209081019061068e91905b61049991905b8082111561196d57600081556001016119b7565b80356001600160a01b038116811461063d57600080fd5b600082601f8301126119f2578081fd5b8135611a05611a008261245e565b612437565b9150808252836020828501011115611a1c57600080fd5b8060208401602084013760009082016020015292915050565b600060208284031215611a46578081fd5b61063a83836119cb565b60008060408385031215611a62578081fd5b611a6c84846119cb565b9150611a7b84602085016119cb565b90509250929050565b600080600060608486031215611a98578081fd5b8335611aa3816124ae565b92506020840135611ab3816124ae565b929592945050506040919091013590565b60008060008060808587031215611ad9578081fd5b611ae386866119cb565b9350611af286602087016119cb565b925060408501359150606085013567ffffffffffffffff811115611b14578182fd5b611b20878288016119e2565b91505092959194509250565b60008060408385031215611b3e578182fd5b611b4884846119cb565b915060208301358015158114611b5c578182fd5b809150509250929050565b60008060408385031215611b79578182fd5b611b8384846119cb565b946020939093013593505050565b60008060208385031215611ba3578182fd5b823567ffffffffffffffff80821115611bba578384fd5b81850186601f820112611bcb578485fd5b8035925081831115611bdb578485fd5b8660208085028301011115611bee578485fd5b60200196919550909350505050565b600060208284031215611c0e578081fd5b81356110fe816124c3565b600060208284031215611c2a578081fd5b81516110fe816124c3565b600060208284031215611c46578081fd5b813567ffffffffffffffff811115611c5c578182fd5b610de0848285016119e2565b600060208284031215611c79578081fd5b815167ffffffffffffffff811115611c8f578182fd5b80830184601f820112611ca0578283fd5b80519150611cb0611a008361245e565b828152856020848401011115611cc4578384fd5b611cd5836020830160208501612482565b95945050505050565b600060208284031215611cef578081fd5b5035919050565b60008060408385031215611d08578182fd5b82359150602083013567ffffffffffffffff811115611d25578182fd5b611d31858286016119e2565b9150509250929050565b60008151808452611d53816020860160208601612482565b601f01601f19169290920160200192915050565b60008251611d79818460208701612482565b9190910192915050565b6000808454600180821660008114611da25760018114611db957611de8565b60ff198316865260028304607f1686019350611de8565b600283048886526020808720875b83811015611de05781548a820152908501908201611dc7565b505050860193505b5050508351611dfb818360208801612482565b01949350505050565b6001600160a01b0391909116815260200190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611e4b90830184611d3b565b9695505050505050565b901515815260200190565b60006020825261063a6020830184611d3b565b60208082526022908201527f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e604082015261647360f01b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526022908201527f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e604082015261647360f01b606082015260800190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252602c908201527f4552433732314d657461646174613a2055524920736574206f66206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b6020808252602f908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201526e3732bc34b9ba32b73a103a37b5b2b760891b606082015260800190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b60208082526030908201527f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760408201526f1b995c881b9bdc88185c1c1c9bdd995960821b606082015260800190565b90815260200190565b6000808335601e19843603018112612406578283fd5b8084018035925067ffffffffffffffff831115612421578384fd5b6020019250503681900382131561100457600080fd5b60405181810167ffffffffffffffff8111828210171561245657600080fd5b604052919050565b600067ffffffffffffffff821115612474578081fd5b50601f01601f191660200190565b60005b8381101561249d578181015183820152602001612485565b83811115610ab95750506000910152565b6001600160a01b038116811461068e57600080fd5b6001600160e01b03198116811461068e57600080fdfe4552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea2646970667358221220bbc29d21b917fd09fe3090adea0b15c41824ae00482cd67b5b008020933d188c64736f6c63430006080033
Deployed Bytecode Sourcemap
60649:1093:0:-:0;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;60649:1093:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;9;2:12;12671:142:0;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;46946:92;;;:::i;:::-;;;;;;;;49641:213;;;;;;;;;:::i;:::-;;;;;;;;49185:390;;;;;;;;;:::i;:::-;;60783:24;;;:::i;:::-;;;;;;;;61371:109;;;;;;;;;:::i;48679:203::-;;;:::i;50515:305::-;;;;;;;;;:::i;48449:154::-;;;;;;;;;:::i;50891:151::-;;;;;;;;;:::i;60039:245::-;;;;;;;;;:::i;48959:164::-;;;;;;;;;:::i;61486:87::-;;;;;;;;;:::i;61147:218::-;;;;;;;;;:::i;46710:169::-;;;;;;;;;:::i;48276:89::-;;;:::i;46433:215::-;;;;;;;;;:::i;2777:148::-;;;:::i;61579:76::-;;;;;;;;;:::i;2135:79::-;;;:::i;47107:96::-;;;:::i;61029:112::-;;;;;;;;;:::i;49926:295::-;;;;;;;;;:::i;51113:285::-;;;;;;;;;:::i;61661:78::-;;;;;;;;;:::i;60912:111::-;;;;;;;;;:::i;50292:156::-;;;;;;;;;:::i;60697:20::-;;;:::i;3080:244::-;;;;;;;;;:::i;12671:142::-;-1:-1:-1;;;;;;12772:33:0;;12748:4;12772:33;;;;;;;;;;;;;12671:142;;;;:::o;46946:92::-;47025:5;47018:12;;;;;;;;-1:-1:-1;;47018:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46992:13;;47018:12;;47025:5;;47018:12;;47025:5;47018:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46946:92;;:::o;49641:213::-;49709:7;49737:16;49745:7;49737;:16::i;:::-;49729:73;;;;-1:-1:-1;;;49729:73:0;;;;;;;;;;;;;;;;;-1:-1:-1;49822:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;49822:24:0;;49641:213::o;49185:390::-;49266:13;49282:16;49290:7;49282;:16::i;:::-;49266:32;;49323:5;-1:-1:-1;;;;;49317:11:0;:2;-1:-1:-1;;;;;49317:11:0;;;49309:57;;;;-1:-1:-1;;;49309:57:0;;;;;;;;;49403:5;-1:-1:-1;;;;;49387:21:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;49387:21:0;;:62;;;;49412:37;49429:5;49436:12;:10;:12::i;49412:37::-;49379:154;;;;-1:-1:-1;;;49379:154:0;;;;;;;;;49546:21;49555:2;49559:7;49546:8;:21::i;:::-;49185:390;;;:::o;60783:24::-;;;;:::o;61371:109::-;2357:12;:10;:12::i;:::-;2347:6;;-1:-1:-1;;;;;2347:6:0;;;:22;;;2339:67;;;;-1:-1:-1;;;2339:67:0;;;;;;;;;61450:24:::1;61463:2;61467:6;61450:12;:24::i;:::-;61371:109:::0;;:::o;48679:203::-;48732:7;48853:21;:12;:19;:21::i;:::-;48846:28;;48679:203;:::o;50515:305::-;50676:41;50695:12;:10;:12::i;:::-;50709:7;50676:18;:41::i;:::-;50668:103;;;;-1:-1:-1;;;50668:103:0;;;;;;;;;50784:28;50794:4;50800:2;50804:7;50784:9;:28::i;48449:154::-;-1:-1:-1;;;;;48565:20:0;;48538:7;48565:20;;;:13;:20;;;;;:30;;48589:5;48565:30;:23;:30;:::i;:::-;48558:37;;48449:154;;;;;:::o;50891:151::-;50995:39;51012:4;51018:2;51022:7;50995:39;;;;;;;;;;;;:16;:39::i;60039:245::-;60157:41;60176:12;:10;:12::i;60157:41::-;60149:102;;;;-1:-1:-1;;;60149:102:0;;;;;;;;;60262:14;60268:7;60262:5;:14::i;:::-;60039:245;:::o;48959:164::-;49026:7;;49068:22;:12;49084:5;49068:22;:15;:22;:::i;:::-;-1:-1:-1;49046:44:0;48959:164;-1:-1:-1;;;48959:164:0:o;61486:87::-;2357:12;:10;:12::i;:::-;2347:6;;-1:-1:-1;;;;;2347:6:0;;;:22;;;2339:67;;;;-1:-1:-1;;;2339:67:0;;;;;;;;;61550:17:::1;61562:4;61550:11;:17::i;61147:218::-:0;2357:12;:10;:12::i;:::-;2347:6;;-1:-1:-1;;;;;2347:6:0;;;:22;;;2339:67;;;;-1:-1:-1;;;2339:67:0;;;;;;;;;61216:9:::1;61211:149;61231:15:::0;;::::1;61211:149;;;61262:10;61275:13;:11;:13::i;:::-;61262:26;;61297:21;61303:10;61315:2;61297:5;:21::i;:::-;61327:25;61340:2;61344:4;;61349:1;61344:7;;;;;;;;;;;;;;;;;;;;61327:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;61327:12:0::1;::::0;-1:-1:-1;;;61327:25:0:i:1;:::-;-1:-1:-1::0;61248:3:0::1;;61211:149;;46710:169:::0;46774:7;46801:70;46818:7;46801:70;;;;;;;;;;;;;;;;;:12;;:70;;:16;:70;:::i;48276:89::-;48349:8;48342:15;;;;;;;;-1:-1:-1;;48342:15:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48316:13;;48342:15;;48349:8;;48342:15;;48349:8;48342:15;;;;;;;;;;;;;;;;;;;;;;;;46433:215;46497:7;-1:-1:-1;;;;;46525:19:0;;46517:74;;;;-1:-1:-1;;;46517:74:0;;;;;;;;;-1:-1:-1;;;;;46611:20:0;;;;;;:13;:20;;;;;:29;;:27;:29::i;2777:148::-;2357:12;:10;:12::i;:::-;2347:6;;-1:-1:-1;;;;;2347:6:0;;;:22;;;2339:67;;;;-1:-1:-1;;;2339:67:0;;;;;;;;;2868:6:::1;::::0;2847:40:::1;::::0;2884:1:::1;::::0;-1:-1:-1;;;;;2868:6:0::1;::::0;2847:40:::1;::::0;2884:1;;2847:40:::1;2898:6;:19:::0;;-1:-1:-1;;;;;;2898:19:0::1;::::0;;2777:148::o;61579:76::-;2357:12;:10;:12::i;:::-;2347:6;;-1:-1:-1;;;;;2347:6:0;;;:22;;;2339:67;;;;-1:-1:-1;;;2339:67:0;;;;;;;;;61636:9:::1;:13:::0;61579:76::o;2135:79::-;2200:6;;-1:-1:-1;;;;;2200:6:0;2135:79;:::o;47107:96::-;47188:7;47181:14;;;;;;;;-1:-1:-1;;47181:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47155:13;;47181:14;;47188:7;;47181:14;;47188:7;47181:14;;;;;;;;;;;;;;;;;;;;;;;;61029:112;61083:13;61112:23;61127:7;61112:14;:23::i;49926:295::-;50041:12;:10;:12::i;:::-;-1:-1:-1;;;;;50029:24:0;:8;-1:-1:-1;;;;;50029:24:0;;;50021:62;;;;-1:-1:-1;;;50021:62:0;;;;;;;;;50141:8;50096:18;:32;50115:12;:10;:12::i;:::-;-1:-1:-1;;;;;50096:32:0;;;;;;;;;;;;;;;;;-1:-1:-1;50096:32:0;;;:42;;;;;;;;;;;;:53;;-1:-1:-1;;50096:53:0;;;;;;;;;;;50180:12;:10;:12::i;:::-;-1:-1:-1;;;;;50165:48:0;;50204:8;50165:48;;;;;;;;;;;;;;;49926:295;;:::o;51113:285::-;51245:41;51264:12;:10;:12::i;:::-;51278:7;51245:18;:41::i;:::-;51237:103;;;;-1:-1:-1;;;51237:103:0;;;;;;;;;51351:39;51365:4;51371:2;51375:7;51384:5;51351:13;:39::i;:::-;51113:285;;;;:::o;61661:78::-;2357:12;:10;:12::i;:::-;2347:6;;-1:-1:-1;;;;;2347:6:0;;;:22;;;2339:67;;;;-1:-1:-1;;;2339:67:0;;;;;;;;;61715:3:::1;:18:::0;;-1:-1:-1;;;;;;61715:18:0::1;-1:-1:-1::0;;;;;61715:18:0;;;::::1;::::0;;;::::1;::::0;;61661:78::o;60912:111::-;61001:3;;:16;;-1:-1:-1;;;61001:16:0;;60972:13;;-1:-1:-1;;;;;61001:3:0;;:12;;:16;;61014:2;;61001:16;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;61001:16:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;61001:16:0;;;;;;39::-1;36:1;17:17;2:54;101:4;61001:16:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;61001:16:0;;;;;;;;50292:156;-1:-1:-1;;;;;50405:25:0;;;50381:4;50405:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;50292:156::o;60697:20::-;;;-1:-1:-1;;;;;60697:20:0;;:::o;3080:244::-;2357:12;:10;:12::i;:::-;2347:6;;-1:-1:-1;;;;;2347:6:0;;;:22;;;2339:67;;;;-1:-1:-1;;;2339:67:0;;;;;;;;;-1:-1:-1;;;;;3169:22:0;::::1;3161:73;;;;-1:-1:-1::0;;;3161:73:0::1;;;;;;;;;3271:6;::::0;3250:38:::1;::::0;-1:-1:-1;;;;;3250:38:0;;::::1;::::0;3271:6:::1;::::0;3250:38:::1;::::0;3271:6:::1;::::0;3250:38:::1;3299:6;:17:::0;;-1:-1:-1;;;;;;3299:17:0::1;-1:-1:-1::0;;;;;3299:17:0;;;::::1;::::0;;;::::1;::::0;;3080:244::o;52865:119::-;52922:4;52946:30;:12;52968:7;52946:30;:21;:30;:::i;657:106::-;745:10;657:106;:::o;58692:158::-;58758:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;58758:29:0;-1:-1:-1;;;;;58758:29:0;;;;;;;;:24;;58812:16;58758:24;58812:7;:16::i;:::-;-1:-1:-1;;;;;58803:39:0;;;;;;;;;;;58692:158;;:::o;56970:215::-;57070:16;57078:7;57070;:16::i;:::-;57062:73;;;;-1:-1:-1;;;57062:73:0;;;;;;;;;57146:19;;;;:10;:19;;;;;;;;:31;;;;;;;;:::i;40294:123::-;40363:7;40390:19;40398:3;40390:7;:19::i;53151:333::-;53236:4;53261:16;53269:7;53261;:16::i;:::-;53253:73;;;;-1:-1:-1;;;53253:73:0;;;;;;;;;53337:13;53353:16;53361:7;53353;:16::i;:::-;53337:32;;53399:5;-1:-1:-1;;;;;53388:16:0;:7;-1:-1:-1;;;;;53388:16:0;;:51;;;;53432:7;-1:-1:-1;;;;;53408:31:0;:20;53420:7;53408:11;:20::i;:::-;-1:-1:-1;;;;;53408:31:0;;53388:51;:87;;;;53443:32;53460:5;53467:7;53443:16;:32::i;:::-;53380:96;53151:333;-1:-1:-1;;;;53151:333:0:o;56240:574::-;56358:4;-1:-1:-1;;;;;56338:24:0;:16;56346:7;56338;:16::i;:::-;-1:-1:-1;;;;;56338:24:0;;56330:78;;;;-1:-1:-1;;;56330:78:0;;;;;;;;;-1:-1:-1;;;;;56427:16:0;;56419:65;;;;-1:-1:-1;;;56419:65:0;;;;;;;;;56497:39;56518:4;56524:2;56528:7;56497:20;:39::i;:::-;56601:29;56618:1;56622:7;56601:8;:29::i;:::-;-1:-1:-1;;;;;56643:19:0;;;;;;:13;:19;;;;;:35;;56670:7;56643:35;:26;:35;:::i;:::-;-1:-1:-1;;;;;;56689:17:0;;;;;;:13;:17;;;;;:30;;56711:7;56689:30;:21;:30;:::i;:::-;-1:-1:-1;56732:29:0;:12;56749:7;56758:2;56732:29;:16;:29;:::i;:::-;;56798:7;56794:2;-1:-1:-1;;;;;56779:27:0;56788:4;-1:-1:-1;;;;;56779:27:0;;;;;;;;;;;56240:574;;;:::o;32867:137::-;32938:7;32973:22;32977:3;32989:5;32973:3;:22::i;55383:520::-;55443:13;55459:16;55467:7;55459;:16::i;:::-;55443:32;;55488:48;55509:5;55524:1;55528:7;55488:20;:48::i;:::-;55577:29;55594:1;55598:7;55577:8;:29::i;:::-;55665:19;;;;:10;:19;;;;;55659:33;;-1:-1:-1;;55659:33:0;;;;;;;;;;;:38;55655:97;;55721:19;;;;:10;:19;;;;;55714:26;;;:::i;:::-;-1:-1:-1;;;;;55764:20:0;;;;;;:13;:20;;;;;:36;;55792:7;55764:36;:27;:36;:::i;:::-;-1:-1:-1;55813:28:0;:12;55833:7;55813:28;:19;:28;:::i;:::-;-1:-1:-1;55859:36:0;;55887:7;;55883:1;;-1:-1:-1;;;;;55859:36:0;;;;;55883:1;;55859:36;55383:520;;:::o;40756:227::-;40836:7;;;;40896:22;40900:3;40912:5;40896:3;:22::i;:::-;40865:53;;-1:-1:-1;40865:53:0;-1:-1:-1;;;40756:227:0;;;;;;:::o;57415:100::-;57488:19;;;;:8;;:19;;;;;:::i;54750:404::-;-1:-1:-1;;;;;54830:16:0;;54822:61;;;;-1:-1:-1;;;54822:61:0;;;;;;;;;54903:16;54911:7;54903;:16::i;:::-;54902:17;54894:58;;;;-1:-1:-1;;;54894:58:0;;;;;;;;;54965:45;54994:1;54998:2;55002:7;54965:20;:45::i;:::-;-1:-1:-1;;;;;55023:17:0;;;;;;:13;:17;;;;;:30;;55045:7;55023:30;:21;:30;:::i;:::-;-1:-1:-1;55066:29:0;:12;55083:7;55092:2;55066:29;:16;:29;:::i;:::-;-1:-1:-1;55113:33:0;;55138:7;;-1:-1:-1;;;;;55113:33:0;;;55130:1;;55113:33;;55130:1;;55113:33;54750:404;;:::o;41418:204::-;41525:7;41568:44;41573:3;41593;41599:12;41568:4;:44::i;:::-;41560:53;-1:-1:-1;41418:204:0;;;;;;:::o;47274:763::-;47347:13;47381:16;47389:7;47381;:16::i;:::-;47373:76;;;;-1:-1:-1;;;47373:76:0;;;;;;;;;47488:19;;;;:10;:19;;;;;;;;;47462:45;;;;;;-1:-1:-1;;47462:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:23;;:45;;;47488:19;47462:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;47589:8:0;47583:22;47462:45;;-1:-1:-1;;;;47583:22:0;-1:-1:-1;;47583:22:0;;;;;;;;;;;47579:76;;47634:9;-1:-1:-1;47627:16:0;;47579:76;47759:23;;:27;47755:112;;47834:8;47844:9;47817:37;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;47817:37:0;;;47803:52;;;;;47755:112;47999:8;48009:18;:7;:16;:18::i;:::-;47982:46;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;47982:46:0;;;47968:61;;;47274:763;;;:::o;52280:272::-;52394:28;52404:4;52410:2;52414:7;52394:9;:28::i;:::-;52441:48;52464:4;52470:2;52474:7;52483:5;52441:22;:48::i;:::-;52433:111;;;;-1:-1:-1;;;52433:111:0;;;;;;;;40055:151;40139:4;40163:35;40173:3;40193;40163:9;:35::i;37677:110::-;37760:19;;37677:110::o;31954:137::-;32024:4;32048:35;32056:3;32076:5;32048:7;:35::i;31647:131::-;31714:4;31738:32;31743:3;31763:5;31738:4;:32::i;39487:176::-;39576:4;39600:55;39605:3;39625;-1:-1:-1;;;;;39639:14:0;;39600:4;:55::i;29531:204::-;29626:18;;29598:7;;29626:26;-1:-1:-1;29618:73:0;;;;-1:-1:-1;;;29618:73:0;;;;;;;;;29709:3;:11;;29721:5;29709:18;;;;;;;;;;;;;;;;29702:25;;29531:204;;;;:::o;39829:142::-;39906:4;39930:33;39938:3;39958;39930:7;:33::i;38142:279::-;38246:19;;38209:7;;;;38246:27;-1:-1:-1;38238:74:0;;;;-1:-1:-1;;;38238:74:0;;;;;;;;;38325:22;38350:3;:12;;38363:5;38350:19;;;;;;;;;;;;;;;;;;38325:44;;38388:5;:10;;;38400:5;:12;;;38380:33;;;;;38142:279;;;;;:::o;38844:319::-;38938:7;38977:17;;;:12;;;:17;;;;;;39028:12;39013:13;39005:36;;;;-1:-1:-1;;;39005:36:0;;;;;;;;;;;39095:3;:12;;39119:1;39108:8;:12;39095:26;;;;;;;;;;;;;;;;;;:33;;;39088:40;;;38844:319;;;;;:::o;41895:744::-;41951:13;42172:10;42168:53;;-1:-1:-1;42199:10:0;;;;;;;;;;;;-1:-1:-1;;;42199:10:0;;;;;;42168:53;42246:5;42231:12;42287:78;42294:9;;42287:78;;42320:8;;42351:2;42343:10;;;;42287:78;;;42375:19;42407:6;42397:17;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;42397:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;21:6:-1;;108:14;42397:17:0;87:42:-1;143:17;;-1:-1;42397:17:0;-1:-1:-1;42469:5:0;;-1:-1:-1;42375:39:0;-1:-1:-1;;;42441:10:0;;42485:115;42492:9;;42485:115;;42559:2;42552:4;:9;42547:2;:14;42536:27;;42518:6;42525:7;;;;;;;42518:15;;;;;;;;;;;:45;-1:-1:-1;;;;;42518:45:0;;;;;;;;-1:-1:-1;42586:2:0;42578:10;;;;42485:115;;;-1:-1:-1;42624:6:0;41895:744;-1:-1:-1;;;;41895:744:0:o;58080:604::-;58201:4;58228:15;:2;-1:-1:-1;;;;;58228:13:0;;:15::i;:::-;58223:60;;-1:-1:-1;58267:4:0;58260:11;;58223:60;58293:23;58319:252;-1:-1:-1;;;58432:12:0;:10;:12::i;:::-;58459:4;58478:7;58500:5;58335:181;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;58335:181:0;;;;-1:-1:-1;;;;;58335:181:0;;38:4:-1;29:7;25:18;67:10;61:17;-1:-1;;;;;199:8;192:4;186;182:15;179:29;167:10;160:49;0:215;;;58335:181:0;58319:252;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;58319:15:0;;;:252;;:15;:252;:::i;:::-;58293:278;;58582:13;58609:10;58598:32;;;;;;;;;;;;;;-1:-1:-1;;;;;;58649:26:0;-1:-1:-1;;;58649:26:0;;-1:-1:-1;;;58080:604:0;;;;;;:::o;37457:125::-;37528:4;37552:17;;;:12;;;;;:17;;;;;;:22;;;37457:125::o;27233:1544::-;27299:4;27438:19;;;:12;;;:19;;;;;;27474:15;;27470:1300;;27909:18;;-1:-1:-1;;27860:14:0;;;;27909:22;;;;27836:21;;27909:3;;:22;;28196;;;;;;;;;;;;;;28176:42;;28342:9;28313:3;:11;;28325:13;28313:26;;;;;;;;;;;;;;;;;;;:38;;;;28419:23;;;28461:1;28419:12;;;:23;;;;;;28445:17;;;28419:43;;28571:17;;28419:3;;28571:17;;;;;;;;;;;;;;;;;;;;;;28666:3;:12;;:19;28679:5;28666:19;;;;;;;;;;;28659:26;;;28709:4;28702:11;;;;;;;;27470:1300;28753:5;28746:12;;;;;26643:414;26706:4;26728:21;26738:3;26743:5;26728:9;:21::i;:::-;26723:327;;-1:-1:-1;27:10;;39:1;23:18;;;45:23;;26766:11:0;:23;;;;;;;;;;;;;26949:18;;26927:19;;;:12;;;:19;;;;;;:40;;;;26982:11;;26723:327;-1:-1:-1;27033:5:0;27026:12;;34957:692;35033:4;35168:17;;;:12;;;:17;;;;;;35202:13;35198:444;;-1:-1:-1;;35287:38:0;;;;;;;;;;;;;;;;;;27:10:-1;;39:1;23:18;;;45:23;;35269:12:0;:57;;;;;;;;;;;;;;;;;;;;;;;;35484:19;;35464:17;;;:12;;;:17;;;;;;;:39;35518:11;;35198:444;35598:5;35562:3;:12;;35586:1;35575:8;:12;35562:26;;;;;;;;;;;;;;;;;;:33;;:41;;;;35625:5;35618:12;;;;;35824:1549;35888:4;36023:17;;;:12;;;:17;;;;;;36057:13;;36053:1313;;36489:19;;-1:-1:-1;;36442:12:0;;;;36489:23;;;;36418:21;;36489:3;;:23;;36786;;;;;;;;;;;;;;;;36757:52;;36934:9;36904:3;:12;;36917:13;36904:27;;;;;;;;;;;;;;;;:39;;:27;;;;;:39;;;;;;;;;;;;;;;37024:14;;37011:28;;:12;;;:28;;;;;37042:17;;;37011:48;;37168:18;;37011:3;;37168:18;;;;;;;;;;;;;;-1:-1:-1;;37168:18:0;;;;;;;;;;;;;;;;;;;;;37264:17;;;:12;;;:17;;;;;;37257:24;;;;37168:18;-1:-1:-1;37298:11:0;;-1:-1:-1;;;;37298:11:0;19639:422;20006:20;20045:8;;;19639:422::o;22557:196::-;22660:12;22692:53;22715:6;22723:4;22729:1;22732:12;24064;24097:18;24108:6;24097:10;:18::i;:::-;24089:60;;;;-1:-1:-1;;;24089:60:0;;;;;;;;;24223:12;24237:23;24264:6;-1:-1:-1;;;;;24264:11:0;24284:8;24295:4;24264:36;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;24222:78:0;;;;24315:7;24311:595;;;24346:10;-1:-1:-1;24339:17:0;;-1:-1:-1;24339:17:0;24311:595;24460:17;;:21;24456:439;;24723:10;24717:17;24784:15;24771:10;24767:2;24763:19;24756:44;24671:148;24866:12;24859:20;;-1:-1:-1;;;24859:20:0;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:130;72:20;;-1:-1;;;;;32067:54;;33104:35;;33094:2;;33153:1;;33143:12;937:440;;1038:3;1031:4;1023:6;1019:17;1015:27;1005:2;;-1:-1;;1046:12;1005:2;1093:6;1080:20;1115:64;1130:48;1171:6;1130:48;;;1115:64;;;1106:73;;1199:6;1192:5;1185:21;1303:3;1235:4;1294:6;1227;1285:16;;1282:25;1279:2;;;1320:1;;1310:12;1279:2;32591:6;1235:4;1227:6;1223:17;1235:4;1261:5;1257:16;32568:30;32647:1;32629:16;;;1235:4;32629:16;32622:27;1261:5;998:379;-1:-1;;998:379;2426:241;;2530:2;2518:9;2509:7;2505:23;2501:32;2498:2;;;-1:-1;;2536:12;2498:2;2598:53;2643:7;2619:22;2598:53;;2674:366;;;2795:2;2783:9;2774:7;2770:23;2766:32;2763:2;;;-1:-1;;2801:12;2763:2;2863:53;2908:7;2884:22;2863:53;;;2853:63;;2971:53;3016:7;2953:2;2996:9;2992:22;2971:53;;;2961:63;;2757:283;;;;;;3047:491;;;;3185:2;3173:9;3164:7;3160:23;3156:32;3153:2;;;-1:-1;;3191:12;3153:2;85:6;72:20;97:33;124:5;97:33;;;3243:63;-1:-1;3343:2;3382:22;;72:20;97:33;72:20;97:33;;;3147:391;;3351:63;;-1:-1;;;3451:2;3490:22;;;;2356:20;;3147:391;3545:721;;;;;3709:3;3697:9;3688:7;3684:23;3680:33;3677:2;;;-1:-1;;3716:12;3677:2;3778:53;3823:7;3799:22;3778:53;;;3768:63;;3886:53;3931:7;3868:2;3911:9;3907:22;3886:53;;;3876:63;;3976:2;4019:9;4015:22;2356:20;3984:63;;4112:2;4101:9;4097:18;4084:32;4136:18;4128:6;4125:30;4122:2;;;-1:-1;;4158:12;4122:2;4188:62;4242:7;4233:6;4222:9;4218:22;4188:62;;;4178:72;;;3671:595;;;;;;;;4273:360;;;4391:2;4379:9;4370:7;4366:23;4362:32;4359:2;;;-1:-1;;4397:12;4359:2;4459:53;4504:7;4480:22;4459:53;;;4449:63;;4549:2;4589:9;4585:22;595:20;33250:5;31828:13;31821:21;33228:5;33225:32;33215:2;;-1:-1;;33261:12;33215:2;4557:60;;;;4353:280;;;;;;4640:366;;;4761:2;4749:9;4740:7;4736:23;4732:32;4729:2;;;-1:-1;;4767:12;4729:2;4829:53;4874:7;4850:22;4829:53;;;4819:63;4919:2;4958:22;;;;2356:20;;-1:-1;;;4723:283;5013:421;;;5164:2;5152:9;5143:7;5139:23;5135:32;5132:2;;;-1:-1;;5170:12;5132:2;5228:17;5215:31;5266:18;;5258:6;5255:30;5252:2;;;-1:-1;;5288:12;5252:2;5401:6;5390:9;5386:22;301:3;294:4;286:6;282:17;278:27;268:2;;-1:-1;;309:12;268:2;352:6;339:20;329:30;;5266:18;371:6;368:30;365:2;;;-1:-1;;401:12;365:2;496:3;5164:2;;480:6;476:17;437:6;462:32;;459:41;456:2;;;-1:-1;;503:12;456:2;5164;433:17;;5316:102;;-1:-1;5126:308;;-1:-1;;;;5126:308;5441:239;;5544:2;5532:9;5523:7;5519:23;5515:32;5512:2;;;-1:-1;;5550:12;5512:2;741:6;728:20;753:32;779:5;753:32;;5687:261;;5801:2;5789:9;5780:7;5776:23;5772:32;5769:2;;;-1:-1;;5807:12;5769:2;880:6;874:13;892:32;918:5;892:32;;5955:347;;6069:2;6057:9;6048:7;6044:23;6040:32;6037:2;;;-1:-1;;6075:12;6037:2;6133:17;6120:31;6171:18;6163:6;6160:30;6157:2;;;-1:-1;;6193:12;6157:2;6223:63;6278:7;6269:6;6258:9;6254:22;6223:63;;6309:362;;6434:2;6422:9;6413:7;6409:23;6405:32;6402:2;;;-1:-1;;6440:12;6402:2;6491:17;6485:24;6529:18;6521:6;6518:30;6515:2;;;-1:-1;;6551:12;6515:2;6638:6;6627:9;6623:22;1950:3;1943:4;1935:6;1931:17;1927:27;1917:2;;-1:-1;;1958:12;1917:2;1998:6;1992:13;1978:27;;2020:65;2035:49;2077:6;2035:49;;2020:65;2105:6;2098:5;2091:21;2209:3;6434:2;2200:6;2133;2191:16;;2188:25;2185:2;;;-1:-1;;2216:12;2185:2;2236:39;2268:6;6434:2;2167:5;2163:16;6434:2;2133:6;2129:17;2236:39;;;6571:84;6396:275;-1:-1;;;;;6396:275;6678:241;;6782:2;6770:9;6761:7;6757:23;6753:32;6750:2;;;-1:-1;;6788:12;6750:2;-1:-1;2356:20;;6744:175;-1:-1;6744:175;6926:472;;;7057:2;7045:9;7036:7;7032:23;7028:32;7025:2;;;-1:-1;;7063:12;7025:2;2369:6;2356:20;7115:63;;7243:2;7232:9;7228:18;7215:32;7267:18;7259:6;7256:30;7253:2;;;-1:-1;;7289:12;7253:2;7319:63;7374:7;7365:6;7354:9;7350:22;7319:63;;;7309:73;;;7019:379;;;;;;7780:343;;7922:5;30738:12;31023:6;31018:3;31011:19;8015:52;8060:6;31060:4;31055:3;31051:14;31060:4;8041:5;8037:16;8015:52;;;33024:7;33008:14;-1:-1;;33004:28;8079:39;;;;31060:4;8079:39;;7870:253;-1:-1;;7870:253;17941:271;;8290:5;30738:12;8401:52;8446:6;8441:3;8434:4;8427:5;8423:16;8401:52;;;8465:16;;;;;18075:137;-1:-1;;18075:137;18219:430;;-1:-1;9545:5;9539:12;9579:1;;9568:9;9564:17;9592:1;9587:268;;;;9866:1;9861:425;;;;9557:729;;9587:268;-1:-1;;9792:25;;9780:38;;9661:1;9646:17;;9665:4;9642:28;9832:16;;;-1:-1;9587:268;;9861:425;9930:1;9919:9;9915:17;30591:3;-1:-1;30581:14;30623:4;;-1:-1;30610:18;-1:-1;10119:130;10133:6;10130:1;10127:13;10119:130;;;10192:14;;10179:11;;;10172:35;10226:15;;;;10148:12;;10119:130;;;-1:-1;;;10263:16;;;-1:-1;9557:729;;;;8290:5;30738:12;8401:52;8446:6;8441:3;8434:4;8427:5;8423:16;8401:52;;;8465:16;;18400:249;-1:-1;;;;18400:249;18656:222;-1:-1;;;;;32067:54;;;;7492:45;;18783:2;18768:18;;18754:124;18885:672;-1:-1;;;;;32067:54;;;7492:45;;32067:54;;19311:2;19296:18;;7492:45;19394:2;19379:18;;17892:37;;;19130:3;19431:2;19416:18;;19409:48;;;18885:672;;19471:76;;19115:19;;19533:6;19471:76;;;19463:84;19101:456;-1:-1;;;;;;19101:456;19564:210;31828:13;;31821:21;7734:34;;19685:2;19670:18;;19656:118;20046:310;;20193:2;20214:17;20207:47;20268:78;20193:2;20182:9;20178:18;20332:6;20268:78;;20363:416;20563:2;20577:47;;;10525:2;20548:18;;;31011:19;10561:34;31051:14;;;10541:55;-1:-1;;;10616:12;;;10609:26;10654:12;;;20534:245;20786:416;20986:2;21000:47;;;10905:2;20971:18;;;31011:19;10941:34;31051:14;;;10921:55;-1:-1;;;10996:12;;;10989:42;11050:12;;;20957:245;21209:416;21409:2;21423:47;;;11301:2;21394:18;;;31011:19;11337:34;31051:14;;;11317:55;-1:-1;;;11392:12;;;11385:30;11434:12;;;21380:245;21632:416;21832:2;21846:47;;;11685:2;21817:18;;;31011:19;11721:30;31051:14;;;11701:51;11771:12;;;21803:245;22055:416;22255:2;22269:47;;;12022:2;22240:18;;;31011:19;12058:34;31051:14;;;12038:55;-1:-1;;;12113:12;;;12106:28;12153:12;;;22226:245;22478:416;22678:2;22692:47;;;12404:2;22663:18;;;31011:19;12440:27;31051:14;;;12420:48;12487:12;;;22649:245;22901:416;23101:2;23115:47;;;12738:2;23086:18;;;31011:19;12774:34;31051:14;;;12754:55;-1:-1;;;12829:12;;;12822:36;12877:12;;;23072:245;23324:416;23524:2;23538:47;;;13128:2;23509:18;;;31011:19;13164:34;31051:14;;;13144:55;13233:26;13219:12;;;13212:48;13279:12;;;23495:245;23747:416;23947:2;23961:47;;;13530:2;23932:18;;;31011:19;13566:34;31051:14;;;13546:55;-1:-1;;;13621:12;;;13614:34;13667:12;;;23918:245;24170:416;24370:2;24384:47;;;13918:2;24355:18;;;31011:19;13954:34;31051:14;;;13934:55;-1:-1;;;14009:12;;;14002:26;14047:12;;;24341:245;24593:416;24793:2;24807:47;;;24778:18;;;31011:19;14334:34;31051:14;;;14314:55;14388:12;;;24764:245;25016:416;25216:2;25230:47;;;14639:2;25201:18;;;31011:19;14675:34;31051:14;;;14655:55;-1:-1;;;14730:12;;;14723:36;14778:12;;;25187:245;25439:416;25639:2;25653:47;;;15029:2;25624:18;;;31011:19;15065:34;31051:14;;;15045:55;-1:-1;;;15120:12;;;15113:36;15168:12;;;25610:245;25862:416;26062:2;26076:47;;;26047:18;;;31011:19;15455:34;31051:14;;;15435:55;15509:12;;;26033:245;26285:416;26485:2;26499:47;;;15760:2;26470:18;;;31011:19;15796:34;31051:14;;;15776:55;-1:-1;;;15851:12;;;15844:33;15896:12;;;26456:245;26708:416;26908:2;26922:47;;;16147:2;26893:18;;;31011:19;16183:34;31051:14;;;16163:55;-1:-1;;;16238:12;;;16231:39;16289:12;;;26879:245;27131:416;27331:2;27345:47;;;16540:2;27316:18;;;31011:19;16576:34;31051:14;;;16556:55;-1:-1;;;16631:12;;;16624:25;16668:12;;;27302:245;27554:416;27754:2;27768:47;;;16919:2;27739:18;;;31011:19;16955:34;31051:14;;;16935:55;-1:-1;;;17010:12;;;17003:41;17063:12;;;27725:245;27977:416;28177:2;28191:47;;;17314:2;28162:18;;;31011:19;17350:31;31051:14;;;17330:52;17401:12;;;28148:245;28400:416;28600:2;28614:47;;;17652:2;28585:18;;;31011:19;17688:34;31051:14;;;17668:55;-1:-1;;;17743:12;;;17736:40;17795:12;;;28571:245;28823:222;17892:37;;;28950:2;28935:18;;28921:124;29052:507;;;29188:11;29175:25;29239:48;;29263:8;29247:14;29243:29;29239:48;29219:18;29215:73;29205:2;;-1:-1;;29292:12;29205:2;29333:18;29323:8;29319:33;29386:4;29373:18;29363:28;;29411:18;29403:6;29400:30;29397:2;;;-1:-1;;29433:12;29397:2;29278:4;29461:13;;-1:-1;;29247:14;29493:38;;;29483:49;;29480:2;;;29545:1;;29535:12;29566:256;29628:2;29622:9;29654:17;;;29729:18;29714:34;;29750:22;;;29711:62;29708:2;;;29786:1;;29776:12;29708:2;29628;29795:22;29606:216;;-1:-1;29606:216;29829:321;;29972:18;29964:6;29961:30;29958:2;;;-1:-1;;29994:12;29958:2;-1:-1;33024:7;30048:17;-1:-1;;30044:33;30135:4;30125:15;;29895:255;32664:268;32729:1;32736:101;32750:6;32747:1;32744:13;32736:101;;;32817:11;;;32811:18;32798:11;;;32791:39;32772:2;32765:10;32736:101;;;32852:6;32849:1;32846:13;32843:2;;;-1:-1;;32729:1;32899:16;;32892:27;32713:219;33045:117;-1:-1;;;;;32067:54;;33104:35;;33094:2;;33153:1;;33143:12;33287:115;-1:-1;;;;;;31915:78;;33345:34;;33335:2;;33393:1;;33383:12
Swarm Source
ipfs://bbc29d21b917fd09fe3090adea0b15c41824ae00482cd67b5b008020933d188c
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.