ERC-721
Overview
Max Total Supply
8,888 RFAC
Holders
885
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
5 RFACLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
RFAC
Compiler Version
v0.8.10+commit.fc410830
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-03-09 */ // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File: @openzeppelin/contracts/utils/math/SafeMath.sol // OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts v4.4.1 (utils/Address.sol) pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; 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"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, 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/extensions/IERC721Enumerable.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: contracts/ERC721a.sol // Creators: locationtba.eth, 2pmflow.eth pragma solidity ^0.8.10; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata and Enumerable extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..). * * Does not support burning tokens to address(0). */ contract ERC721A is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable { using Address for address; using Strings for uint256; struct TokenOwnership { address addr; uint64 startTimestamp; } struct AddressData { uint128 balance; uint128 numberMinted; } uint256 private currentIndex = 0; //save 15000gas starting at 1 uint256 public immutable maxBatchSize; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details. mapping(uint256 => TokenOwnership) private _ownerships; // Mapping owner address to address data mapping(address => AddressData) private _addressData; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev * `maxBatchSize` refers to how much a minter can mint at a time. */ constructor( string memory name_, string memory symbol_, uint256 maxBatchSize_ ) { require(maxBatchSize_ > 0, "ERC721A: size must be nonzero"); _name = name_; _symbol = symbol_; maxBatchSize = maxBatchSize_; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view override returns (uint256) { return currentIndex; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view override returns (uint256) { require(index < totalSupply(), "ERC721A: index out of bounds"); return index; } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first. * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) { require(index < balanceOf(owner), "ERC721A: owner index out of bounds"); uint256 numMintedSoFar = totalSupply(); uint256 tokenIdsIdx = 0; address currOwnershipAddr = address(0); for (uint256 i = 0; i < numMintedSoFar; i++) { TokenOwnership memory ownership = _ownerships[i]; if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { if (tokenIdsIdx == index) { return i; } tokenIdsIdx++; } } revert("ERC721A: unable to get"); } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { require(owner != address(0), "ERC721A: query for 0 addy"); return uint256(_addressData[owner].balance); } function _numberMinted(address owner) internal view returns (uint256) { require( owner != address(0), "ERC721A: number mints for 0 addy" ); return uint256(_addressData[owner].numberMinted); } function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { require(_exists(tokenId), "ERC721A: nonexistent token"); uint256 lowestTokenToCheck; if (tokenId >= maxBatchSize) { lowestTokenToCheck = tokenId - maxBatchSize + 1; } for (uint256 curr = tokenId; curr >= lowestTokenToCheck; curr--) { TokenOwnership memory ownership = _ownerships[curr]; if (ownership.addr != address(0)) { return ownership; } } revert("ERC721A: unable to find owner"); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return ownershipOf(tokenId).addr; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require( _exists(tokenId), "ERC721Metadata: URI query for nonexistent token" ); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = ERC721A.ownerOf(tokenId); require(to != owner, "ERC721A: approval current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721A: approve caller is not owner nor approved for all" ); _approve(to, tokenId, owner); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { require(_exists(tokenId), "ERC721A: approved nonexistent"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public override { require(operator != _msgSender(), "ERC721A: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public override { _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public override { _transfer(from, to, tokenId); require( _checkOnERC721Received(from, to, tokenId, _data), "ERC721A: 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`), */ function _exists(uint256 tokenId) internal view returns (bool) { return tokenId < currentIndex; } function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ""); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` cannot be larger than the max batch size. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { uint256 startTokenId = currentIndex; require(to != address(0), "ERC721A: mint to the 0 addy"); // We know if the first token in the batch doesn't exist, the other ones don't as well, because of serial ordering. require(!_exists(startTokenId), "ERC721A: token already minted"); require(quantity <= maxBatchSize, "ERC721A: quantity mint too high"); _beforeTokenTransfers(address(0), to, startTokenId, quantity); AddressData memory addressData = _addressData[to]; _addressData[to] = AddressData( addressData.balance + uint128(quantity), addressData.numberMinted + uint128(quantity) ); _ownerships[startTokenId] = TokenOwnership(to, uint64(block.timestamp)); uint256 updatedIndex = startTokenId; for (uint256 i = 0; i < quantity; i++) { emit Transfer(address(0), to, updatedIndex); require( _checkOnERC721Received(address(0), to, updatedIndex, _data), "ERC721A: transfer to non ERC721Receiver implementer" ); updatedIndex++; } currentIndex = updatedIndex; _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Transfers `tokenId` from `from` to `to`. * * 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 ) private { TokenOwnership memory prevOwnership = ownershipOf(tokenId); bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr || getApproved(tokenId) == _msgSender() || isApprovedForAll(prevOwnership.addr, _msgSender())); require( isApprovedOrOwner, "ERC721A: transfer caller is not owner nor approved" ); require( prevOwnership.addr == from, "ERC721A: transfer from incorrect owner" ); require(to != address(0), "ERC721A: transfer to 0 addy"); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, prevOwnership.addr); _addressData[from].balance -= 1; _addressData[to].balance += 1; _ownerships[tokenId] = TokenOwnership(to, uint64(block.timestamp)); // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; if (_ownerships[nextTokenId].addr == address(0)) { if (_exists(nextTokenId)) { _ownerships[nextTokenId] = TokenOwnership( prevOwnership.addr, prevOwnership.startTimestamp ); } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve( address to, uint256 tokenId, address owner ) private { _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } uint256 public nextOwnerToExplicitlySet = 0; /** * @dev Explicitly set `owners` to eliminate loops in future calls of ownerOf(). */ function _setOwnersExplicit(uint256 quantity) internal { uint256 oldNextOwnerToSet = nextOwnerToExplicitlySet; require(quantity > 0, "quantity must be nonzero"); uint256 endIndex = oldNextOwnerToSet + quantity - 1; if (endIndex > currentIndex - 1) { endIndex = currentIndex - 1; } // We know if the last one in the group exists, all in the group exist, due to serial ordering. require(_exists(endIndex), "not enough minted yet for this cleanup"); for (uint256 i = oldNextOwnerToSet; i <= endIndex; i++) { if (_ownerships[i].addr == address(0)) { TokenOwnership memory ownership = ownershipOf(i); _ownerships[i] = TokenOwnership( ownership.addr, ownership.startTimestamp ); } } nextOwnerToExplicitlySet = endIndex + 1; } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721A: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * 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`. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes * minting. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} } // File: contracts/RFAC.sol //SPDX-License-Identifier: MIT pragma solidity ^0.8.10; contract RFAC is ERC721A{ using SafeMath for uint256; using Strings for uint256; IERC20 public rfacToken; uint256 public priceInTokens; uint256 public maxSupply; uint256 public maxMint; uint256 public redrawSupply; uint256 public nFreeMints; uint256 public price; address payable public owner; string baseURI; uint256 public mintState; mapping(address => uint256) private vipList; mapping(uint256 => uint256) private redrawnToken; uint256 public nRedrawn; constructor() ERC721A("Royal Flush Ape Club","RFAC", 200){ maxSupply = 8888; maxMint = 5; redrawSupply = 2222; nFreeMints = 1111; nRedrawn = 0; price = 0.05 ether; mintState = 2; //1 - paused for all, 2 - vip, 3 - public, 4 - redrawWithToken enabled , 5 - redrawWithEth enabled owner = payable(msg.sender); } function _baseURI() internal view virtual override returns (string memory) { return baseURI; } function mintPublic(uint256 amt) external payable{ require(mintState > 2, "Public sale not open."); if(totalSupply() > nFreeMints){ require(msg.value == price*amt, "Incorrect Amount of Eth sent."); } require(totalSupply() + amt <= maxSupply, "Sorry, Sold Out"); require(amt <= maxMint,"Too many mints per transaction"); _safeMint(_msgSender(),amt); } function mintVIP(uint256 amt) external payable { require(mintState > 1, "VIP list is not active"); require(amt <= vipList[msg.sender], "Exceeded max available to purchase"); require(totalSupply() + amt <= maxSupply, "Purchase would exceed max tokens"); if(totalSupply() > nFreeMints){ require(msg.value == price*amt, "Incorrect Amount of Eth sent."); } vipList[msg.sender] -= amt; _safeMint(_msgSender(),amt); } function tokenURI(uint256 tokenId) public view virtual override returns (string memory){ require(_exists(tokenId),"ERC721: nonexistent token"); string memory currentBaseURI = _baseURI(); if(redrawnToken[tokenId]>0){ return bytes(currentBaseURI).length > 0 ? string(abi.encodePacked(currentBaseURI, uintToString(redrawnToken[tokenId]))) : ""; }else{ return bytes(currentBaseURI).length > 0 ? string(abi.encodePacked(currentBaseURI, uintToString(tokenId))) : ""; } } function redrawWithToken(uint256 _tokenId) external payable{ require(mintState > 3, "No redraws yet"); require(msg.sender == ownerOf(_tokenId),"You don't own this Token"); require(rfacToken.transferFrom(msg.sender, address(this), priceInTokens), "Error with token transfer"); require(nRedrawn < redrawSupply,"No more cards in Deck"); redrawnToken[_tokenId] = maxSupply + nRedrawn; nRedrawn++; } function uintToString(uint _i) internal pure returns (string memory _uintAsString) { if (_i == 0) { return "0"; } uint j = _i; uint len; while (j != 0) { len++; j /= 10; } bytes memory bstr = new bytes(len); uint k = len; while (_i != 0) { k = k-1; uint8 temp = (48 + uint8(_i - _i / 10 * 10)); bytes1 b1 = bytes1(temp); bstr[k] = b1; _i /= 10; } return string(bstr); } //only owner modifier onlyOwner(){ require(msg.sender == owner,"not owner"); _; } function withdraw() external payable onlyOwner{ uint amount = address(this).balance; (bool success, ) = owner.call{value: amount}(""); require(success, "Failed to send Ether"); } function setPrice(uint32 _newPrice) external onlyOwner { price = _newPrice; } function setMaxSupply(uint32 _newMax) external onlyOwner { maxSupply = _newMax; } function setRedrawSupply(uint32 _newSupply) external onlyOwner { redrawSupply = _newSupply; } function setPriceInTokens(uint32 _newPrice) external onlyOwner { priceInTokens = _newPrice; } function setVipList(address[] calldata _addresses, uint8 _numAllowedToMint) external onlyOwner { for (uint256 i = 0; i < _addresses.length; i++) { vipList[_addresses[i]] = _numAllowedToMint; } } function setBaseURI(string memory _newBaseURI) external onlyOwner { baseURI = _newBaseURI; } function setMintState(uint256 _state) external onlyOwner { mintState = _state; } function setTokenAddress(address _tokenAddress) external onlyOwner { rfacToken = IERC20(_tokenAddress); } }
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":"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":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxBatchSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"mintPublic","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintState","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"mintVIP","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"nFreeMints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nRedrawn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextOwnerToExplicitlySet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"priceInTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"redrawSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"redrawWithToken","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"rfacToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_newMax","type":"uint32"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_state","type":"uint256"}],"name":"setMintState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_newPrice","type":"uint32"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_newPrice","type":"uint32"}],"name":"setPriceInTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_newSupply","type":"uint32"}],"name":"setRedrawSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"}],"name":"setTokenAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"},{"internalType":"uint8","name":"_numAllowedToMint","type":"uint8"}],"name":"setVipList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]
Contract Creation Code
60a06040526000805560006007553480156200001a57600080fd5b506040518060400160405280601481526020017f526f79616c20466c7573682041706520436c7562000000000000000000000000815250604051806040016040528060048152602001635246414360e01b81525060c860008111620000c55760405162461bcd60e51b815260206004820152601d60248201527f455243373231413a2073697a65206d757374206265206e6f6e7a65726f000000604482015260640160405180910390fd5b8251620000da9060019060208601906200013a565b508151620000f09060029060208501906200013a565b5060805250506122b8600a556005600b556108ae600c55610457600d55600060145566b1a2bc2ec50000600e556002601155600f80546001600160a01b031916331790556200021d565b8280546200014890620001e0565b90600052602060002090601f0160209004810192826200016c5760008555620001b7565b82601f106200018757805160ff1916838001178555620001b7565b82800160010185558215620001b7579182015b82811115620001b75782518255916020019190600101906200019a565b50620001c5929150620001c9565b5090565b5b80821115620001c55760008155600101620001ca565b600181811c90821680620001f557607f821691505b602082108114156200021757634e487b7160e01b600052602260045260246000fd5b50919050565b6080516127896200024e600039600081816103ab01528181611a5901528181611a830152611e5301526127896000f3fe60806040526004361061023b5760003560e01c80636c9b98dd1161012e578063bad444da116100ab578063daafe0a51161006f578063daafe0a514610657578063dd080d7f14610677578063e985e9c51461068d578063efd0cbf9146106d6578063f9da3224146106e957600080fd5b8063bad444da146105df578063c051e38a146105f5578063c87b56dd1461060b578063d5abeb011461062b578063d7224ba01461064157600080fd5b806395d89b41116100f257806395d89b4114610554578063a035b1fe14610569578063a22cb4651461057f578063b2cbbee31461059f578063b88d4fde146105bf57600080fd5b80636c9b98dd146104c857806370a08231146104e85780637501f741146105085780638750c2d71461051e5780638da5cb5b1461053457600080fd5b80632913daa0116101bc57806342842e0e1161018057806342842e0e146104285780634f6ccce71461044857806355cd0c8e1461046857806355f804b3146104885780636352211e146104a857600080fd5b80632913daa0146103995780632f745c59146103cd578063327b0055146103ed57806338a86378146104005780633ccfd60b1461042057600080fd5b806318160ddd1161020357806318160ddd14610311578063231931bd1461033057806323b872dd1461034357806326a4e8d2146103635780632844274b1461038357600080fd5b806301ffc9a71461024057806306fdde0314610275578063081812fc14610297578063095ea7b3146102cf5780630bb862d1146102f1575b600080fd5b34801561024c57600080fd5b5061026061025b36600461210c565b610709565b60405190151581526020015b60405180910390f35b34801561028157600080fd5b5061028a610776565b60405161026c9190612181565b3480156102a357600080fd5b506102b76102b2366004612194565b610808565b6040516001600160a01b03909116815260200161026c565b3480156102db57600080fd5b506102ef6102ea3660046121c9565b610882565b005b3480156102fd57600080fd5b506102ef61030c366004612194565b61098f565b34801561031d57600080fd5b506000545b60405190815260200161026c565b6102ef61033e366004612194565b6109be565b34801561034f57600080fd5b506102ef61035e3660046121f3565b610b73565b34801561036f57600080fd5b506102ef61037e36600461222f565b610b7e565b34801561038f57600080fd5b50610322600d5481565b3480156103a557600080fd5b506103227f000000000000000000000000000000000000000000000000000000000000000081565b3480156103d957600080fd5b506103226103e83660046121c9565b610bca565b6102ef6103fb366004612194565b610d1a565b34801561040c57600080fd5b506102ef61041b36600461224a565b610f14565b6102ef610f49565b34801561043457600080fd5b506102ef6104433660046121f3565b611015565b34801561045457600080fd5b50610322610463366004612194565b611030565b34801561047457600080fd5b506008546102b7906001600160a01b031681565b34801561049457600080fd5b506102ef6104a33660046122fc565b611086565b3480156104b457600080fd5b506102b76104c3366004612194565b6110c3565b3480156104d457600080fd5b506102ef6104e3366004612345565b6110d5565b3480156104f457600080fd5b5061032261050336600461222f565b61116b565b34801561051457600080fd5b50610322600b5481565b34801561052a57600080fd5b5061032260095481565b34801561054057600080fd5b50600f546102b7906001600160a01b031681565b34801561056057600080fd5b5061028a6111e8565b34801561057557600080fd5b50610322600e5481565b34801561058b57600080fd5b506102ef61059a3660046123df565b6111f7565b3480156105ab57600080fd5b506102ef6105ba36600461224a565b6112bc565b3480156105cb57600080fd5b506102ef6105da366004612416565b6112f1565b3480156105eb57600080fd5b50610322600c5481565b34801561060157600080fd5b5061032260115481565b34801561061757600080fd5b5061028a610626366004612194565b611324565b34801561063757600080fd5b50610322600a5481565b34801561064d57600080fd5b5061032260075481565b34801561066357600080fd5b506102ef61067236600461224a565b61142c565b34801561068357600080fd5b5061032260145481565b34801561069957600080fd5b506102606106a8366004612492565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b6102ef6106e4366004612194565b611461565b3480156106f557600080fd5b506102ef61070436600461224a565b6115c5565b60006001600160e01b031982166380ac58cd60e01b148061073a57506001600160e01b03198216635b5e139f60e01b145b8061075557506001600160e01b0319821663780e9d6360e01b145b8061077057506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060018054610785906124c5565b80601f01602080910402602001604051908101604052809291908181526020018280546107b1906124c5565b80156107fe5780601f106107d3576101008083540402835291602001916107fe565b820191906000526020600020905b8154815290600101906020018083116107e157829003601f168201915b5050505050905090565b6000610815826000541190565b6108665760405162461bcd60e51b815260206004820152601d60248201527f455243373231413a20617070726f766564206e6f6e6578697374656e7400000060448201526064015b60405180910390fd5b506000908152600560205260409020546001600160a01b031690565b600061088d826110c3565b9050806001600160a01b0316836001600160a01b031614156108f15760405162461bcd60e51b815260206004820152601f60248201527f455243373231413a20617070726f76616c2063757272656e74206f776e657200604482015260640161085d565b336001600160a01b038216148061090d575061090d81336106a8565b61097f5760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000606482015260840161085d565b61098a8383836115fa565b505050565b600f546001600160a01b031633146109b95760405162461bcd60e51b815260040161085d906124fa565b601155565b600160115411610a095760405162461bcd60e51b8152602060048201526016602482015275564950206c697374206973206e6f742061637469766560501b604482015260640161085d565b33600090815260126020526040902054811115610a735760405162461bcd60e51b815260206004820152602260248201527f4578636565646564206d617820617661696c61626c6520746f20707572636861604482015261736560f01b606482015260840161085d565b600a5481610a8060005490565b610a8a9190612533565b1115610ad85760405162461bcd60e51b815260206004820181905260248201527f507572636861736520776f756c6420657863656564206d617820746f6b656e73604482015260640161085d565b600d546000541115610b405780600e54610af2919061254b565b3414610b405760405162461bcd60e51b815260206004820152601d60248201527f496e636f727265637420416d6f756e74206f66204574682073656e742e000000604482015260640161085d565b3360009081526012602052604081208054839290610b5f90849061256a565b90915550610b709050335b82611656565b50565b61098a838383611670565b600f546001600160a01b03163314610ba85760405162461bcd60e51b815260040161085d906124fa565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b6000610bd58361116b565b8210610c2e5760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604482015261647360f01b606482015260840161085d565b600080549080805b83811015610cd8576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915215610c8957805192505b876001600160a01b0316836001600160a01b03161415610cc55786841415610cb75750935061077092505050565b83610cc181612581565b9450505b5080610cd081612581565b915050610c36565b5060405162461bcd60e51b8152602060048201526016602482015275115490cdcc8c504e881d5b98589b19481d1bc819d95d60521b604482015260640161085d565b600360115411610d5d5760405162461bcd60e51b815260206004820152600e60248201526d139bc81c99591c985ddcc81e595d60921b604482015260640161085d565b610d66816110c3565b6001600160a01b0316336001600160a01b031614610dc65760405162461bcd60e51b815260206004820152601860248201527f596f7520646f6e2774206f776e207468697320546f6b656e0000000000000000604482015260640161085d565b6008546009546040516323b872dd60e01b815233600482015230602482015260448101919091526001600160a01b03909116906323b872dd906064016020604051808303816000875af1158015610e21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e45919061259c565b610e915760405162461bcd60e51b815260206004820152601960248201527f4572726f72207769746820746f6b656e207472616e7366657200000000000000604482015260640161085d565b600c5460145410610edc5760405162461bcd60e51b81526020600482015260156024820152744e6f206d6f726520636172647320696e204465636b60581b604482015260640161085d565b601454600a54610eec9190612533565b6000828152601360205260408120919091556014805491610f0c83612581565b919050555050565b600f546001600160a01b03163314610f3e5760405162461bcd60e51b815260040161085d906124fa565b63ffffffff16600955565b600f546001600160a01b03163314610f735760405162461bcd60e51b815260040161085d906124fa565b600f5460405147916000916001600160a01b039091169083908381818185875af1925050503d8060008114610fc4576040519150601f19603f3d011682016040523d82523d6000602084013e610fc9565b606091505b50509050806110115760405162461bcd60e51b81526020600482015260146024820152732330b4b632b2103a379039b2b7321022ba3432b960611b604482015260640161085d565b5050565b61098a838383604051806020016040528060008152506112f1565b6000805482106110825760405162461bcd60e51b815260206004820152601c60248201527f455243373231413a20696e646578206f7574206f6620626f756e647300000000604482015260640161085d565b5090565b600f546001600160a01b031633146110b05760405162461bcd60e51b815260040161085d906124fa565b8051611011906010906020840190612066565b60006110ce826119ea565b5192915050565b600f546001600160a01b031633146110ff5760405162461bcd60e51b815260040161085d906124fa565b60005b82811015611165578160ff1660126000868685818110611124576111246125b9565b9050602002016020810190611139919061222f565b6001600160a01b031681526020810191909152604001600020558061115d81612581565b915050611102565b50505050565b60006001600160a01b0382166111c35760405162461bcd60e51b815260206004820152601960248201527f455243373231413a20717565727920666f722030206164647900000000000000604482015260640161085d565b506001600160a01b03166000908152600460205260409020546001600160801b031690565b606060028054610785906124c5565b6001600160a01b0382163314156112505760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c6572000000000000604482015260640161085d565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600f546001600160a01b031633146112e65760405162461bcd60e51b815260040161085d906124fa565b63ffffffff16600c55565b6112fc848484611670565b61130884848484611b69565b6111655760405162461bcd60e51b815260040161085d906125cf565b6060611331826000541190565b61137d5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a206e6f6e6578697374656e7420746f6b656e00000000000000604482015260640161085d565b6000611387611c68565b600084815260136020526040902054909150156113fe5760008151116113bc57604051806020016040528060008152506113f7565b60008381526013602052604090205481906113d690611c77565b6040516020016113e7929190612622565b6040516020818303038152906040525b9392505050565b600081511161141c57604051806020016040528060008152506113f7565b806113d684611c77565b50919050565b600f546001600160a01b031633146114565760405162461bcd60e51b815260040161085d906124fa565b63ffffffff16600e55565b6002601154116114ab5760405162461bcd60e51b8152602060048201526015602482015274283ab13634b19039b0b632903737ba1037b832b71760591b604482015260640161085d565b600d5460005411156115135780600e546114c5919061254b565b34146115135760405162461bcd60e51b815260206004820152601d60248201527f496e636f727265637420416d6f756e74206f66204574682073656e742e000000604482015260640161085d565b600a548161152060005490565b61152a9190612533565b111561156a5760405162461bcd60e51b815260206004820152600f60248201526e14dbdc9c9e4b0814dbdb190813dd5d608a1b604482015260640161085d565b600b548111156115bc5760405162461bcd60e51b815260206004820152601e60248201527f546f6f206d616e79206d696e747320706572207472616e73616374696f6e0000604482015260640161085d565b610b7033610b6a565b600f546001600160a01b031633146115ef5760405162461bcd60e51b815260040161085d906124fa565b63ffffffff16600a55565b60008281526005602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b611011828260405180602001604052806000815250611da0565b600061167b826119ea565b80519091506000906001600160a01b0316336001600160a01b031614806116b25750336116a784610808565b6001600160a01b0316145b806116c4575081516116c490336106a8565b90508061172e5760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b606482015260840161085d565b846001600160a01b031682600001516001600160a01b0316146117a25760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b606482015260840161085d565b6001600160a01b0384166117f85760405162461bcd60e51b815260206004820152601b60248201527f455243373231413a207472616e7366657220746f203020616464790000000000604482015260640161085d565b61180860008484600001516115fa565b6001600160a01b038516600090815260046020526040812080546001929061183a9084906001600160801b0316612651565b82546101009290920a6001600160801b038181021990931691831602179091556001600160a01b0386166000908152600460205260408120805460019450909261188691859116612679565b82546001600160801b039182166101009390930a9283029190920219909116179055506040805180820182526001600160a01b03808716825267ffffffffffffffff428116602080850191825260008981526003909152948520935184549151909216600160a01b026001600160e01b0319909116919092161717905561190e846001612533565b6000818152600360205260409020549091506001600160a01b03166119a057611938816000541190565b156119a05760408051808201825284516001600160a01b03908116825260208087015167ffffffffffffffff9081168285019081526000878152600390935294909120925183549451909116600160a01b026001600160e01b03199094169116179190911790555b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b6040805180820190915260008082526020820152611a09826000541190565b611a555760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a206e6f6e6578697374656e7420746f6b656e000000000000604482015260640161085d565b60007f00000000000000000000000000000000000000000000000000000000000000008310611ab657611aa87f00000000000000000000000000000000000000000000000000000000000000008461256a565b611ab3906001612533565b90505b825b818110611b20576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915215611b0d57949350505050565b5080611b188161269b565b915050611ab8565b5060405162461bcd60e51b815260206004820152601d60248201527f455243373231413a20756e61626c6520746f2066696e64206f776e6572000000604482015260640161085d565b60006001600160a01b0384163b15611c5c57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611bad9033908990889088906004016126b2565b6020604051808303816000875af1925050508015611be8575060408051601f3d908101601f19168201909252611be5918101906126ef565b60015b611c42573d808015611c16576040519150601f19603f3d011682016040523d82523d6000602084013e611c1b565b606091505b508051611c3a5760405162461bcd60e51b815260040161085d906125cf565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611c60565b5060015b949350505050565b606060108054610785906124c5565b606081611c9b5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611cc55780611caf81612581565b9150611cbe9050600a8361270c565b9150611c9f565b60008167ffffffffffffffff811115611ce057611ce0612270565b6040519080825280601f01601f191660200182016040528015611d0a576020820181803683370190505b509050815b8515611d9757611d2060018261256a565b90506000611d2f600a8861270c565b611d3a90600a61254b565b611d44908861256a565b611d4f90603061272e565b905060008160f81b905080848481518110611d6c57611d6c6125b9565b60200101906001600160f81b031916908160001a905350611d8e600a8961270c565b97505050611d0f565b50949350505050565b6000546001600160a01b038416611df95760405162461bcd60e51b815260206004820152601b60248201527f455243373231413a206d696e7420746f20746865203020616464790000000000604482015260640161085d565b611e04816000541190565b15611e515760405162461bcd60e51b815260206004820152601d60248201527f455243373231413a20746f6b656e20616c7265616479206d696e746564000000604482015260640161085d565b7f0000000000000000000000000000000000000000000000000000000000000000831115611ec15760405162461bcd60e51b815260206004820152601f60248201527f455243373231413a207175616e74697479206d696e7420746f6f206869676800604482015260640161085d565b6001600160a01b0384166000908152600460209081526040918290208251808401845290546001600160801b038082168352600160801b9091041691810191909152815180830190925280519091908190611f1d908790612679565b6001600160801b03168152602001858360200151611f3b9190612679565b6001600160801b039081169091526001600160a01b0380881660008181526004602090815260408083208751978301518716600160801b0297909616969096179094558451808601865291825267ffffffffffffffff4281168386019081528883526003909552948120915182549451909516600160a01b026001600160e01b031990941694909216939093179190911790915582905b8581101561205b5760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a461201f6000888488611b69565b61203b5760405162461bcd60e51b815260040161085d906125cf565b8161204581612581565b925050808061205390612581565b915050611fd2565b5060008190556119e2565b828054612072906124c5565b90600052602060002090601f01602090048101928261209457600085556120da565b82601f106120ad57805160ff19168380011785556120da565b828001600101855582156120da579182015b828111156120da5782518255916020019190600101906120bf565b506110829291505b8082111561108257600081556001016120e2565b6001600160e01b031981168114610b7057600080fd5b60006020828403121561211e57600080fd5b81356113f7816120f6565b60005b8381101561214457818101518382015260200161212c565b838111156111655750506000910152565b6000815180845261216d816020860160208601612129565b601f01601f19169290920160200192915050565b6020815260006113f76020830184612155565b6000602082840312156121a657600080fd5b5035919050565b80356001600160a01b03811681146121c457600080fd5b919050565b600080604083850312156121dc57600080fd5b6121e5836121ad565b946020939093013593505050565b60008060006060848603121561220857600080fd5b612211846121ad565b925061221f602085016121ad565b9150604084013590509250925092565b60006020828403121561224157600080fd5b6113f7826121ad565b60006020828403121561225c57600080fd5b813563ffffffff811681146113f757600080fd5b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff808411156122a1576122a1612270565b604051601f8501601f19908116603f011681019082821181831017156122c9576122c9612270565b816040528093508581528686860111156122e257600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561230e57600080fd5b813567ffffffffffffffff81111561232557600080fd5b8201601f8101841361233657600080fd5b611c6084823560208401612286565b60008060006040848603121561235a57600080fd5b833567ffffffffffffffff8082111561237257600080fd5b818601915086601f83011261238657600080fd5b81358181111561239557600080fd5b8760208260051b85010111156123aa57600080fd5b6020928301955093505084013560ff811681146123c657600080fd5b809150509250925092565b8015158114610b7057600080fd5b600080604083850312156123f257600080fd5b6123fb836121ad565b9150602083013561240b816123d1565b809150509250929050565b6000806000806080858703121561242c57600080fd5b612435856121ad565b9350612443602086016121ad565b925060408501359150606085013567ffffffffffffffff81111561246657600080fd5b8501601f8101871361247757600080fd5b61248687823560208401612286565b91505092959194509250565b600080604083850312156124a557600080fd5b6124ae836121ad565b91506124bc602084016121ad565b90509250929050565b600181811c908216806124d957607f821691505b6020821081141561142657634e487b7160e01b600052602260045260246000fd5b6020808252600990820152683737ba1037bbb732b960b91b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600082198211156125465761254661251d565b500190565b60008160001904831182151516156125655761256561251d565b500290565b60008282101561257c5761257c61251d565b500390565b60006000198214156125955761259561251d565b5060010190565b6000602082840312156125ae57600080fd5b81516113f7816123d1565b634e487b7160e01b600052603260045260246000fd5b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b60008351612634818460208801612129565b835190830190612648818360208801612129565b01949350505050565b60006001600160801b03838116908316818110156126715761267161251d565b039392505050565b60006001600160801b038083168185168083038211156126485761264861251d565b6000816126aa576126aa61251d565b506000190190565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906126e590830184612155565b9695505050505050565b60006020828403121561270157600080fd5b81516113f7816120f6565b60008261272957634e487b7160e01b600052601260045260246000fd5b500490565b600060ff821660ff84168060ff0382111561274b5761274b61251d565b01939250505056fea264697066735822122086f2511d0c8ab59c7c1c6039cd9c693620f4b7fbc7ed5122e8683e3f00aad91464736f6c634300080a0033
Deployed Bytecode
0x60806040526004361061023b5760003560e01c80636c9b98dd1161012e578063bad444da116100ab578063daafe0a51161006f578063daafe0a514610657578063dd080d7f14610677578063e985e9c51461068d578063efd0cbf9146106d6578063f9da3224146106e957600080fd5b8063bad444da146105df578063c051e38a146105f5578063c87b56dd1461060b578063d5abeb011461062b578063d7224ba01461064157600080fd5b806395d89b41116100f257806395d89b4114610554578063a035b1fe14610569578063a22cb4651461057f578063b2cbbee31461059f578063b88d4fde146105bf57600080fd5b80636c9b98dd146104c857806370a08231146104e85780637501f741146105085780638750c2d71461051e5780638da5cb5b1461053457600080fd5b80632913daa0116101bc57806342842e0e1161018057806342842e0e146104285780634f6ccce71461044857806355cd0c8e1461046857806355f804b3146104885780636352211e146104a857600080fd5b80632913daa0146103995780632f745c59146103cd578063327b0055146103ed57806338a86378146104005780633ccfd60b1461042057600080fd5b806318160ddd1161020357806318160ddd14610311578063231931bd1461033057806323b872dd1461034357806326a4e8d2146103635780632844274b1461038357600080fd5b806301ffc9a71461024057806306fdde0314610275578063081812fc14610297578063095ea7b3146102cf5780630bb862d1146102f1575b600080fd5b34801561024c57600080fd5b5061026061025b36600461210c565b610709565b60405190151581526020015b60405180910390f35b34801561028157600080fd5b5061028a610776565b60405161026c9190612181565b3480156102a357600080fd5b506102b76102b2366004612194565b610808565b6040516001600160a01b03909116815260200161026c565b3480156102db57600080fd5b506102ef6102ea3660046121c9565b610882565b005b3480156102fd57600080fd5b506102ef61030c366004612194565b61098f565b34801561031d57600080fd5b506000545b60405190815260200161026c565b6102ef61033e366004612194565b6109be565b34801561034f57600080fd5b506102ef61035e3660046121f3565b610b73565b34801561036f57600080fd5b506102ef61037e36600461222f565b610b7e565b34801561038f57600080fd5b50610322600d5481565b3480156103a557600080fd5b506103227f00000000000000000000000000000000000000000000000000000000000000c881565b3480156103d957600080fd5b506103226103e83660046121c9565b610bca565b6102ef6103fb366004612194565b610d1a565b34801561040c57600080fd5b506102ef61041b36600461224a565b610f14565b6102ef610f49565b34801561043457600080fd5b506102ef6104433660046121f3565b611015565b34801561045457600080fd5b50610322610463366004612194565b611030565b34801561047457600080fd5b506008546102b7906001600160a01b031681565b34801561049457600080fd5b506102ef6104a33660046122fc565b611086565b3480156104b457600080fd5b506102b76104c3366004612194565b6110c3565b3480156104d457600080fd5b506102ef6104e3366004612345565b6110d5565b3480156104f457600080fd5b5061032261050336600461222f565b61116b565b34801561051457600080fd5b50610322600b5481565b34801561052a57600080fd5b5061032260095481565b34801561054057600080fd5b50600f546102b7906001600160a01b031681565b34801561056057600080fd5b5061028a6111e8565b34801561057557600080fd5b50610322600e5481565b34801561058b57600080fd5b506102ef61059a3660046123df565b6111f7565b3480156105ab57600080fd5b506102ef6105ba36600461224a565b6112bc565b3480156105cb57600080fd5b506102ef6105da366004612416565b6112f1565b3480156105eb57600080fd5b50610322600c5481565b34801561060157600080fd5b5061032260115481565b34801561061757600080fd5b5061028a610626366004612194565b611324565b34801561063757600080fd5b50610322600a5481565b34801561064d57600080fd5b5061032260075481565b34801561066357600080fd5b506102ef61067236600461224a565b61142c565b34801561068357600080fd5b5061032260145481565b34801561069957600080fd5b506102606106a8366004612492565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b6102ef6106e4366004612194565b611461565b3480156106f557600080fd5b506102ef61070436600461224a565b6115c5565b60006001600160e01b031982166380ac58cd60e01b148061073a57506001600160e01b03198216635b5e139f60e01b145b8061075557506001600160e01b0319821663780e9d6360e01b145b8061077057506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060018054610785906124c5565b80601f01602080910402602001604051908101604052809291908181526020018280546107b1906124c5565b80156107fe5780601f106107d3576101008083540402835291602001916107fe565b820191906000526020600020905b8154815290600101906020018083116107e157829003601f168201915b5050505050905090565b6000610815826000541190565b6108665760405162461bcd60e51b815260206004820152601d60248201527f455243373231413a20617070726f766564206e6f6e6578697374656e7400000060448201526064015b60405180910390fd5b506000908152600560205260409020546001600160a01b031690565b600061088d826110c3565b9050806001600160a01b0316836001600160a01b031614156108f15760405162461bcd60e51b815260206004820152601f60248201527f455243373231413a20617070726f76616c2063757272656e74206f776e657200604482015260640161085d565b336001600160a01b038216148061090d575061090d81336106a8565b61097f5760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000606482015260840161085d565b61098a8383836115fa565b505050565b600f546001600160a01b031633146109b95760405162461bcd60e51b815260040161085d906124fa565b601155565b600160115411610a095760405162461bcd60e51b8152602060048201526016602482015275564950206c697374206973206e6f742061637469766560501b604482015260640161085d565b33600090815260126020526040902054811115610a735760405162461bcd60e51b815260206004820152602260248201527f4578636565646564206d617820617661696c61626c6520746f20707572636861604482015261736560f01b606482015260840161085d565b600a5481610a8060005490565b610a8a9190612533565b1115610ad85760405162461bcd60e51b815260206004820181905260248201527f507572636861736520776f756c6420657863656564206d617820746f6b656e73604482015260640161085d565b600d546000541115610b405780600e54610af2919061254b565b3414610b405760405162461bcd60e51b815260206004820152601d60248201527f496e636f727265637420416d6f756e74206f66204574682073656e742e000000604482015260640161085d565b3360009081526012602052604081208054839290610b5f90849061256a565b90915550610b709050335b82611656565b50565b61098a838383611670565b600f546001600160a01b03163314610ba85760405162461bcd60e51b815260040161085d906124fa565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b6000610bd58361116b565b8210610c2e5760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604482015261647360f01b606482015260840161085d565b600080549080805b83811015610cd8576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915215610c8957805192505b876001600160a01b0316836001600160a01b03161415610cc55786841415610cb75750935061077092505050565b83610cc181612581565b9450505b5080610cd081612581565b915050610c36565b5060405162461bcd60e51b8152602060048201526016602482015275115490cdcc8c504e881d5b98589b19481d1bc819d95d60521b604482015260640161085d565b600360115411610d5d5760405162461bcd60e51b815260206004820152600e60248201526d139bc81c99591c985ddcc81e595d60921b604482015260640161085d565b610d66816110c3565b6001600160a01b0316336001600160a01b031614610dc65760405162461bcd60e51b815260206004820152601860248201527f596f7520646f6e2774206f776e207468697320546f6b656e0000000000000000604482015260640161085d565b6008546009546040516323b872dd60e01b815233600482015230602482015260448101919091526001600160a01b03909116906323b872dd906064016020604051808303816000875af1158015610e21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e45919061259c565b610e915760405162461bcd60e51b815260206004820152601960248201527f4572726f72207769746820746f6b656e207472616e7366657200000000000000604482015260640161085d565b600c5460145410610edc5760405162461bcd60e51b81526020600482015260156024820152744e6f206d6f726520636172647320696e204465636b60581b604482015260640161085d565b601454600a54610eec9190612533565b6000828152601360205260408120919091556014805491610f0c83612581565b919050555050565b600f546001600160a01b03163314610f3e5760405162461bcd60e51b815260040161085d906124fa565b63ffffffff16600955565b600f546001600160a01b03163314610f735760405162461bcd60e51b815260040161085d906124fa565b600f5460405147916000916001600160a01b039091169083908381818185875af1925050503d8060008114610fc4576040519150601f19603f3d011682016040523d82523d6000602084013e610fc9565b606091505b50509050806110115760405162461bcd60e51b81526020600482015260146024820152732330b4b632b2103a379039b2b7321022ba3432b960611b604482015260640161085d565b5050565b61098a838383604051806020016040528060008152506112f1565b6000805482106110825760405162461bcd60e51b815260206004820152601c60248201527f455243373231413a20696e646578206f7574206f6620626f756e647300000000604482015260640161085d565b5090565b600f546001600160a01b031633146110b05760405162461bcd60e51b815260040161085d906124fa565b8051611011906010906020840190612066565b60006110ce826119ea565b5192915050565b600f546001600160a01b031633146110ff5760405162461bcd60e51b815260040161085d906124fa565b60005b82811015611165578160ff1660126000868685818110611124576111246125b9565b9050602002016020810190611139919061222f565b6001600160a01b031681526020810191909152604001600020558061115d81612581565b915050611102565b50505050565b60006001600160a01b0382166111c35760405162461bcd60e51b815260206004820152601960248201527f455243373231413a20717565727920666f722030206164647900000000000000604482015260640161085d565b506001600160a01b03166000908152600460205260409020546001600160801b031690565b606060028054610785906124c5565b6001600160a01b0382163314156112505760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c6572000000000000604482015260640161085d565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600f546001600160a01b031633146112e65760405162461bcd60e51b815260040161085d906124fa565b63ffffffff16600c55565b6112fc848484611670565b61130884848484611b69565b6111655760405162461bcd60e51b815260040161085d906125cf565b6060611331826000541190565b61137d5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a206e6f6e6578697374656e7420746f6b656e00000000000000604482015260640161085d565b6000611387611c68565b600084815260136020526040902054909150156113fe5760008151116113bc57604051806020016040528060008152506113f7565b60008381526013602052604090205481906113d690611c77565b6040516020016113e7929190612622565b6040516020818303038152906040525b9392505050565b600081511161141c57604051806020016040528060008152506113f7565b806113d684611c77565b50919050565b600f546001600160a01b031633146114565760405162461bcd60e51b815260040161085d906124fa565b63ffffffff16600e55565b6002601154116114ab5760405162461bcd60e51b8152602060048201526015602482015274283ab13634b19039b0b632903737ba1037b832b71760591b604482015260640161085d565b600d5460005411156115135780600e546114c5919061254b565b34146115135760405162461bcd60e51b815260206004820152601d60248201527f496e636f727265637420416d6f756e74206f66204574682073656e742e000000604482015260640161085d565b600a548161152060005490565b61152a9190612533565b111561156a5760405162461bcd60e51b815260206004820152600f60248201526e14dbdc9c9e4b0814dbdb190813dd5d608a1b604482015260640161085d565b600b548111156115bc5760405162461bcd60e51b815260206004820152601e60248201527f546f6f206d616e79206d696e747320706572207472616e73616374696f6e0000604482015260640161085d565b610b7033610b6a565b600f546001600160a01b031633146115ef5760405162461bcd60e51b815260040161085d906124fa565b63ffffffff16600a55565b60008281526005602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b611011828260405180602001604052806000815250611da0565b600061167b826119ea565b80519091506000906001600160a01b0316336001600160a01b031614806116b25750336116a784610808565b6001600160a01b0316145b806116c4575081516116c490336106a8565b90508061172e5760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b606482015260840161085d565b846001600160a01b031682600001516001600160a01b0316146117a25760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b606482015260840161085d565b6001600160a01b0384166117f85760405162461bcd60e51b815260206004820152601b60248201527f455243373231413a207472616e7366657220746f203020616464790000000000604482015260640161085d565b61180860008484600001516115fa565b6001600160a01b038516600090815260046020526040812080546001929061183a9084906001600160801b0316612651565b82546101009290920a6001600160801b038181021990931691831602179091556001600160a01b0386166000908152600460205260408120805460019450909261188691859116612679565b82546001600160801b039182166101009390930a9283029190920219909116179055506040805180820182526001600160a01b03808716825267ffffffffffffffff428116602080850191825260008981526003909152948520935184549151909216600160a01b026001600160e01b0319909116919092161717905561190e846001612533565b6000818152600360205260409020549091506001600160a01b03166119a057611938816000541190565b156119a05760408051808201825284516001600160a01b03908116825260208087015167ffffffffffffffff9081168285019081526000878152600390935294909120925183549451909116600160a01b026001600160e01b03199094169116179190911790555b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b6040805180820190915260008082526020820152611a09826000541190565b611a555760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a206e6f6e6578697374656e7420746f6b656e000000000000604482015260640161085d565b60007f00000000000000000000000000000000000000000000000000000000000000c88310611ab657611aa87f00000000000000000000000000000000000000000000000000000000000000c88461256a565b611ab3906001612533565b90505b825b818110611b20576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915215611b0d57949350505050565b5080611b188161269b565b915050611ab8565b5060405162461bcd60e51b815260206004820152601d60248201527f455243373231413a20756e61626c6520746f2066696e64206f776e6572000000604482015260640161085d565b60006001600160a01b0384163b15611c5c57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611bad9033908990889088906004016126b2565b6020604051808303816000875af1925050508015611be8575060408051601f3d908101601f19168201909252611be5918101906126ef565b60015b611c42573d808015611c16576040519150601f19603f3d011682016040523d82523d6000602084013e611c1b565b606091505b508051611c3a5760405162461bcd60e51b815260040161085d906125cf565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611c60565b5060015b949350505050565b606060108054610785906124c5565b606081611c9b5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611cc55780611caf81612581565b9150611cbe9050600a8361270c565b9150611c9f565b60008167ffffffffffffffff811115611ce057611ce0612270565b6040519080825280601f01601f191660200182016040528015611d0a576020820181803683370190505b509050815b8515611d9757611d2060018261256a565b90506000611d2f600a8861270c565b611d3a90600a61254b565b611d44908861256a565b611d4f90603061272e565b905060008160f81b905080848481518110611d6c57611d6c6125b9565b60200101906001600160f81b031916908160001a905350611d8e600a8961270c565b97505050611d0f565b50949350505050565b6000546001600160a01b038416611df95760405162461bcd60e51b815260206004820152601b60248201527f455243373231413a206d696e7420746f20746865203020616464790000000000604482015260640161085d565b611e04816000541190565b15611e515760405162461bcd60e51b815260206004820152601d60248201527f455243373231413a20746f6b656e20616c7265616479206d696e746564000000604482015260640161085d565b7f00000000000000000000000000000000000000000000000000000000000000c8831115611ec15760405162461bcd60e51b815260206004820152601f60248201527f455243373231413a207175616e74697479206d696e7420746f6f206869676800604482015260640161085d565b6001600160a01b0384166000908152600460209081526040918290208251808401845290546001600160801b038082168352600160801b9091041691810191909152815180830190925280519091908190611f1d908790612679565b6001600160801b03168152602001858360200151611f3b9190612679565b6001600160801b039081169091526001600160a01b0380881660008181526004602090815260408083208751978301518716600160801b0297909616969096179094558451808601865291825267ffffffffffffffff4281168386019081528883526003909552948120915182549451909516600160a01b026001600160e01b031990941694909216939093179190911790915582905b8581101561205b5760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a461201f6000888488611b69565b61203b5760405162461bcd60e51b815260040161085d906125cf565b8161204581612581565b925050808061205390612581565b915050611fd2565b5060008190556119e2565b828054612072906124c5565b90600052602060002090601f01602090048101928261209457600085556120da565b82601f106120ad57805160ff19168380011785556120da565b828001600101855582156120da579182015b828111156120da5782518255916020019190600101906120bf565b506110829291505b8082111561108257600081556001016120e2565b6001600160e01b031981168114610b7057600080fd5b60006020828403121561211e57600080fd5b81356113f7816120f6565b60005b8381101561214457818101518382015260200161212c565b838111156111655750506000910152565b6000815180845261216d816020860160208601612129565b601f01601f19169290920160200192915050565b6020815260006113f76020830184612155565b6000602082840312156121a657600080fd5b5035919050565b80356001600160a01b03811681146121c457600080fd5b919050565b600080604083850312156121dc57600080fd5b6121e5836121ad565b946020939093013593505050565b60008060006060848603121561220857600080fd5b612211846121ad565b925061221f602085016121ad565b9150604084013590509250925092565b60006020828403121561224157600080fd5b6113f7826121ad565b60006020828403121561225c57600080fd5b813563ffffffff811681146113f757600080fd5b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff808411156122a1576122a1612270565b604051601f8501601f19908116603f011681019082821181831017156122c9576122c9612270565b816040528093508581528686860111156122e257600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561230e57600080fd5b813567ffffffffffffffff81111561232557600080fd5b8201601f8101841361233657600080fd5b611c6084823560208401612286565b60008060006040848603121561235a57600080fd5b833567ffffffffffffffff8082111561237257600080fd5b818601915086601f83011261238657600080fd5b81358181111561239557600080fd5b8760208260051b85010111156123aa57600080fd5b6020928301955093505084013560ff811681146123c657600080fd5b809150509250925092565b8015158114610b7057600080fd5b600080604083850312156123f257600080fd5b6123fb836121ad565b9150602083013561240b816123d1565b809150509250929050565b6000806000806080858703121561242c57600080fd5b612435856121ad565b9350612443602086016121ad565b925060408501359150606085013567ffffffffffffffff81111561246657600080fd5b8501601f8101871361247757600080fd5b61248687823560208401612286565b91505092959194509250565b600080604083850312156124a557600080fd5b6124ae836121ad565b91506124bc602084016121ad565b90509250929050565b600181811c908216806124d957607f821691505b6020821081141561142657634e487b7160e01b600052602260045260246000fd5b6020808252600990820152683737ba1037bbb732b960b91b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600082198211156125465761254661251d565b500190565b60008160001904831182151516156125655761256561251d565b500290565b60008282101561257c5761257c61251d565b500390565b60006000198214156125955761259561251d565b5060010190565b6000602082840312156125ae57600080fd5b81516113f7816123d1565b634e487b7160e01b600052603260045260246000fd5b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b60008351612634818460208801612129565b835190830190612648818360208801612129565b01949350505050565b60006001600160801b03838116908316818110156126715761267161251d565b039392505050565b60006001600160801b038083168185168083038211156126485761264861251d565b6000816126aa576126aa61251d565b506000190190565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906126e590830184612155565b9695505050505050565b60006020828403121561270157600080fd5b81516113f7816120f6565b60008261272957634e487b7160e01b600052601260045260246000fd5b500490565b600060ff821660ff84168060ff0382111561274b5761274b61251d565b01939250505056fea264697066735822122086f2511d0c8ab59c7c1c6039cd9c693620f4b7fbc7ed5122e8683e3f00aad91464736f6c634300080a0033
Deployed Bytecode Sourcemap
48946:4723:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36738:370;;;;;;;;;;-1:-1:-1;36738:370:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;36738:370:0;;;;;;;;38395:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;39917:188::-;;;;;;;;;;-1:-1:-1;39917:188:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1692:32:1;;;1674:51;;1662:2;1647:18;39917:188:0;1528:203:1;39483:376:0;;;;;;;;;;-1:-1:-1;39483:376:0;;;;;:::i;:::-;;:::i;:::-;;53459:88;;;;;;;;;;-1:-1:-1;53459:88:0;;;;;:::i;:::-;;:::i;35333:94::-;;;;;;;;;;-1:-1:-1;35386:7:0;35409:12;35333:94;;;2319:25:1;;;2307:2;2292:18;35333:94:0;2173:177:1;50349:459:0;;;;;;:::i;:::-;;:::i;40751:142::-;;;;;;;;;;-1:-1:-1;40751:142:0;;;;;:::i;:::-;;:::i;53553:113::-;;;;;;;;;;-1:-1:-1;53553:113:0;;;;;:::i;:::-;;:::i;49189:25::-;;;;;;;;;;;;;;;;34221:37;;;;;;;;;;;;;;;35954:720;;;;;;;;;;-1:-1:-1;35954:720:0;;;;;:::i;:::-;;:::i;51433:429::-;;;;;;:::i;:::-;;:::i;53024:101::-;;;;;;;;;;-1:-1:-1;53024:101:0;;;;;:::i;:::-;;:::i;52518:198::-;;;:::i;40956:157::-;;;;;;;;;;-1:-1:-1;40956:157:0;;;;;:::i;:::-;;:::i;35496:170::-;;;;;;;;;;-1:-1:-1;35496:170:0;;;;;:::i;:::-;;:::i;49038:23::-;;;;;;;;;;-1:-1:-1;49038:23:0;;;;-1:-1:-1;;;;;49038:23:0;;;53353:100;;;;;;;;;;-1:-1:-1;53353:100:0;;;;;:::i;:::-;;:::i;38218:118::-;;;;;;;;;;-1:-1:-1;38218:118:0;;;;;:::i;:::-;;:::i;53131:216::-;;;;;;;;;;-1:-1:-1;53131:216:0;;;;;:::i;:::-;;:::i;37164:193::-;;;;;;;;;;-1:-1:-1;37164:193:0;;;;;:::i;:::-;;:::i;49130:22::-;;;;;;;;;;;;;;;;49066:28;;;;;;;;;;;;;;;;49246;;;;;;;;;;-1:-1:-1;49246:28:0;;;;-1:-1:-1;;;;;49246:28:0;;;38550:98;;;;;;;;;;;;;:::i;49219:20::-;;;;;;;;;;;;;;;;40169:274;;;;;;;;;;-1:-1:-1;40169:274:0;;;;;:::i;:::-;;:::i;52917:101::-;;;;;;;;;;-1:-1:-1;52917:101:0;;;;;:::i;:::-;;:::i;41176:311::-;;;;;;;;;;-1:-1:-1;41176:311:0;;;;;:::i;:::-;;:::i;49157:27::-;;;;;;;;;;;;;;;;49300:24;;;;;;;;;;;;;;;;50814:613;;;;;;;;;;-1:-1:-1;50814:613:0;;;;;:::i;:::-;;:::i;49101:24::-;;;;;;;;;;;;;;;;45488:43;;;;;;;;;;;;;;;;52731:85;;;;;;;;;;-1:-1:-1;52731:85:0;;;;;:::i;:::-;;:::i;49434:23::-;;;;;;;;;;;;;;;;40506:186;;;;;;;;;;-1:-1:-1;40506:186:0;;;;;:::i;:::-;-1:-1:-1;;;;;40651:25:0;;;40628:4;40651:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;40506:186;49945:398;;;;;;:::i;:::-;;:::i;52822:89::-;;;;;;;;;;-1:-1:-1;52822:89:0;;;;;:::i;:::-;;:::i;36738:370::-;36865:4;-1:-1:-1;;;;;;36895:40:0;;-1:-1:-1;;;36895:40:0;;:99;;-1:-1:-1;;;;;;;36946:48:0;;-1:-1:-1;;;36946:48:0;36895:99;:160;;;-1:-1:-1;;;;;;;37005:50:0;;-1:-1:-1;;;37005:50:0;36895:160;:207;;;-1:-1:-1;;;;;;;;;;26543:40:0;;;37066:36;36881:221;36738:370;-1:-1:-1;;36738:370:0:o;38395:94::-;38449:13;38478:5;38471:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38395:94;:::o;39917:188::-;39985:7;40009:16;40017:7;41783:4;41813:12;-1:-1:-1;41803:22:0;41726:105;40009:16;40001:58;;;;-1:-1:-1;;;40001:58:0;;7580:2:1;40001:58:0;;;7562:21:1;7619:2;7599:18;;;7592:30;7658:31;7638:18;;;7631:59;7707:18;;40001:58:0;;;;;;;;;-1:-1:-1;40075:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;40075:24:0;;39917:188::o;39483:376::-;39552:13;39568:24;39584:7;39568:15;:24::i;:::-;39552:40;;39613:5;-1:-1:-1;;;;;39607:11:0;:2;-1:-1:-1;;;;;39607:11:0;;;39599:55;;;;-1:-1:-1;;;39599:55:0;;7938:2:1;39599:55:0;;;7920:21:1;7977:2;7957:18;;;7950:30;8016:33;7996:18;;;7989:61;8067:18;;39599:55:0;7736:355:1;39599:55:0;12806:10;-1:-1:-1;;;;;39679:21:0;;;;:62;;-1:-1:-1;39704:37:0;39721:5;12806:10;40506:186;:::i;39704:37::-;39663:153;;;;-1:-1:-1;;;39663:153:0;;8298:2:1;39663:153:0;;;8280:21:1;8337:2;8317:18;;;8310:30;8376:34;8356:18;;;8349:62;8447:27;8427:18;;;8420:55;8492:19;;39663:153:0;8096:421:1;39663:153:0;39825:28;39834:2;39838:7;39847:5;39825:8;:28::i;:::-;39545:314;39483:376;;:::o;53459:88::-;52478:5;;-1:-1:-1;;;;;52478:5:0;52464:10;:19;52456:40;;;;-1:-1:-1;;;52456:40:0;;;;;;;:::i;:::-;53523:9:::1;:18:::0;53459:88::o;50349:459::-;50423:1;50411:9;;:13;50403:48;;;;-1:-1:-1;;;50403:48:0;;9061:2:1;50403:48:0;;;9043:21:1;9100:2;9080:18;;;9073:30;-1:-1:-1;;;9119:18:1;;;9112:52;9181:18;;50403:48:0;8859:346:1;50403:48:0;50481:10;50473:19;;;;:7;:19;;;;;;50466:26;;;50458:73;;;;-1:-1:-1;;;50458:73:0;;9412:2:1;50458:73:0;;;9394:21:1;9451:2;9431:18;;;9424:30;9490:34;9470:18;;;9463:62;-1:-1:-1;;;9541:18:1;;;9534:32;9583:19;;50458:73:0;9210:398:1;50458:73:0;50569:9;;50562:3;50546:13;35386:7;35409:12;;35333:94;50546:13;:19;;;;:::i;:::-;:32;;50538:77;;;;-1:-1:-1;;;50538:77:0;;10080:2:1;50538:77:0;;;10062:21:1;;;10099:18;;;10092:30;10158:34;10138:18;;;10131:62;10210:18;;50538:77:0;9878:356:1;50538:77:0;50641:10;;35386:7;35409:12;50625:26;50622:112;;;50688:3;50682:5;;:9;;;;:::i;:::-;50669;:22;50661:64;;;;-1:-1:-1;;;50661:64:0;;10614:2:1;50661:64:0;;;10596:21:1;10653:2;10633:18;;;10626:30;10692:31;10672:18;;;10665:59;10741:18;;50661:64:0;10412:353:1;50661:64:0;50750:10;50742:19;;;;:7;:19;;;;;:26;;50765:3;;50742:19;:26;;50765:3;;50742:26;:::i;:::-;;;;-1:-1:-1;50775:27:0;;-1:-1:-1;12806:10:0;50785:12;50798:3;50775:9;:27::i;:::-;50349:459;:::o;40751:142::-;40859:28;40869:4;40875:2;40879:7;40859:9;:28::i;53553:113::-;52478:5;;-1:-1:-1;;;;;52478:5:0;52464:10;:19;52456:40;;;;-1:-1:-1;;;52456:40:0;;;;;;;:::i;:::-;53627:9:::1;:33:::0;;-1:-1:-1;;;;;;53627:33:0::1;-1:-1:-1::0;;;;;53627:33:0;;;::::1;::::0;;;::::1;::::0;;53553:113::o;35954:720::-;36063:7;36098:16;36108:5;36098:9;:16::i;:::-;36090:5;:24;36082:71;;;;-1:-1:-1;;;36082:71:0;;11102:2:1;36082:71:0;;;11084:21:1;11141:2;11121:18;;;11114:30;11180:34;11160:18;;;11153:62;-1:-1:-1;;;11231:18:1;;;11224:32;11273:19;;36082:71:0;10900:398:1;36082:71:0;36160:22;35409:12;;;36160:22;;36280:350;36304:14;36300:1;:18;36280:350;;;36334:31;36368:14;;;:11;:14;;;;;;;;;36334:48;;;;;;;;;-1:-1:-1;;;;;36334:48:0;;;;;-1:-1:-1;;;36334:48:0;;;;;;;;;;;;36395:28;36391:89;;36456:14;;;-1:-1:-1;36391:89:0;36513:5;-1:-1:-1;;;;;36492:26:0;:17;-1:-1:-1;;;;;36492:26:0;;36488:135;;;36550:5;36535:11;:20;36531:59;;;-1:-1:-1;36577:1:0;-1:-1:-1;36570:8:0;;-1:-1:-1;;;36570:8:0;36531:59;36600:13;;;;:::i;:::-;;;;36488:135;-1:-1:-1;36320:3:0;;;;:::i;:::-;;;;36280:350;;;-1:-1:-1;36636:32:0;;-1:-1:-1;;;36636:32:0;;11645:2:1;36636:32:0;;;11627:21:1;11684:2;11664:18;;;11657:30;-1:-1:-1;;;11703:18:1;;;11696:52;11765:18;;36636:32:0;11443:346:1;51433:429:0;51519:1;51507:9;;:13;51499:40;;;;-1:-1:-1;;;51499:40:0;;11996:2:1;51499:40:0;;;11978:21:1;12035:2;12015:18;;;12008:30;-1:-1:-1;;;12054:18:1;;;12047:44;12108:18;;51499:40:0;11794:338:1;51499:40:0;51568:17;51576:8;51568:7;:17::i;:::-;-1:-1:-1;;;;;51554:31:0;:10;-1:-1:-1;;;;;51554:31:0;;51546:67;;;;-1:-1:-1;;;51546:67:0;;12339:2:1;51546:67:0;;;12321:21:1;12378:2;12358:18;;;12351:30;12417:26;12397:18;;;12390:54;12461:18;;51546:67:0;12137:348:1;51546:67:0;51628:9;;51678:13;;51628:64;;-1:-1:-1;;;51628:64:0;;51651:10;51628:64;;;12730:34:1;51671:4:0;12780:18:1;;;12773:43;12832:18;;;12825:34;;;;-1:-1:-1;;;;;51628:9:0;;;;:22;;12665:18:1;;51628:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51620:102;;;;-1:-1:-1;;;51620:102:0;;13322:2:1;51620:102:0;;;13304:21:1;13361:2;13341:18;;;13334:30;13400:27;13380:18;;;13373:55;13445:18;;51620:102:0;13120:349:1;51620:102:0;51748:12;;51737:8;;:23;51729:56;;;;-1:-1:-1;;;51729:56:0;;13676:2:1;51729:56:0;;;13658:21:1;13715:2;13695:18;;;13688:30;-1:-1:-1;;;13734:18:1;;;13727:51;13795:18;;51729:56:0;13474:345:1;51729:56:0;51831:8;;51819:9;;:20;;;;:::i;:::-;51794:22;;;;:12;:22;;;;;:45;;;;51846:8;:10;;;;;;:::i;:::-;;;;;;51433:429;:::o;53024:101::-;52478:5;;-1:-1:-1;;;;;52478:5:0;52464:10;:19;52456:40;;;;-1:-1:-1;;;52456:40:0;;;;;;;:::i;:::-;53094:25:::1;;:13;:25:::0;53024:101::o;52518:198::-;52478:5;;-1:-1:-1;;;;;52478:5:0;52464:10;:19;52456:40;;;;-1:-1:-1;;;52456:40:0;;;;;;;:::i;:::-;52634:5:::1;::::0;:29:::1;::::0;52585:21:::1;::::0;52571:11:::1;::::0;-1:-1:-1;;;;;52634:5:0;;::::1;::::0;52585:21;;52571:11;52634:29;52571:11;52634:29;52585:21;52634:5;:29:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52615:48;;;52678:7;52670:40;;;::::0;-1:-1:-1;;;52670:40:0;;14236:2:1;52670:40:0::1;::::0;::::1;14218:21:1::0;14275:2;14255:18;;;14248:30;-1:-1:-1;;;14294:18:1;;;14287:50;14354:18;;52670:40:0::1;14034:344:1::0;52670:40:0::1;52564:152;;52518:198::o:0;40956:157::-;41068:39;41085:4;41091:2;41095:7;41068:39;;;;;;;;;;;;:16;:39::i;35496:170::-;35563:7;35409:12;;35587:5;:21;35579:62;;;;-1:-1:-1;;;35579:62:0;;14585:2:1;35579:62:0;;;14567:21:1;14624:2;14604:18;;;14597:30;14663;14643:18;;;14636:58;14711:18;;35579:62:0;14383:352:1;35579:62:0;-1:-1:-1;35655:5:0;35496:170::o;53353:100::-;52478:5;;-1:-1:-1;;;;;52478:5:0;52464:10;:19;52456:40;;;;-1:-1:-1;;;52456:40:0;;;;;;;:::i;:::-;53426:21;;::::1;::::0;:7:::1;::::0;:21:::1;::::0;::::1;::::0;::::1;:::i;38218:118::-:0;38282:7;38305:20;38317:7;38305:11;:20::i;:::-;:25;;38218:118;-1:-1:-1;;38218:118:0:o;53131:216::-;52478:5;;-1:-1:-1;;;;;52478:5:0;52464:10;:19;52456:40;;;;-1:-1:-1;;;52456:40:0;;;;;;;:::i;:::-;53238:9:::1;53233:109;53253:21:::0;;::::1;53233:109;;;53317:17;53292:42;;:7;:22;53300:10;;53311:1;53300:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;53292:22:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;53292:22:0;:42;53276:3;::::1;::::0;::::1;:::i;:::-;;;;53233:109;;;;53131:216:::0;;;:::o;37164:193::-;37228:7;-1:-1:-1;;;;;37252:19:0;;37244:57;;;;-1:-1:-1;;;37244:57:0;;15074:2:1;37244:57:0;;;15056:21:1;15113:2;15093:18;;;15086:30;15152:27;15132:18;;;15125:55;15197:18;;37244:57:0;14872:349:1;37244:57:0;-1:-1:-1;;;;;;37323:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;37323:27:0;;37164:193::o;38550:98::-;38606:13;38635:7;38628:14;;;;;:::i;40169:274::-;-1:-1:-1;;;;;40260:24:0;;12806:10;40260:24;;40252:63;;;;-1:-1:-1;;;40252:63:0;;15428:2:1;40252:63:0;;;15410:21:1;15467:2;15447:18;;;15440:30;15506:28;15486:18;;;15479:56;15552:18;;40252:63:0;15226:350:1;40252:63:0;12806:10;40324:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;40324:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;40324:53:0;;;;;;;;;;40389:48;;540:41:1;;;40324:42:0;;12806:10;40389:48;;513:18:1;40389:48:0;;;;;;;40169:274;;:::o;52917:101::-;52478:5;;-1:-1:-1;;;;;52478:5:0;52464:10;:19;52456:40;;;;-1:-1:-1;;;52456:40:0;;;;;;;:::i;:::-;52987:25:::1;;:12;:25:::0;52917:101::o;41176:311::-;41313:28;41323:4;41329:2;41333:7;41313:9;:28::i;:::-;41364:48;41387:4;41393:2;41397:7;41406:5;41364:22;:48::i;:::-;41348:133;;;;-1:-1:-1;;;41348:133:0;;;;;;;:::i;50814:613::-;50902:13;50931:16;50939:7;41783:4;41813:12;-1:-1:-1;41803:22:0;41726:105;50931:16;50923:53;;;;-1:-1:-1;;;50923:53:0;;16203:2:1;50923:53:0;;;16185:21:1;16242:2;16222:18;;;16215:30;16281:27;16261:18;;;16254:55;16326:18;;50923:53:0;16001:349:1;50923:53:0;50991:28;51022:10;:8;:10::i;:::-;51084:1;51062:21;;;:12;:21;;;;;;50991:41;;-1:-1:-1;51062:23:0;51059:363;;51135:1;51110:14;51104:28;:32;:139;;;;;;;;;;;;;;;;;51203:21;;;;:12;:21;;;;;;51174:14;;51190:35;;:12;:35::i;:::-;51157:69;;;;;;;;;:::i;:::-;;;;;;;;;;;;;51104:139;51097:146;50814:613;-1:-1:-1;;;50814:613:0:o;51059:363::-;51306:1;51281:14;51275:28;:32;:137;;;;;;;;;;;;;;;;;51351:14;51367:21;51380:7;51367:12;:21::i;51059:363::-;50916:511;50814:613;;;:::o;52731:85::-;52478:5;;-1:-1:-1;;;;;52478:5:0;52464:10;:19;52456:40;;;;-1:-1:-1;;;52456:40:0;;;;;;;:::i;:::-;52793:17:::1;;:5;:17:::0;52731:85::o;49945:398::-;50021:1;50009:9;;:13;50001:47;;;;-1:-1:-1;;;50001:47:0;;17032:2:1;50001:47:0;;;17014:21:1;17071:2;17051:18;;;17044:30;-1:-1:-1;;;17090:18:1;;;17083:51;17151:18;;50001:47:0;16830:345:1;50001:47:0;50074:10;;35386:7;35409:12;50058:26;50055:112;;;50121:3;50115:5;;:9;;;;:::i;:::-;50102;:22;50094:64;;;;-1:-1:-1;;;50094:64:0;;10614:2:1;50094:64:0;;;10596:21:1;10653:2;10633:18;;;10626:30;10692:31;10672:18;;;10665:59;10741:18;;50094:64:0;10412:353:1;50094:64:0;50209:9;;50202:3;50186:13;35386:7;35409:12;;35333:94;50186:13;:19;;;;:::i;:::-;:32;;50178:60;;;;-1:-1:-1;;;50178:60:0;;17382:2:1;50178:60:0;;;17364:21:1;17421:2;17401:18;;;17394:30;-1:-1:-1;;;17440:18:1;;;17433:45;17495:18;;50178:60:0;17180:339:1;50178:60:0;50260:7;;50253:3;:14;;50245:56;;;;-1:-1:-1;;;50245:56:0;;17726:2:1;50245:56:0;;;17708:21:1;17765:2;17745:18;;;17738:30;17804:32;17784:18;;;17777:60;17854:18;;50245:56:0;17524:354:1;50245:56:0;50310:27;12806:10;50320:12;12726:98;52822:89;52478:5;;-1:-1:-1;;;;;52478:5:0;52464:10;:19;52456:40;;;;-1:-1:-1;;;52456:40:0;;;;;;;:::i;:::-;52886:19:::1;;:9;:19:::0;52822:89::o;45310:172::-;45407:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;45407:29:0;-1:-1:-1;;;;;45407:29:0;;;;;;;;;45448:28;;45407:24;;45448:28;;;;;;;45310:172;;;:::o;41837:98::-;41902:27;41912:2;41916:8;41902:27;;;;;;;;;;;;:9;:27::i;43685:1519::-;43782:35;43820:20;43832:7;43820:11;:20::i;:::-;43891:18;;43782:58;;-1:-1:-1;43849:22:0;;-1:-1:-1;;;;;43875:34:0;12806:10;-1:-1:-1;;;;;43875:34:0;;:81;;;-1:-1:-1;12806:10:0;43920:20;43932:7;43920:11;:20::i;:::-;-1:-1:-1;;;;;43920:36:0;;43875:81;:142;;;-1:-1:-1;43984:18:0;;43967:50;;12806:10;40506:186;:::i;43967:50::-;43849:169;;44043:17;44027:101;;;;-1:-1:-1;;;44027:101:0;;18085:2:1;44027:101:0;;;18067:21:1;18124:2;18104:18;;;18097:30;18163:34;18143:18;;;18136:62;-1:-1:-1;;;18214:18:1;;;18207:48;18272:19;;44027:101:0;17883:414:1;44027:101:0;44175:4;-1:-1:-1;;;;;44153:26:0;:13;:18;;;-1:-1:-1;;;;;44153:26:0;;44137:98;;;;-1:-1:-1;;;44137:98:0;;18504:2:1;44137:98:0;;;18486:21:1;18543:2;18523:18;;;18516:30;18582:34;18562:18;;;18555:62;-1:-1:-1;;;18633:18:1;;;18626:36;18679:19;;44137:98:0;18302:402:1;44137:98:0;-1:-1:-1;;;;;44250:16:0;;44242:56;;;;-1:-1:-1;;;44242:56:0;;18911:2:1;44242:56:0;;;18893:21:1;18950:2;18930:18;;;18923:30;18989:29;18969:18;;;18962:57;19036:18;;44242:56:0;18709:351:1;44242:56:0;44407:49;44424:1;44428:7;44437:13;:18;;;44407:8;:49::i;:::-;-1:-1:-1;;;;;44465:18:0;;;;;;:12;:18;;;;;:31;;44495:1;;44465:18;:31;;44495:1;;-1:-1:-1;;;;;44465:31:0;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;44465:31:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;44503:16:0;;-1:-1:-1;44503:16:0;;;:12;:16;;;;;:29;;-1:-1:-1;;;44503:16:0;;:29;;-1:-1:-1;;44503:29:0;;:::i;:::-;;;-1:-1:-1;;;;;44503:29:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44562:43:0;;;;;;;;-1:-1:-1;;;;;44562:43:0;;;;;;44588:15;44562:43;;;;;;;;;-1:-1:-1;44539:20:0;;;:11;:20;;;;;;:66;;;;;;;;;-1:-1:-1;;;44539:66:0;-1:-1:-1;;;;;;44539:66:0;;;;;;;;;;;44855:11;44551:7;-1:-1:-1;44855:11:0;:::i;:::-;44918:1;44877:24;;;:11;:24;;;;;:29;44833:33;;-1:-1:-1;;;;;;44877:29:0;44873:236;;44935:20;44943:11;41783:4;41813:12;-1:-1:-1;41803:22:0;41726:105;44935:20;44931:171;;;44995:97;;;;;;;;45022:18;;-1:-1:-1;;;;;44995:97:0;;;;;;45053:28;;;;44995:97;;;;;;;;;;-1:-1:-1;44968:24:0;;;:11;:24;;;;;;;:124;;;;;;;;;-1:-1:-1;;;44968:124:0;-1:-1:-1;;;;;;44968:124:0;;;;;;;;;;;;44931:171;45141:7;45137:2;-1:-1:-1;;;;;45122:27:0;45131:4;-1:-1:-1;;;;;45122:27:0;;;;;;;;;;;45156:42;43775:1429;;;43685:1519;;;:::o;37592:572::-;-1:-1:-1;;;;;;;;;;;;;;;;;37709:16:0;37717:7;41783:4;41813:12;-1:-1:-1;41803:22:0;41726:105;37709:16;37701:55;;;;-1:-1:-1;;;37701:55:0;;19776:2:1;37701:55:0;;;19758:21:1;19815:2;19795:18;;;19788:30;19854:28;19834:18;;;19827:56;19900:18;;37701:55:0;19574:350:1;37701:55:0;37765:26;37813:12;37802:7;:23;37798:93;;37857:22;37867:12;37857:7;:22;:::i;:::-;:26;;37882:1;37857:26;:::i;:::-;37836:47;;37798:93;37919:7;37899:212;37936:18;37928:4;:26;37899:212;;37973:31;38007:17;;;:11;:17;;;;;;;;;37973:51;;;;;;;;;-1:-1:-1;;;;;37973:51:0;;;;;-1:-1:-1;;;37973:51:0;;;;;;;;;;;;38037:28;38033:71;;38085:9;37592:572;-1:-1:-1;;;;37592:572:0:o;38033:71::-;-1:-1:-1;37956:6:0;;;;:::i;:::-;;;;37899:212;;;-1:-1:-1;38119:39:0;;-1:-1:-1;;;38119:39:0;;20272:2:1;38119:39:0;;;20254:21:1;20311:2;20291:18;;;20284:30;20350:31;20330:18;;;20323:59;20399:18;;38119:39:0;20070:353:1;47021:690:0;47158:4;-1:-1:-1;;;;;47175:13:0;;16613:20;16661:8;47171:535;;47214:72;;-1:-1:-1;;;47214:72:0;;-1:-1:-1;;;;;47214:36:0;;;;;:72;;12806:10;;47265:4;;47271:7;;47280:5;;47214:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47214:72:0;;;;;;;;-1:-1:-1;;47214:72:0;;;;;;;;;;;;:::i;:::-;;;47201:464;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47445:13:0;;47441:215;;47478:61;;-1:-1:-1;;;47478:61:0;;;;;;;:::i;47441:215::-;47624:6;47618:13;47609:6;47605:2;47601:15;47594:38;47201:464;-1:-1:-1;;;;;;47336:55:0;-1:-1:-1;;;47336:55:0;;-1:-1:-1;47329:62:0;;47171:535;-1:-1:-1;47694:4:0;47171:535;47021:690;;;;;;:::o;49837:102::-;49897:13;49926:7;49919:14;;;;;:::i;51868:537::-;51922:27;51964:7;51960:46;;-1:-1:-1;;51986:10:0;;;;;;;;;;;;-1:-1:-1;;;51986:10:0;;;;;51868:537::o;51960:46::-;52023:2;52014:6;52051:63;52058:6;;52051:63;;52079:5;;;;:::i;:::-;;-1:-1:-1;52097:7:0;;-1:-1:-1;52102:2:0;52097:7;;:::i;:::-;;;52051:63;;;52122:17;52152:3;52142:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52142:14:0;-1:-1:-1;52122:34:0;-1:-1:-1;52174:3:0;52186:186;52193:7;;52186:186;;52219:3;52221:1;52219;:3;:::i;:::-;52215:7;-1:-1:-1;52235:10:0;52265:7;52270:2;52265;:7;:::i;:::-;:12;;52275:2;52265:12;:::i;:::-;52260:17;;:2;:17;:::i;:::-;52249:29;;:2;:29;:::i;:::-;52235:44;;52292:9;52311:4;52304:12;;52292:24;;52339:2;52329:4;52334:1;52329:7;;;;;;;;:::i;:::-;;;;:12;-1:-1:-1;;;;;52329:12:0;;;;;;;;-1:-1:-1;52354:8:0;52360:2;52354:8;;:::i;:::-;;;52202:170;;52186:186;;;-1:-1:-1;52394:4:0;51868:537;-1:-1:-1;;;;51868:537:0:o;42190:1263::-;42295:20;42318:12;-1:-1:-1;;;;;42345:16:0;;42337:56;;;;-1:-1:-1;;;42337:56:0;;21809:2:1;42337:56:0;;;21791:21:1;21848:2;21828:18;;;21821:30;21887:29;21867:18;;;21860:57;21934:18;;42337:56:0;21607:351:1;42337:56:0;42530:21;42538:12;41783:4;41813:12;-1:-1:-1;41803:22:0;41726:105;42530:21;42529:22;42521:64;;;;-1:-1:-1;;;42521:64:0;;22165:2:1;42521:64:0;;;22147:21:1;22204:2;22184:18;;;22177:30;22243:31;22223:18;;;22216:59;22292:18;;42521:64:0;21963:353:1;42521:64:0;42612:12;42600:8;:24;;42592:68;;;;-1:-1:-1;;;42592:68:0;;22523:2:1;42592:68:0;;;22505:21:1;22562:2;22542:18;;;22535:30;22601:33;22581:18;;;22574:61;22652:18;;42592:68:0;22321:355:1;42592:68:0;-1:-1:-1;;;;;42772:16:0;;42739:30;42772:16;;;:12;:16;;;;;;;;;42739:49;;;;;;;;;-1:-1:-1;;;;;42739:49:0;;;;;-1:-1:-1;;;42739:49:0;;;;;;;;;;;42814:119;;;;;;;;42834:19;;42739:49;;42814:119;;;42834:39;;42864:8;;42834:39;:::i;:::-;-1:-1:-1;;;;;42814:119:0;;;;;42917:8;42882:11;:24;;;:44;;;;:::i;:::-;-1:-1:-1;;;;;42814:119:0;;;;;;-1:-1:-1;;;;;42795:16:0;;;;;;;:12;:16;;;;;;;;:138;;;;;;;;-1:-1:-1;;;42795:138:0;;;;;;;;;;;;42968:43;;;;;;;;;;;42994:15;42968:43;;;;;;;;42940:25;;;:11;:25;;;;;;:71;;;;;;;;;-1:-1:-1;;;42940:71:0;-1:-1:-1;;;;;;42940:71:0;;;;;;;;;;;;;;;;;;42952:12;;43064:281;43088:8;43084:1;:12;43064:281;;;43117:38;;43142:12;;-1:-1:-1;;;;;43117:38:0;;;43134:1;;43117:38;;43134:1;;43117:38;43182:59;43213:1;43217:2;43221:12;43235:5;43182:22;:59::i;:::-;43164:150;;;;-1:-1:-1;;;43164:150:0;;;;;;;:::i;:::-;43323:14;;;;:::i;:::-;;;;43098:3;;;;;:::i;:::-;;;;43064:281;;;-1:-1:-1;43353:12:0;:27;;;43387:60;53131:216;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:258::-;664:1;674:113;688:6;685:1;682:13;674:113;;;764:11;;;758:18;745:11;;;738:39;710:2;703:10;674:113;;;805:6;802:1;799:13;796:48;;;-1:-1:-1;;840:1:1;822:16;;815:27;592:258::o;855:::-;897:3;935:5;929:12;962:6;957:3;950:19;978:63;1034:6;1027:4;1022:3;1018:14;1011:4;1004:5;1000:16;978:63;:::i;:::-;1095:2;1074:15;-1:-1:-1;;1070:29:1;1061:39;;;;1102:4;1057:50;;855:258;-1:-1:-1;;855:258:1:o;1118:220::-;1267:2;1256:9;1249:21;1230:4;1287:45;1328:2;1317:9;1313:18;1305:6;1287:45;:::i;1343:180::-;1402:6;1455:2;1443:9;1434:7;1430:23;1426:32;1423:52;;;1471:1;1468;1461:12;1423:52;-1:-1:-1;1494:23:1;;1343:180;-1:-1:-1;1343:180:1:o;1736:173::-;1804:20;;-1:-1:-1;;;;;1853:31:1;;1843:42;;1833:70;;1899:1;1896;1889:12;1833:70;1736:173;;;:::o;1914:254::-;1982:6;1990;2043:2;2031:9;2022:7;2018:23;2014:32;2011:52;;;2059:1;2056;2049:12;2011:52;2082:29;2101:9;2082:29;:::i;:::-;2072:39;2158:2;2143:18;;;;2130:32;;-1:-1:-1;;;1914:254:1:o;2355:328::-;2432:6;2440;2448;2501:2;2489:9;2480:7;2476:23;2472:32;2469:52;;;2517:1;2514;2507:12;2469:52;2540:29;2559:9;2540:29;:::i;:::-;2530:39;;2588:38;2622:2;2611:9;2607:18;2588:38;:::i;:::-;2578:48;;2673:2;2662:9;2658:18;2645:32;2635:42;;2355:328;;;;;:::o;2688:186::-;2747:6;2800:2;2788:9;2779:7;2775:23;2771:32;2768:52;;;2816:1;2813;2806:12;2768:52;2839:29;2858:9;2839:29;:::i;2879:276::-;2937:6;2990:2;2978:9;2969:7;2965:23;2961:32;2958:52;;;3006:1;3003;2996:12;2958:52;3045:9;3032:23;3095:10;3088:5;3084:22;3077:5;3074:33;3064:61;;3121:1;3118;3111:12;3381:127;3442:10;3437:3;3433:20;3430:1;3423:31;3473:4;3470:1;3463:15;3497:4;3494:1;3487:15;3513:632;3578:5;3608:18;3649:2;3641:6;3638:14;3635:40;;;3655:18;;:::i;:::-;3730:2;3724:9;3698:2;3784:15;;-1:-1:-1;;3780:24:1;;;3806:2;3776:33;3772:42;3760:55;;;3830:18;;;3850:22;;;3827:46;3824:72;;;3876:18;;:::i;:::-;3916:10;3912:2;3905:22;3945:6;3936:15;;3975:6;3967;3960:22;4015:3;4006:6;4001:3;3997:16;3994:25;3991:45;;;4032:1;4029;4022:12;3991:45;4082:6;4077:3;4070:4;4062:6;4058:17;4045:44;4137:1;4130:4;4121:6;4113;4109:19;4105:30;4098:41;;;;3513:632;;;;;:::o;4150:451::-;4219:6;4272:2;4260:9;4251:7;4247:23;4243:32;4240:52;;;4288:1;4285;4278:12;4240:52;4328:9;4315:23;4361:18;4353:6;4350:30;4347:50;;;4393:1;4390;4383:12;4347:50;4416:22;;4469:4;4461:13;;4457:27;-1:-1:-1;4447:55:1;;4498:1;4495;4488:12;4447:55;4521:74;4587:7;4582:2;4569:16;4564:2;4560;4556:11;4521:74;:::i;4606:778::-;4699:6;4707;4715;4768:2;4756:9;4747:7;4743:23;4739:32;4736:52;;;4784:1;4781;4774:12;4736:52;4824:9;4811:23;4853:18;4894:2;4886:6;4883:14;4880:34;;;4910:1;4907;4900:12;4880:34;4948:6;4937:9;4933:22;4923:32;;4993:7;4986:4;4982:2;4978:13;4974:27;4964:55;;5015:1;5012;5005:12;4964:55;5055:2;5042:16;5081:2;5073:6;5070:14;5067:34;;;5097:1;5094;5087:12;5067:34;5152:7;5145:4;5135:6;5132:1;5128:14;5124:2;5120:23;5116:34;5113:47;5110:67;;;5173:1;5170;5163:12;5110:67;5204:4;5196:13;;;;-1:-1:-1;5228:6:1;-1:-1:-1;;5269:20:1;;5256:34;5330:4;5319:16;;5309:27;;5299:55;;5350:1;5347;5340:12;5299:55;5373:5;5363:15;;;4606:778;;;;;:::o;5613:118::-;5699:5;5692:13;5685:21;5678:5;5675:32;5665:60;;5721:1;5718;5711:12;5736:315;5801:6;5809;5862:2;5850:9;5841:7;5837:23;5833:32;5830:52;;;5878:1;5875;5868:12;5830:52;5901:29;5920:9;5901:29;:::i;:::-;5891:39;;5980:2;5969:9;5965:18;5952:32;5993:28;6015:5;5993:28;:::i;:::-;6040:5;6030:15;;;5736:315;;;;;:::o;6056:667::-;6151:6;6159;6167;6175;6228:3;6216:9;6207:7;6203:23;6199:33;6196:53;;;6245:1;6242;6235:12;6196:53;6268:29;6287:9;6268:29;:::i;:::-;6258:39;;6316:38;6350:2;6339:9;6335:18;6316:38;:::i;:::-;6306:48;;6401:2;6390:9;6386:18;6373:32;6363:42;;6456:2;6445:9;6441:18;6428:32;6483:18;6475:6;6472:30;6469:50;;;6515:1;6512;6505:12;6469:50;6538:22;;6591:4;6583:13;;6579:27;-1:-1:-1;6569:55:1;;6620:1;6617;6610:12;6569:55;6643:74;6709:7;6704:2;6691:16;6686:2;6682;6678:11;6643:74;:::i;:::-;6633:84;;;6056:667;;;;;;;:::o;6728:260::-;6796:6;6804;6857:2;6845:9;6836:7;6832:23;6828:32;6825:52;;;6873:1;6870;6863:12;6825:52;6896:29;6915:9;6896:29;:::i;:::-;6886:39;;6944:38;6978:2;6967:9;6963:18;6944:38;:::i;:::-;6934:48;;6728:260;;;;;:::o;6993:380::-;7072:1;7068:12;;;;7115;;;7136:61;;7190:4;7182:6;7178:17;7168:27;;7136:61;7243:2;7235:6;7232:14;7212:18;7209:38;7206:161;;;7289:10;7284:3;7280:20;7277:1;7270:31;7324:4;7321:1;7314:15;7352:4;7349:1;7342:15;8522:332;8724:2;8706:21;;;8763:1;8743:18;;;8736:29;-1:-1:-1;;;8796:2:1;8781:18;;8774:39;8845:2;8830:18;;8522:332::o;9613:127::-;9674:10;9669:3;9665:20;9662:1;9655:31;9705:4;9702:1;9695:15;9729:4;9726:1;9719:15;9745:128;9785:3;9816:1;9812:6;9809:1;9806:13;9803:39;;;9822:18;;:::i;:::-;-1:-1:-1;9858:9:1;;9745:128::o;10239:168::-;10279:7;10345:1;10341;10337:6;10333:14;10330:1;10327:21;10322:1;10315:9;10308:17;10304:45;10301:71;;;10352:18;;:::i;:::-;-1:-1:-1;10392:9:1;;10239:168::o;10770:125::-;10810:4;10838:1;10835;10832:8;10829:34;;;10843:18;;:::i;:::-;-1:-1:-1;10880:9:1;;10770:125::o;11303:135::-;11342:3;-1:-1:-1;;11363:17:1;;11360:43;;;11383:18;;:::i;:::-;-1:-1:-1;11430:1:1;11419:13;;11303:135::o;12870:245::-;12937:6;12990:2;12978:9;12969:7;12965:23;12961:32;12958:52;;;13006:1;13003;12996:12;12958:52;13038:9;13032:16;13057:28;13079:5;13057:28;:::i;14740:127::-;14801:10;14796:3;14792:20;14789:1;14782:31;14832:4;14829:1;14822:15;14856:4;14853:1;14846:15;15581:415;15783:2;15765:21;;;15822:2;15802:18;;;15795:30;15861:34;15856:2;15841:18;;15834:62;-1:-1:-1;;;15927:2:1;15912:18;;15905:49;15986:3;15971:19;;15581:415::o;16355:470::-;16534:3;16572:6;16566:13;16588:53;16634:6;16629:3;16622:4;16614:6;16610:17;16588:53;:::i;:::-;16704:13;;16663:16;;;;16726:57;16704:13;16663:16;16760:4;16748:17;;16726:57;:::i;:::-;16799:20;;16355:470;-1:-1:-1;;;;16355:470:1:o;19065:246::-;19105:4;-1:-1:-1;;;;;19218:10:1;;;;19188;;19240:12;;;19237:38;;;19255:18;;:::i;:::-;19292:13;;19065:246;-1:-1:-1;;;19065:246:1:o;19316:253::-;19356:3;-1:-1:-1;;;;;19445:2:1;19442:1;19438:10;19475:2;19472:1;19468:10;19506:3;19502:2;19498:12;19493:3;19490:21;19487:47;;;19514:18;;:::i;19929:136::-;19968:3;19996:5;19986:39;;20005:18;;:::i;:::-;-1:-1:-1;;;20041:18:1;;19929:136::o;20428:489::-;-1:-1:-1;;;;;20697:15:1;;;20679:34;;20749:15;;20744:2;20729:18;;20722:43;20796:2;20781:18;;20774:34;;;20844:3;20839:2;20824:18;;20817:31;;;20622:4;;20865:46;;20891:19;;20883:6;20865:46;:::i;:::-;20857:54;20428:489;-1:-1:-1;;;;;;20428:489:1:o;20922:249::-;20991:6;21044:2;21032:9;21023:7;21019:23;21015:32;21012:52;;;21060:1;21057;21050:12;21012:52;21092:9;21086:16;21111:30;21135:5;21111:30;:::i;21176:217::-;21216:1;21242;21232:132;;21286:10;21281:3;21277:20;21274:1;21267:31;21321:4;21318:1;21311:15;21349:4;21346:1;21339:15;21232:132;-1:-1:-1;21378:9:1;;21176:217::o;21398:204::-;21436:3;21472:4;21469:1;21465:12;21504:4;21501:1;21497:12;21539:3;21533:4;21529:14;21524:3;21521:23;21518:49;;;21547:18;;:::i;:::-;21583:13;;21398:204;-1:-1:-1;;;21398:204:1:o
Swarm Source
ipfs://86f2511d0c8ab59c7c1c6039cd9c693620f4b7fbc7ed5122e8683e3f00aad914
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.