Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Loading...
Loading
Contract Name:
Captainz
Compiler Version
v0.8.15+commit.e14f2714
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-01-22 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.15; // File: @openzeppelin/contracts/utils/math/Math.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv( uint256 x, uint256 y, uint256 denominator ) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv( uint256 x, uint256 y, uint256 denominator, Rounding rounding ) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10**64) { value /= 10**64; result += 64; } if (value >= 10**32) { value /= 10**32; result += 32; } if (value >= 10**16) { value /= 10**16; result += 16; } if (value >= 10**8) { value /= 10**8; result += 8; } if (value >= 10**4) { value /= 10**4; result += 4; } if (value >= 10**2) { value /= 10**2; result += 2; } if (value >= 10**1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0); } } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { unchecked { uint256 length = Math.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), _SYMBOLS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, Math.log256(value) + 1); } } /** * @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] = _SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } // 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 (last updated v4.7.0) (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 Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { 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/security/Pausable.sol // OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { _requireNotPaused(); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { _requirePaused(); _; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { require(!paused(), "Pausable: paused"); } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { require(paused(), "Pausable: not paused"); } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @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 * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 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 functionCallWithValue(target, data, 0, "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"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, 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) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, 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) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or 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 { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // 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 /// @solidity memory-safe-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 (last updated v4.6.0) (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 `IERC721Receiver.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 (last updated v4.8.0) (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`. * * 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; /** * @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 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: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721 * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must * understand this adds an external call which potentially creates a reentrancy vulnerability. * * 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 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 the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @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); } // 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: @openzeppelin/contracts/token/ERC721/ERC721.sol // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: address zero is not a valid owner"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _ownerOf(tokenId); require(owner != address(0), "ERC721: invalid token ID"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { _requireMinted(tokenId); 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 overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not token owner or approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { _requireMinted(tokenId); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved"); _safeTransfer(from, to, tokenId, data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist */ function _ownerOf(uint256 tokenId) internal view virtual returns (address) { return _owners[tokenId]; } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _ownerOf(tokenId) != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { address owner = ERC721.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId, 1); // Check that tokenId was not minted by `_beforeTokenTransfer` hook require(!_exists(tokenId), "ERC721: token already minted"); unchecked { // Will not overflow unless all 2**256 token ids are minted to the same owner. // Given that tokens are minted one by one, it is impossible in practice that // this ever happens. Might change if we allow batch minting. // The ERC fails to describe this case. _balances[to] += 1; } _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId, 1); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * This is an internal function that does not check if the sender is authorized to operate on the token. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId, 1); // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook owner = ERC721.ownerOf(tokenId); // Clear approvals delete _tokenApprovals[tokenId]; unchecked { // Cannot overflow, as that would require more tokens to be burned/transferred // out than the owner initially received through minting and transferring in. _balances[owner] -= 1; } delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId, 1); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId, 1); // Check that tokenId was not transferred by `_beforeTokenTransfer` hook require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); // Clear approvals from the previous owner delete _tokenApprovals[tokenId]; unchecked { // `_balances[from]` cannot overflow for the same reason as described in `_burn`: // `from`'s balance is the number of token held, which is at least one before the current // transfer. // `_balances[to]` could overflow in the conditions described in `_mint`. That would require // all 2**256 token ids to be minted, which in practice is impossible. _balances[from] -= 1; _balances[to] += 1; } _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId, 1); } /** * @dev Approve `to` to operate on `tokenId` * * Emits an {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits an {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Reverts if the `tokenId` has not been minted yet. */ function _requireMinted(uint256 tokenId) internal view virtual { require(_exists(tokenId), "ERC721: invalid token ID"); } /** * @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.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { /// @solidity memory-safe-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting and burning. If {ERC721Consecutive} is * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`. * - When `from` is zero, the tokens will be minted for `to`. * - When `to` is zero, ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * - `batchSize` is non-zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256, /* firstTokenId */ uint256 batchSize ) internal virtual { if (batchSize > 1) { if (from != address(0)) { _balances[from] -= batchSize; } if (to != address(0)) { _balances[to] += batchSize; } } } /** * @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`. * - When `from` is zero, the tokens were minted for `to`. * - When `to` is zero, ``from``'s tokens were burned. * - `from` and `to` are never both zero. * - `batchSize` is non-zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 firstTokenId, uint256 batchSize ) internal virtual {} } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Burnable.sol // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/extensions/ERC721Burnable.sol) pragma solidity ^0.8.0; /** * @title ERC721 Burnable Token * @dev ERC721 Token that can be burned (destroyed). */ abstract contract ERC721Burnable is Context, ERC721 { /** * @dev Burns `tokenId`. See {ERC721-_burn}. * * Requirements: * * - The caller must own `tokenId` or be an approved operator. */ function burn(uint256 tokenId) public virtual { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved"); _burn(tokenId); } } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/extensions/ERC721URIStorage.sol) pragma solidity ^0.8.0; /** * @dev ERC721 token with storage based token URI management. */ abstract contract ERC721URIStorage is ERC721 { using Strings for uint256; // Optional mapping for token URIs mapping(uint256 => string) private _tokenURIs; /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { _requireMinted(tokenId); string memory _tokenURI = _tokenURIs[tokenId]; string memory base = _baseURI(); // If there is no base URI, return the token URI. if (bytes(base).length == 0) { return _tokenURI; } // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked). if (bytes(_tokenURI).length > 0) { return string(abi.encodePacked(base, _tokenURI)); } return super.tokenURI(tokenId); } /** * @dev Sets `_tokenURI` as the tokenURI of `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual { require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token"); _tokenURIs[tokenId] = _tokenURI; } /** * @dev See {ERC721-_burn}. This override additionally checks to see if a * token-specific URI was set for the token, and if so, it deletes the token URI from * the storage mapping. */ function _burn(uint256 tokenId) internal virtual override { super._burn(tokenId); if (bytes(_tokenURIs[tokenId]).length != 0) { delete _tokenURIs[tokenId]; } } } // File: contracts/SimpleERC721.sol pragma solidity ^0.8.15; contract Captainz is ERC721, ERC721URIStorage, Pausable, Ownable, ERC721Burnable { constructor() ERC721("The Captainz", "Captainz") {} function pause() public onlyOwner { _pause(); } function unpause() public onlyOwner { _unpause(); } function safeMint(address to, uint256 tokenId, string memory uri) public onlyOwner { _safeMint(to, tokenId); _setTokenURI(tokenId, uri); } function _beforeTokenTransfer(address from, address to, uint256 tokenId, uint256 batchSize) internal whenNotPaused override { super._beforeTokenTransfer(from, to, tokenId, batchSize); } // The following functions are overrides required by Solidity. function _burn(uint256 tokenId) internal override(ERC721, ERC721URIStorage) { super._burn(tokenId); } function tokenURI(uint256 tokenId) public view override(ERC721, ERC721URIStorage) returns (string memory) { return super.tokenURI(tokenId); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","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":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"uri","type":"string"}],"name":"safeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"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":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b506040518060400160405280601181526020017f5468652020202020204361707461696e7a0000000000000000000000000000008152506040518060400160405280600881526020017f4361707461696e7a00000000000000000000000000000000000000000000000081525081600090816200008f91906200042d565b508060019081620000a191906200042d565b5050506000600760006101000a81548160ff021916908315150217905550620000df620000d3620000e560201b60201c565b620000ed60201b60201c565b62000514565b600033905090565b6000600760019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200023557607f821691505b6020821081036200024b576200024a620001ed565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620002b57fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000276565b620002c1868362000276565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006200030e620003086200030284620002d9565b620002e3565b620002d9565b9050919050565b6000819050919050565b6200032a83620002ed565b62000342620003398262000315565b84845462000283565b825550505050565b600090565b620003596200034a565b620003668184846200031f565b505050565b5b818110156200038e57620003826000826200034f565b6001810190506200036c565b5050565b601f821115620003dd57620003a78162000251565b620003b28462000266565b81016020851015620003c2578190505b620003da620003d18562000266565b8301826200036b565b50505b505050565b600082821c905092915050565b60006200040260001984600802620003e2565b1980831691505092915050565b60006200041d8383620003ef565b9150826002028217905092915050565b6200043882620001b3565b67ffffffffffffffff811115620004545762000453620001be565b5b6200046082546200021c565b6200046d82828562000392565b600060209050601f831160018114620004a5576000841562000490578287015190505b6200049c85826200040f565b8655506200050c565b601f198416620004b58662000251565b60005b82811015620004df57848901518255600182019150602085019450602081019050620004b8565b86831015620004ff5784890151620004fb601f891682620003ef565b8355505b6001600288020188555050505b505050505050565b61354780620005246000396000f3fe608060405234801561001057600080fd5b50600436106101375760003560e01c806370a08231116100b8578063a22cb4651161007c578063a22cb46514610302578063b88d4fde1461031e578063c87b56dd1461033a578063cd279c7c1461036a578063e985e9c514610386578063f2fde38b146103b657610137565b806370a0823114610282578063715018a6146102b25780638456cb59146102bc5780638da5cb5b146102c657806395d89b41146102e457610137565b80633f4ba83a116100ff5780633f4ba83a146101f257806342842e0e146101fc57806342966c68146102185780635c975abb146102345780636352211e1461025257610137565b806301ffc9a71461013c57806306fdde031461016c578063081812fc1461018a578063095ea7b3146101ba57806323b872dd146101d6575b600080fd5b6101566004803603810190610151919061218b565b6103d2565b60405161016391906121d3565b60405180910390f35b6101746104b4565b6040516101819190612287565b60405180910390f35b6101a4600480360381019061019f91906122df565b610546565b6040516101b1919061234d565b60405180910390f35b6101d460048036038101906101cf9190612394565b61058c565b005b6101f060048036038101906101eb91906123d4565b6106a3565b005b6101fa610703565b005b610216600480360381019061021191906123d4565b610715565b005b610232600480360381019061022d91906122df565b610735565b005b61023c610791565b60405161024991906121d3565b60405180910390f35b61026c600480360381019061026791906122df565b6107a8565b604051610279919061234d565b60405180910390f35b61029c60048036038101906102979190612427565b61082e565b6040516102a99190612463565b60405180910390f35b6102ba6108e5565b005b6102c46108f9565b005b6102ce61090b565b6040516102db919061234d565b60405180910390f35b6102ec610935565b6040516102f99190612287565b60405180910390f35b61031c600480360381019061031791906124aa565b6109c7565b005b6103386004803603810190610333919061261f565b6109dd565b005b610354600480360381019061034f91906122df565b610a3f565b6040516103619190612287565b60405180910390f35b610384600480360381019061037f9190612743565b610a51565b005b6103a0600480360381019061039b91906127b2565b610a72565b6040516103ad91906121d3565b60405180910390f35b6103d060048036038101906103cb9190612427565b610b06565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061049d57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806104ad57506104ac82610b89565b5b9050919050565b6060600080546104c390612821565b80601f01602080910402602001604051908101604052809291908181526020018280546104ef90612821565b801561053c5780601f106105115761010080835404028352916020019161053c565b820191906000526020600020905b81548152906001019060200180831161051f57829003601f168201915b5050505050905090565b600061055182610bf3565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610597826107a8565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610607576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105fe906128c4565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610626610c3e565b73ffffffffffffffffffffffffffffffffffffffff16148061065557506106548161064f610c3e565b610a72565b5b610694576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068b90612956565b60405180910390fd5b61069e8383610c46565b505050565b6106b46106ae610c3e565b82610cff565b6106f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106ea906129e8565b60405180910390fd5b6106fe838383610d94565b505050565b61070b61108d565b61071361110b565b565b610730838383604051806020016040528060008152506109dd565b505050565b610746610740610c3e565b82610cff565b610785576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161077c906129e8565b60405180910390fd5b61078e8161116e565b50565b6000600760009054906101000a900460ff16905090565b6000806107b48361117a565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610825576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161081c90612a54565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361089e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161089590612ae6565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6108ed61108d565b6108f760006111b7565b565b61090161108d565b61090961127d565b565b6000600760019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461094490612821565b80601f016020809104026020016040519081016040528092919081815260200182805461097090612821565b80156109bd5780601f10610992576101008083540402835291602001916109bd565b820191906000526020600020905b8154815290600101906020018083116109a057829003601f168201915b5050505050905090565b6109d96109d2610c3e565b83836112e0565b5050565b6109ee6109e8610c3e565b83610cff565b610a2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a24906129e8565b60405180910390fd5b610a398484848461144c565b50505050565b6060610a4a826114a8565b9050919050565b610a5961108d565b610a6383836115ba565b610a6d82826115d8565b505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610b0e61108d565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610b7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7490612b78565b60405180910390fd5b610b86816111b7565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b610bfc81611645565b610c3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3290612a54565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16610cb9836107a8565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080610d0b836107a8565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480610d4d5750610d4c8185610a72565b5b80610d8b57508373ffffffffffffffffffffffffffffffffffffffff16610d7384610546565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16610db4826107a8565b73ffffffffffffffffffffffffffffffffffffffff1614610e0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0190612c0a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610e79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7090612c9c565b60405180910390fd5b610e868383836001611686565b8273ffffffffffffffffffffffffffffffffffffffff16610ea6826107a8565b73ffffffffffffffffffffffffffffffffffffffff1614610efc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef390612c0a565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461108883838360016116a0565b505050565b611095610c3e565b73ffffffffffffffffffffffffffffffffffffffff166110b361090b565b73ffffffffffffffffffffffffffffffffffffffff1614611109576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110090612d08565b60405180910390fd5b565b6111136116a6565b6000600760006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611157610c3e565b604051611164919061234d565b60405180910390a1565b611177816116ef565b50565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600760019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611285611742565b6001600760006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586112c9610c3e565b6040516112d6919061234d565b60405180910390a1565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361134e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134590612d74565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161143f91906121d3565b60405180910390a3505050565b611457848484610d94565b6114638484848461178c565b6114a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149990612e06565b60405180910390fd5b50505050565b60606114b382610bf3565b60006006600084815260200190815260200160002080546114d390612821565b80601f01602080910402602001604051908101604052809291908181526020018280546114ff90612821565b801561154c5780601f106115215761010080835404028352916020019161154c565b820191906000526020600020905b81548152906001019060200180831161152f57829003601f168201915b50505050509050600061155d611913565b905060008151036115725781925050506115b5565b6000825111156115a757808260405160200161158f929190612e62565b604051602081830303815290604052925050506115b5565b6115b08461192a565b925050505b919050565b6115d4828260405180602001604052806000815250611992565b5050565b6115e182611645565b611620576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161790612ef8565b60405180910390fd5b8060066000848152602001908152602001600020908161164091906130c4565b505050565b60008073ffffffffffffffffffffffffffffffffffffffff166116678361117a565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b61168e611742565b61169a848484846119ed565b50505050565b50505050565b6116ae610791565b6116ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e4906131e2565b60405180910390fd5b565b6116f881611b13565b600060066000838152602001908152602001600020805461171890612821565b90501461173f5760066000828152602001908152602001600020600061173e91906120c2565b5b50565b61174a610791565b1561178a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117819061324e565b60405180910390fd5b565b60006117ad8473ffffffffffffffffffffffffffffffffffffffff16611c61565b15611906578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026117d6610c3e565b8786866040518563ffffffff1660e01b81526004016117f894939291906132c3565b6020604051808303816000875af192505050801561183457506040513d601f19601f820116820180604052508101906118319190613324565b60015b6118b6573d8060008114611864576040519150601f19603f3d011682016040523d82523d6000602084013e611869565b606091505b5060008151036118ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a590612e06565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061190b565b600190505b949350505050565b606060405180602001604052806000815250905090565b606061193582610bf3565b600061193f611913565b9050600081511161195f576040518060200160405280600081525061198a565b8061196984611c84565b60405160200161197a929190612e62565b6040516020818303038152906040525b915050919050565b61199c8383611d52565b6119a9600084848461178c565b6119e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119df90612e06565b60405180910390fd5b505050565b6001811115611b0d57600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614611a815780600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a799190613380565b925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611b0c5780600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611b0491906133b4565b925050819055505b5b50505050565b6000611b1e826107a8565b9050611b2e816000846001611686565b611b37826107a8565b90506004600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611c5d8160008460016116a0565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b606060006001611c9384611f6f565b01905060008167ffffffffffffffff811115611cb257611cb16124f4565b5b6040519080825280601f01601f191660200182016040528015611ce45781602001600182028036833780820191505090505b509050600082602001820190505b600115611d47578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581611d3b57611d3a61340a565b5b04945060008503611cf2575b819350505050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611dc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db890613485565b60405180910390fd5b611dca81611645565b15611e0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e01906134f1565b60405180910390fd5b611e18600083836001611686565b611e2181611645565b15611e61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e58906134f1565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611f6b6000838360016116a0565b5050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310611fcd577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381611fc357611fc261340a565b5b0492506040810190505b6d04ee2d6d415b85acef8100000000831061200a576d04ee2d6d415b85acef8100000000838161200057611fff61340a565b5b0492506020810190505b662386f26fc10000831061203957662386f26fc10000838161202f5761202e61340a565b5b0492506010810190505b6305f5e1008310612062576305f5e10083816120585761205761340a565b5b0492506008810190505b612710831061208757612710838161207d5761207c61340a565b5b0492506004810190505b606483106120aa57606483816120a05761209f61340a565b5b0492506002810190505b600a83106120b9576001810190505b80915050919050565b5080546120ce90612821565b6000825580601f106120e057506120ff565b601f0160209004906000526020600020908101906120fe9190612102565b5b50565b5b8082111561211b576000816000905550600101612103565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61216881612133565b811461217357600080fd5b50565b6000813590506121858161215f565b92915050565b6000602082840312156121a1576121a0612129565b5b60006121af84828501612176565b91505092915050565b60008115159050919050565b6121cd816121b8565b82525050565b60006020820190506121e860008301846121c4565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561222857808201518184015260208101905061220d565b83811115612237576000848401525b50505050565b6000601f19601f8301169050919050565b6000612259826121ee565b61226381856121f9565b935061227381856020860161220a565b61227c8161223d565b840191505092915050565b600060208201905081810360008301526122a1818461224e565b905092915050565b6000819050919050565b6122bc816122a9565b81146122c757600080fd5b50565b6000813590506122d9816122b3565b92915050565b6000602082840312156122f5576122f4612129565b5b6000612303848285016122ca565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006123378261230c565b9050919050565b6123478161232c565b82525050565b6000602082019050612362600083018461233e565b92915050565b6123718161232c565b811461237c57600080fd5b50565b60008135905061238e81612368565b92915050565b600080604083850312156123ab576123aa612129565b5b60006123b98582860161237f565b92505060206123ca858286016122ca565b9150509250929050565b6000806000606084860312156123ed576123ec612129565b5b60006123fb8682870161237f565b935050602061240c8682870161237f565b925050604061241d868287016122ca565b9150509250925092565b60006020828403121561243d5761243c612129565b5b600061244b8482850161237f565b91505092915050565b61245d816122a9565b82525050565b60006020820190506124786000830184612454565b92915050565b612487816121b8565b811461249257600080fd5b50565b6000813590506124a48161247e565b92915050565b600080604083850312156124c1576124c0612129565b5b60006124cf8582860161237f565b92505060206124e085828601612495565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61252c8261223d565b810181811067ffffffffffffffff8211171561254b5761254a6124f4565b5b80604052505050565b600061255e61211f565b905061256a8282612523565b919050565b600067ffffffffffffffff82111561258a576125896124f4565b5b6125938261223d565b9050602081019050919050565b82818337600083830152505050565b60006125c26125bd8461256f565b612554565b9050828152602081018484840111156125de576125dd6124ef565b5b6125e98482856125a0565b509392505050565b600082601f830112612606576126056124ea565b5b81356126168482602086016125af565b91505092915050565b6000806000806080858703121561263957612638612129565b5b60006126478782880161237f565b94505060206126588782880161237f565b9350506040612669878288016122ca565b925050606085013567ffffffffffffffff81111561268a5761268961212e565b5b612696878288016125f1565b91505092959194509250565b600067ffffffffffffffff8211156126bd576126bc6124f4565b5b6126c68261223d565b9050602081019050919050565b60006126e66126e1846126a2565b612554565b905082815260208101848484011115612702576127016124ef565b5b61270d8482856125a0565b509392505050565b600082601f83011261272a576127296124ea565b5b813561273a8482602086016126d3565b91505092915050565b60008060006060848603121561275c5761275b612129565b5b600061276a8682870161237f565b935050602061277b868287016122ca565b925050604084013567ffffffffffffffff81111561279c5761279b61212e565b5b6127a886828701612715565b9150509250925092565b600080604083850312156127c9576127c8612129565b5b60006127d78582860161237f565b92505060206127e88582860161237f565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061283957607f821691505b60208210810361284c5761284b6127f2565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006128ae6021836121f9565b91506128b982612852565b604082019050919050565b600060208201905081810360008301526128dd816128a1565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000612940603d836121f9565b915061294b826128e4565b604082019050919050565b6000602082019050818103600083015261296f81612933565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b60006129d2602d836121f9565b91506129dd82612976565b604082019050919050565b60006020820190508181036000830152612a01816129c5565b9050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000612a3e6018836121f9565b9150612a4982612a08565b602082019050919050565b60006020820190508181036000830152612a6d81612a31565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000612ad06029836121f9565b9150612adb82612a74565b604082019050919050565b60006020820190508181036000830152612aff81612ac3565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612b626026836121f9565b9150612b6d82612b06565b604082019050919050565b60006020820190508181036000830152612b9181612b55565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000612bf46025836121f9565b9150612bff82612b98565b604082019050919050565b60006020820190508181036000830152612c2381612be7565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000612c866024836121f9565b9150612c9182612c2a565b604082019050919050565b60006020820190508181036000830152612cb581612c79565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612cf26020836121f9565b9150612cfd82612cbc565b602082019050919050565b60006020820190508181036000830152612d2181612ce5565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000612d5e6019836121f9565b9150612d6982612d28565b602082019050919050565b60006020820190508181036000830152612d8d81612d51565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000612df06032836121f9565b9150612dfb82612d94565b604082019050919050565b60006020820190508181036000830152612e1f81612de3565b9050919050565b600081905092915050565b6000612e3c826121ee565b612e468185612e26565b9350612e5681856020860161220a565b80840191505092915050565b6000612e6e8285612e31565b9150612e7a8284612e31565b91508190509392505050565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b6000612ee2602e836121f9565b9150612eed82612e86565b604082019050919050565b60006020820190508181036000830152612f1181612ed5565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302612f7a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82612f3d565b612f848683612f3d565b95508019841693508086168417925050509392505050565b6000819050919050565b6000612fc1612fbc612fb7846122a9565b612f9c565b6122a9565b9050919050565b6000819050919050565b612fdb83612fa6565b612fef612fe782612fc8565b848454612f4a565b825550505050565b600090565b613004612ff7565b61300f818484612fd2565b505050565b5b8181101561303357613028600082612ffc565b600181019050613015565b5050565b601f8211156130785761304981612f18565b61305284612f2d565b81016020851015613061578190505b61307561306d85612f2d565b830182613014565b50505b505050565b600082821c905092915050565b600061309b6000198460080261307d565b1980831691505092915050565b60006130b4838361308a565b9150826002028217905092915050565b6130cd826121ee565b67ffffffffffffffff8111156130e6576130e56124f4565b5b6130f08254612821565b6130fb828285613037565b600060209050601f83116001811461312e576000841561311c578287015190505b61312685826130a8565b86555061318e565b601f19841661313c86612f18565b60005b828110156131645784890151825560018201915060208501945060208101905061313f565b86831015613181578489015161317d601f89168261308a565b8355505b6001600288020188555050505b505050505050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b60006131cc6014836121f9565b91506131d782613196565b602082019050919050565b600060208201905081810360008301526131fb816131bf565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b60006132386010836121f9565b915061324382613202565b602082019050919050565b600060208201905081810360008301526132678161322b565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006132958261326e565b61329f8185613279565b93506132af81856020860161220a565b6132b88161223d565b840191505092915050565b60006080820190506132d8600083018761233e565b6132e5602083018661233e565b6132f26040830185612454565b8181036060830152613304818461328a565b905095945050505050565b60008151905061331e8161215f565b92915050565b60006020828403121561333a57613339612129565b5b60006133488482850161330f565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061338b826122a9565b9150613396836122a9565b9250828210156133a9576133a8613351565b5b828203905092915050565b60006133bf826122a9565b91506133ca836122a9565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156133ff576133fe613351565b5b828201905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600061346f6020836121f9565b915061347a82613439565b602082019050919050565b6000602082019050818103600083015261349e81613462565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006134db601c836121f9565b91506134e6826134a5565b602082019050919050565b6000602082019050818103600083015261350a816134ce565b905091905056fea2646970667358221220eceea694bc135e855ef463ea6258f4587c333b28843cfe990c8ddbb58d8b663b64736f6c634300080f0033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101375760003560e01c806370a08231116100b8578063a22cb4651161007c578063a22cb46514610302578063b88d4fde1461031e578063c87b56dd1461033a578063cd279c7c1461036a578063e985e9c514610386578063f2fde38b146103b657610137565b806370a0823114610282578063715018a6146102b25780638456cb59146102bc5780638da5cb5b146102c657806395d89b41146102e457610137565b80633f4ba83a116100ff5780633f4ba83a146101f257806342842e0e146101fc57806342966c68146102185780635c975abb146102345780636352211e1461025257610137565b806301ffc9a71461013c57806306fdde031461016c578063081812fc1461018a578063095ea7b3146101ba57806323b872dd146101d6575b600080fd5b6101566004803603810190610151919061218b565b6103d2565b60405161016391906121d3565b60405180910390f35b6101746104b4565b6040516101819190612287565b60405180910390f35b6101a4600480360381019061019f91906122df565b610546565b6040516101b1919061234d565b60405180910390f35b6101d460048036038101906101cf9190612394565b61058c565b005b6101f060048036038101906101eb91906123d4565b6106a3565b005b6101fa610703565b005b610216600480360381019061021191906123d4565b610715565b005b610232600480360381019061022d91906122df565b610735565b005b61023c610791565b60405161024991906121d3565b60405180910390f35b61026c600480360381019061026791906122df565b6107a8565b604051610279919061234d565b60405180910390f35b61029c60048036038101906102979190612427565b61082e565b6040516102a99190612463565b60405180910390f35b6102ba6108e5565b005b6102c46108f9565b005b6102ce61090b565b6040516102db919061234d565b60405180910390f35b6102ec610935565b6040516102f99190612287565b60405180910390f35b61031c600480360381019061031791906124aa565b6109c7565b005b6103386004803603810190610333919061261f565b6109dd565b005b610354600480360381019061034f91906122df565b610a3f565b6040516103619190612287565b60405180910390f35b610384600480360381019061037f9190612743565b610a51565b005b6103a0600480360381019061039b91906127b2565b610a72565b6040516103ad91906121d3565b60405180910390f35b6103d060048036038101906103cb9190612427565b610b06565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061049d57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806104ad57506104ac82610b89565b5b9050919050565b6060600080546104c390612821565b80601f01602080910402602001604051908101604052809291908181526020018280546104ef90612821565b801561053c5780601f106105115761010080835404028352916020019161053c565b820191906000526020600020905b81548152906001019060200180831161051f57829003601f168201915b5050505050905090565b600061055182610bf3565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610597826107a8565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610607576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105fe906128c4565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610626610c3e565b73ffffffffffffffffffffffffffffffffffffffff16148061065557506106548161064f610c3e565b610a72565b5b610694576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068b90612956565b60405180910390fd5b61069e8383610c46565b505050565b6106b46106ae610c3e565b82610cff565b6106f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106ea906129e8565b60405180910390fd5b6106fe838383610d94565b505050565b61070b61108d565b61071361110b565b565b610730838383604051806020016040528060008152506109dd565b505050565b610746610740610c3e565b82610cff565b610785576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161077c906129e8565b60405180910390fd5b61078e8161116e565b50565b6000600760009054906101000a900460ff16905090565b6000806107b48361117a565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610825576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161081c90612a54565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361089e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161089590612ae6565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6108ed61108d565b6108f760006111b7565b565b61090161108d565b61090961127d565b565b6000600760019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461094490612821565b80601f016020809104026020016040519081016040528092919081815260200182805461097090612821565b80156109bd5780601f10610992576101008083540402835291602001916109bd565b820191906000526020600020905b8154815290600101906020018083116109a057829003601f168201915b5050505050905090565b6109d96109d2610c3e565b83836112e0565b5050565b6109ee6109e8610c3e565b83610cff565b610a2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a24906129e8565b60405180910390fd5b610a398484848461144c565b50505050565b6060610a4a826114a8565b9050919050565b610a5961108d565b610a6383836115ba565b610a6d82826115d8565b505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610b0e61108d565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610b7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7490612b78565b60405180910390fd5b610b86816111b7565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b610bfc81611645565b610c3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3290612a54565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16610cb9836107a8565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080610d0b836107a8565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480610d4d5750610d4c8185610a72565b5b80610d8b57508373ffffffffffffffffffffffffffffffffffffffff16610d7384610546565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16610db4826107a8565b73ffffffffffffffffffffffffffffffffffffffff1614610e0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0190612c0a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610e79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7090612c9c565b60405180910390fd5b610e868383836001611686565b8273ffffffffffffffffffffffffffffffffffffffff16610ea6826107a8565b73ffffffffffffffffffffffffffffffffffffffff1614610efc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef390612c0a565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461108883838360016116a0565b505050565b611095610c3e565b73ffffffffffffffffffffffffffffffffffffffff166110b361090b565b73ffffffffffffffffffffffffffffffffffffffff1614611109576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110090612d08565b60405180910390fd5b565b6111136116a6565b6000600760006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611157610c3e565b604051611164919061234d565b60405180910390a1565b611177816116ef565b50565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600760019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611285611742565b6001600760006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586112c9610c3e565b6040516112d6919061234d565b60405180910390a1565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361134e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134590612d74565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161143f91906121d3565b60405180910390a3505050565b611457848484610d94565b6114638484848461178c565b6114a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149990612e06565b60405180910390fd5b50505050565b60606114b382610bf3565b60006006600084815260200190815260200160002080546114d390612821565b80601f01602080910402602001604051908101604052809291908181526020018280546114ff90612821565b801561154c5780601f106115215761010080835404028352916020019161154c565b820191906000526020600020905b81548152906001019060200180831161152f57829003601f168201915b50505050509050600061155d611913565b905060008151036115725781925050506115b5565b6000825111156115a757808260405160200161158f929190612e62565b604051602081830303815290604052925050506115b5565b6115b08461192a565b925050505b919050565b6115d4828260405180602001604052806000815250611992565b5050565b6115e182611645565b611620576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161790612ef8565b60405180910390fd5b8060066000848152602001908152602001600020908161164091906130c4565b505050565b60008073ffffffffffffffffffffffffffffffffffffffff166116678361117a565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b61168e611742565b61169a848484846119ed565b50505050565b50505050565b6116ae610791565b6116ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e4906131e2565b60405180910390fd5b565b6116f881611b13565b600060066000838152602001908152602001600020805461171890612821565b90501461173f5760066000828152602001908152602001600020600061173e91906120c2565b5b50565b61174a610791565b1561178a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117819061324e565b60405180910390fd5b565b60006117ad8473ffffffffffffffffffffffffffffffffffffffff16611c61565b15611906578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026117d6610c3e565b8786866040518563ffffffff1660e01b81526004016117f894939291906132c3565b6020604051808303816000875af192505050801561183457506040513d601f19601f820116820180604052508101906118319190613324565b60015b6118b6573d8060008114611864576040519150601f19603f3d011682016040523d82523d6000602084013e611869565b606091505b5060008151036118ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a590612e06565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061190b565b600190505b949350505050565b606060405180602001604052806000815250905090565b606061193582610bf3565b600061193f611913565b9050600081511161195f576040518060200160405280600081525061198a565b8061196984611c84565b60405160200161197a929190612e62565b6040516020818303038152906040525b915050919050565b61199c8383611d52565b6119a9600084848461178c565b6119e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119df90612e06565b60405180910390fd5b505050565b6001811115611b0d57600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614611a815780600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a799190613380565b925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611b0c5780600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611b0491906133b4565b925050819055505b5b50505050565b6000611b1e826107a8565b9050611b2e816000846001611686565b611b37826107a8565b90506004600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611c5d8160008460016116a0565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b606060006001611c9384611f6f565b01905060008167ffffffffffffffff811115611cb257611cb16124f4565b5b6040519080825280601f01601f191660200182016040528015611ce45781602001600182028036833780820191505090505b509050600082602001820190505b600115611d47578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581611d3b57611d3a61340a565b5b04945060008503611cf2575b819350505050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611dc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db890613485565b60405180910390fd5b611dca81611645565b15611e0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e01906134f1565b60405180910390fd5b611e18600083836001611686565b611e2181611645565b15611e61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e58906134f1565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611f6b6000838360016116a0565b5050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310611fcd577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381611fc357611fc261340a565b5b0492506040810190505b6d04ee2d6d415b85acef8100000000831061200a576d04ee2d6d415b85acef8100000000838161200057611fff61340a565b5b0492506020810190505b662386f26fc10000831061203957662386f26fc10000838161202f5761202e61340a565b5b0492506010810190505b6305f5e1008310612062576305f5e10083816120585761205761340a565b5b0492506008810190505b612710831061208757612710838161207d5761207c61340a565b5b0492506004810190505b606483106120aa57606483816120a05761209f61340a565b5b0492506002810190505b600a83106120b9576001810190505b80915050919050565b5080546120ce90612821565b6000825580601f106120e057506120ff565b601f0160209004906000526020600020908101906120fe9190612102565b5b50565b5b8082111561211b576000816000905550600101612103565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61216881612133565b811461217357600080fd5b50565b6000813590506121858161215f565b92915050565b6000602082840312156121a1576121a0612129565b5b60006121af84828501612176565b91505092915050565b60008115159050919050565b6121cd816121b8565b82525050565b60006020820190506121e860008301846121c4565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561222857808201518184015260208101905061220d565b83811115612237576000848401525b50505050565b6000601f19601f8301169050919050565b6000612259826121ee565b61226381856121f9565b935061227381856020860161220a565b61227c8161223d565b840191505092915050565b600060208201905081810360008301526122a1818461224e565b905092915050565b6000819050919050565b6122bc816122a9565b81146122c757600080fd5b50565b6000813590506122d9816122b3565b92915050565b6000602082840312156122f5576122f4612129565b5b6000612303848285016122ca565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006123378261230c565b9050919050565b6123478161232c565b82525050565b6000602082019050612362600083018461233e565b92915050565b6123718161232c565b811461237c57600080fd5b50565b60008135905061238e81612368565b92915050565b600080604083850312156123ab576123aa612129565b5b60006123b98582860161237f565b92505060206123ca858286016122ca565b9150509250929050565b6000806000606084860312156123ed576123ec612129565b5b60006123fb8682870161237f565b935050602061240c8682870161237f565b925050604061241d868287016122ca565b9150509250925092565b60006020828403121561243d5761243c612129565b5b600061244b8482850161237f565b91505092915050565b61245d816122a9565b82525050565b60006020820190506124786000830184612454565b92915050565b612487816121b8565b811461249257600080fd5b50565b6000813590506124a48161247e565b92915050565b600080604083850312156124c1576124c0612129565b5b60006124cf8582860161237f565b92505060206124e085828601612495565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61252c8261223d565b810181811067ffffffffffffffff8211171561254b5761254a6124f4565b5b80604052505050565b600061255e61211f565b905061256a8282612523565b919050565b600067ffffffffffffffff82111561258a576125896124f4565b5b6125938261223d565b9050602081019050919050565b82818337600083830152505050565b60006125c26125bd8461256f565b612554565b9050828152602081018484840111156125de576125dd6124ef565b5b6125e98482856125a0565b509392505050565b600082601f830112612606576126056124ea565b5b81356126168482602086016125af565b91505092915050565b6000806000806080858703121561263957612638612129565b5b60006126478782880161237f565b94505060206126588782880161237f565b9350506040612669878288016122ca565b925050606085013567ffffffffffffffff81111561268a5761268961212e565b5b612696878288016125f1565b91505092959194509250565b600067ffffffffffffffff8211156126bd576126bc6124f4565b5b6126c68261223d565b9050602081019050919050565b60006126e66126e1846126a2565b612554565b905082815260208101848484011115612702576127016124ef565b5b61270d8482856125a0565b509392505050565b600082601f83011261272a576127296124ea565b5b813561273a8482602086016126d3565b91505092915050565b60008060006060848603121561275c5761275b612129565b5b600061276a8682870161237f565b935050602061277b868287016122ca565b925050604084013567ffffffffffffffff81111561279c5761279b61212e565b5b6127a886828701612715565b9150509250925092565b600080604083850312156127c9576127c8612129565b5b60006127d78582860161237f565b92505060206127e88582860161237f565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061283957607f821691505b60208210810361284c5761284b6127f2565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006128ae6021836121f9565b91506128b982612852565b604082019050919050565b600060208201905081810360008301526128dd816128a1565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000612940603d836121f9565b915061294b826128e4565b604082019050919050565b6000602082019050818103600083015261296f81612933565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b60006129d2602d836121f9565b91506129dd82612976565b604082019050919050565b60006020820190508181036000830152612a01816129c5565b9050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000612a3e6018836121f9565b9150612a4982612a08565b602082019050919050565b60006020820190508181036000830152612a6d81612a31565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000612ad06029836121f9565b9150612adb82612a74565b604082019050919050565b60006020820190508181036000830152612aff81612ac3565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612b626026836121f9565b9150612b6d82612b06565b604082019050919050565b60006020820190508181036000830152612b9181612b55565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000612bf46025836121f9565b9150612bff82612b98565b604082019050919050565b60006020820190508181036000830152612c2381612be7565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000612c866024836121f9565b9150612c9182612c2a565b604082019050919050565b60006020820190508181036000830152612cb581612c79565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612cf26020836121f9565b9150612cfd82612cbc565b602082019050919050565b60006020820190508181036000830152612d2181612ce5565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000612d5e6019836121f9565b9150612d6982612d28565b602082019050919050565b60006020820190508181036000830152612d8d81612d51565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000612df06032836121f9565b9150612dfb82612d94565b604082019050919050565b60006020820190508181036000830152612e1f81612de3565b9050919050565b600081905092915050565b6000612e3c826121ee565b612e468185612e26565b9350612e5681856020860161220a565b80840191505092915050565b6000612e6e8285612e31565b9150612e7a8284612e31565b91508190509392505050565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b6000612ee2602e836121f9565b9150612eed82612e86565b604082019050919050565b60006020820190508181036000830152612f1181612ed5565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302612f7a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82612f3d565b612f848683612f3d565b95508019841693508086168417925050509392505050565b6000819050919050565b6000612fc1612fbc612fb7846122a9565b612f9c565b6122a9565b9050919050565b6000819050919050565b612fdb83612fa6565b612fef612fe782612fc8565b848454612f4a565b825550505050565b600090565b613004612ff7565b61300f818484612fd2565b505050565b5b8181101561303357613028600082612ffc565b600181019050613015565b5050565b601f8211156130785761304981612f18565b61305284612f2d565b81016020851015613061578190505b61307561306d85612f2d565b830182613014565b50505b505050565b600082821c905092915050565b600061309b6000198460080261307d565b1980831691505092915050565b60006130b4838361308a565b9150826002028217905092915050565b6130cd826121ee565b67ffffffffffffffff8111156130e6576130e56124f4565b5b6130f08254612821565b6130fb828285613037565b600060209050601f83116001811461312e576000841561311c578287015190505b61312685826130a8565b86555061318e565b601f19841661313c86612f18565b60005b828110156131645784890151825560018201915060208501945060208101905061313f565b86831015613181578489015161317d601f89168261308a565b8355505b6001600288020188555050505b505050505050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b60006131cc6014836121f9565b91506131d782613196565b602082019050919050565b600060208201905081810360008301526131fb816131bf565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b60006132386010836121f9565b915061324382613202565b602082019050919050565b600060208201905081810360008301526132678161322b565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006132958261326e565b61329f8185613279565b93506132af81856020860161220a565b6132b88161223d565b840191505092915050565b60006080820190506132d8600083018761233e565b6132e5602083018661233e565b6132f26040830185612454565b8181036060830152613304818461328a565b905095945050505050565b60008151905061331e8161215f565b92915050565b60006020828403121561333a57613339612129565b5b60006133488482850161330f565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061338b826122a9565b9150613396836122a9565b9250828210156133a9576133a8613351565b5b828203905092915050565b60006133bf826122a9565b91506133ca836122a9565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156133ff576133fe613351565b5b828201905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600061346f6020836121f9565b915061347a82613439565b602082019050919050565b6000602082019050818103600083015261349e81613462565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006134db601c836121f9565b91506134e6826134a5565b602082019050919050565b6000602082019050818103600083015261350a816134ce565b905091905056fea2646970667358221220eceea694bc135e855ef463ea6258f4587c333b28843cfe990c8ddbb58d8b663b64736f6c634300080f0033
Deployed Bytecode Sourcemap
59925:1117:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41258:305;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42186:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43698:171;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43216:416;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44398:335;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60146:65;;;:::i;:::-;;44804:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57636:242;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20524:86;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41896:223;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41627:207;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18034:103;;;:::i;:::-;;60077:61;;;:::i;:::-;;17386:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42355:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43941:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45060:322;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60843:196;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60219:184;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44167:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18292:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41258:305;41360:4;41412:25;41397:40;;;:11;:40;;;;:105;;;;41469:33;41454:48;;;:11;:48;;;;41397:105;:158;;;;41519:36;41543:11;41519:23;:36::i;:::-;41397:158;41377:178;;41258:305;;;:::o;42186:100::-;42240:13;42273:5;42266:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42186:100;:::o;43698:171::-;43774:7;43794:23;43809:7;43794:14;:23::i;:::-;43837:15;:24;43853:7;43837:24;;;;;;;;;;;;;;;;;;;;;43830:31;;43698:171;;;:::o;43216:416::-;43297:13;43313:23;43328:7;43313:14;:23::i;:::-;43297:39;;43361:5;43355:11;;:2;:11;;;43347:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;43455:5;43439:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;43464:37;43481:5;43488:12;:10;:12::i;:::-;43464:16;:37::i;:::-;43439:62;43417:173;;;;;;;;;;;;:::i;:::-;;;;;;;;;43603:21;43612:2;43616:7;43603:8;:21::i;:::-;43286:346;43216:416;;:::o;44398:335::-;44593:41;44612:12;:10;:12::i;:::-;44626:7;44593:18;:41::i;:::-;44585:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;44697:28;44707:4;44713:2;44717:7;44697:9;:28::i;:::-;44398:335;;;:::o;60146:65::-;17272:13;:11;:13::i;:::-;60193:10:::1;:8;:10::i;:::-;60146:65::o:0;44804:185::-;44942:39;44959:4;44965:2;44969:7;44942:39;;;;;;;;;;;;:16;:39::i;:::-;44804:185;;;:::o;57636:242::-;57754:41;57773:12;:10;:12::i;:::-;57787:7;57754:18;:41::i;:::-;57746:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;57856:14;57862:7;57856:5;:14::i;:::-;57636:242;:::o;20524:86::-;20571:4;20595:7;;;;;;;;;;;20588:14;;20524:86;:::o;41896:223::-;41968:7;41988:13;42004:17;42013:7;42004:8;:17::i;:::-;41988:33;;42057:1;42040:19;;:5;:19;;;42032:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;42106:5;42099:12;;;41896:223;;;:::o;41627:207::-;41699:7;41744:1;41727:19;;:5;:19;;;41719:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;41810:9;:16;41820:5;41810:16;;;;;;;;;;;;;;;;41803:23;;41627:207;;;:::o;18034:103::-;17272:13;:11;:13::i;:::-;18099:30:::1;18126:1;18099:18;:30::i;:::-;18034:103::o:0;60077:61::-;17272:13;:11;:13::i;:::-;60122:8:::1;:6;:8::i;:::-;60077:61::o:0;17386:87::-;17432:7;17459:6;;;;;;;;;;;17452:13;;17386:87;:::o;42355:104::-;42411:13;42444:7;42437:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42355:104;:::o;43941:155::-;44036:52;44055:12;:10;:12::i;:::-;44069:8;44079;44036:18;:52::i;:::-;43941:155;;:::o;45060:322::-;45234:41;45253:12;:10;:12::i;:::-;45267:7;45234:18;:41::i;:::-;45226:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;45336:38;45350:4;45356:2;45360:7;45369:4;45336:13;:38::i;:::-;45060:322;;;;:::o;60843:196::-;60970:13;61008:23;61023:7;61008:14;:23::i;:::-;61001:30;;60843:196;;;:::o;60219:184::-;17272:13;:11;:13::i;:::-;60336:22:::1;60346:2;60350:7;60336:9;:22::i;:::-;60369:26;60382:7;60391:3;60369:12;:26::i;:::-;60219:184:::0;;;:::o;44167:164::-;44264:4;44288:18;:25;44307:5;44288:25;;;;;;;;;;;;;;;:35;44314:8;44288:35;;;;;;;;;;;;;;;;;;;;;;;;;44281:42;;44167:164;;;;:::o;18292:201::-;17272:13;:11;:13::i;:::-;18401:1:::1;18381:22;;:8;:22;;::::0;18373:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;18457:28;18476:8;18457:18;:28::i;:::-;18292:201:::0;:::o;33770:157::-;33855:4;33894:25;33879:40;;;:11;:40;;;;33872:47;;33770:157;;;:::o;53517:135::-;53599:16;53607:7;53599;:16::i;:::-;53591:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;53517:135;:::o;15937:98::-;15990:7;16017:10;16010:17;;15937:98;:::o;52796:174::-;52898:2;52871:15;:24;52887:7;52871:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;52954:7;52950:2;52916:46;;52925:23;52940:7;52925:14;:23::i;:::-;52916:46;;;;;;;;;;;;52796:174;;:::o;47415:264::-;47508:4;47525:13;47541:23;47556:7;47541:14;:23::i;:::-;47525:39;;47594:5;47583:16;;:7;:16;;;:52;;;;47603:32;47620:5;47627:7;47603:16;:32::i;:::-;47583:52;:87;;;;47663:7;47639:31;;:20;47651:7;47639:11;:20::i;:::-;:31;;;47583:87;47575:96;;;47415:264;;;;:::o;51414:1263::-;51573:4;51546:31;;:23;51561:7;51546:14;:23::i;:::-;:31;;;51538:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;51652:1;51638:16;;:2;:16;;;51630:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;51708:42;51729:4;51735:2;51739:7;51748:1;51708:20;:42::i;:::-;51880:4;51853:31;;:23;51868:7;51853:14;:23::i;:::-;:31;;;51845:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;51998:15;:24;52014:7;51998:24;;;;;;;;;;;;51991:31;;;;;;;;;;;52493:1;52474:9;:15;52484:4;52474:15;;;;;;;;;;;;;;;;:20;;;;;;;;;;;52526:1;52509:9;:13;52519:2;52509:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;52568:2;52549:7;:16;52557:7;52549:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;52607:7;52603:2;52588:27;;52597:4;52588:27;;;;;;;;;;;;52628:41;52648:4;52654:2;52658:7;52667:1;52628:19;:41::i;:::-;51414:1263;;;:::o;17551:132::-;17626:12;:10;:12::i;:::-;17615:23;;:7;:5;:7::i;:::-;:23;;;17607:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;17551:132::o;21379:120::-;20388:16;:14;:16::i;:::-;21448:5:::1;21438:7;;:15;;;;;;;;;;;;;;;;;;21469:22;21478:12;:10;:12::i;:::-;21469:22;;;;;;:::i;:::-;;;;;;;;21379:120::o:0;60720:115::-;60807:20;60819:7;60807:11;:20::i;:::-;60720:115;:::o;46690:117::-;46756:7;46783;:16;46791:7;46783:16;;;;;;;;;;;;;;;;;;;;;46776:23;;46690:117;;;:::o;18653:191::-;18727:16;18746:6;;;;;;;;;;;18727:25;;18772:8;18763:6;;:17;;;;;;;;;;;;;;;;;;18827:8;18796:40;;18817:8;18796:40;;;;;;;;;;;;18716:128;18653:191;:::o;21120:118::-;20129:19;:17;:19::i;:::-;21190:4:::1;21180:7;;:14;;;;;;;;;;;;;;;;;;21210:20;21217:12;:10;:12::i;:::-;21210:20;;;;;;:::i;:::-;;;;;;;;21120:118::o:0;53113:315::-;53268:8;53259:17;;:5;:17;;;53251:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;53355:8;53317:18;:25;53336:5;53317:25;;;;;;;;;;;;;;;:35;53343:8;53317:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;53401:8;53379:41;;53394:5;53379:41;;;53411:8;53379:41;;;;;;:::i;:::-;;;;;;;;53113:315;;;:::o;46263:313::-;46419:28;46429:4;46435:2;46439:7;46419:9;:28::i;:::-;46466:47;46489:4;46495:2;46499:7;46508:4;46466:22;:47::i;:::-;46458:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;46263:313;;;;:::o;58411:624::-;58484:13;58510:23;58525:7;58510:14;:23::i;:::-;58546;58572:10;:19;58583:7;58572:19;;;;;;;;;;;58546:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58602:18;58623:10;:8;:10::i;:::-;58602:31;;58731:1;58715:4;58709:18;:23;58705:72;;58756:9;58749:16;;;;;;58705:72;58907:1;58887:9;58881:23;:27;58877:108;;;58956:4;58962:9;58939:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;58925:48;;;;;;58877:108;59004:23;59019:7;59004:14;:23::i;:::-;58997:30;;;;58411:624;;;;:::o;48021:110::-;48097:26;48107:2;48111:7;48097:26;;;;;;;;;;;;:9;:26::i;:::-;48021:110;;:::o;59191:217::-;59291:16;59299:7;59291;:16::i;:::-;59283:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;59391:9;59369:10;:19;59380:7;59369:19;;;;;;;;;;;:31;;;;;;:::i;:::-;;59191:217;;:::o;47120:128::-;47185:4;47238:1;47209:31;;:17;47218:7;47209:8;:17::i;:::-;:31;;;;47202:38;;47120:128;;;:::o;60411:231::-;20129:19;:17;:19::i;:::-;60578:56:::1;60605:4;60611:2;60615:7;60624:9;60578:26;:56::i;:::-;60411:231:::0;;;;:::o;56933:158::-;;;;;:::o;20868:108::-;20935:8;:6;:8::i;:::-;20927:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;20868:108::o;59633:206::-;59702:20;59714:7;59702:11;:20::i;:::-;59776:1;59745:10;:19;59756:7;59745:19;;;;;;;;;;;59739:33;;;;;:::i;:::-;;;:38;59735:97;;59801:10;:19;59812:7;59801:19;;;;;;;;;;;;59794:26;;;;:::i;:::-;59735:97;59633:206;:::o;20683:108::-;20754:8;:6;:8::i;:::-;20753:9;20745:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;20683:108::o;54216:853::-;54370:4;54391:15;:2;:13;;;:15::i;:::-;54387:675;;;54443:2;54427:36;;;54464:12;:10;:12::i;:::-;54478:4;54484:7;54493:4;54427:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;54423:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54685:1;54668:6;:13;:18;54664:328;;54711:60;;;;;;;;;;:::i;:::-;;;;;;;;54664:328;54942:6;54936:13;54927:6;54923:2;54919:15;54912:38;54423:584;54559:41;;;54549:51;;;:6;:51;;;;54542:58;;;;;54387:675;55046:4;55039:11;;54216:853;;;;;;;:::o;43060:94::-;43111:13;43137:9;;;;;;;;;;;;;;43060:94;:::o;42530:281::-;42603:13;42629:23;42644:7;42629:14;:23::i;:::-;42665:21;42689:10;:8;:10::i;:::-;42665:34;;42741:1;42723:7;42717:21;:25;:86;;;;;;;;;;;;;;;;;42769:7;42778:18;:7;:16;:18::i;:::-;42752:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;42717:86;42710:93;;;42530:281;;;:::o;48358:319::-;48487:18;48493:2;48497:7;48487:5;:18::i;:::-;48538:53;48569:1;48573:2;48577:7;48586:4;48538:22;:53::i;:::-;48516:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;48358:319;;;:::o;55801:410::-;55991:1;55979:9;:13;55975:229;;;56029:1;56013:18;;:4;:18;;;56009:87;;56071:9;56052;:15;56062:4;56052:15;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;56009:87;56128:1;56114:16;;:2;:16;;;56110:83;;56168:9;56151;:13;56161:2;56151:13;;;;;;;;;;;;;;;;:26;;;;;;;:::i;:::-;;;;;;;;56110:83;55975:229;55801:410;;;;:::o;50294:783::-;50354:13;50370:23;50385:7;50370:14;:23::i;:::-;50354:39;;50406:51;50427:5;50442:1;50446:7;50455:1;50406:20;:51::i;:::-;50570:23;50585:7;50570:14;:23::i;:::-;50562:31;;50641:15;:24;50657:7;50641:24;;;;;;;;;;;;50634:31;;;;;;;;;;;50906:1;50886:9;:16;50896:5;50886:16;;;;;;;;;;;;;;;;:21;;;;;;;;;;;50936:7;:16;50944:7;50936:16;;;;;;;;;;;;50929:23;;;;;;;;;;;50998:7;50994:1;50970:36;;50979:5;50970:36;;;;;;;;;;;;51019:50;51039:5;51054:1;51058:7;51067:1;51019:19;:50::i;:::-;50343:734;50294:783;:::o;22739:326::-;22799:4;23056:1;23034:7;:19;;;:23;23027:30;;22739:326;;;:::o;13364:716::-;13420:13;13471:14;13508:1;13488:17;13499:5;13488:10;:17::i;:::-;:21;13471:38;;13524:20;13558:6;13547:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13524:41;;13580:11;13709:6;13705:2;13701:15;13693:6;13689:28;13682:35;;13746:288;13753:4;13746:288;;;13778:5;;;;;;;;13920:8;13915:2;13908:5;13904:14;13899:30;13894:3;13886:44;13976:2;13967:11;;;;;;:::i;:::-;;;;;14010:1;14001:5;:10;13746:288;13997:21;13746:288;14055:6;14048:13;;;;;13364:716;;;:::o;49013:942::-;49107:1;49093:16;;:2;:16;;;49085:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;49166:16;49174:7;49166;:16::i;:::-;49165:17;49157:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;49228:48;49257:1;49261:2;49265:7;49274:1;49228:20;:48::i;:::-;49375:16;49383:7;49375;:16::i;:::-;49374:17;49366:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;49790:1;49773:9;:13;49783:2;49773:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;49834:2;49815:7;:16;49823:7;49815:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;49879:7;49875:2;49854:33;;49871:1;49854:33;;;;;;;;;;;;49900:47;49928:1;49932:2;49936:7;49945:1;49900:19;:47::i;:::-;49013:942;;:::o;10230:922::-;10283:7;10303:14;10320:1;10303:18;;10370:6;10361:5;:15;10357:102;;10406:6;10397:15;;;;;;:::i;:::-;;;;;10441:2;10431:12;;;;10357:102;10486:6;10477:5;:15;10473:102;;10522:6;10513:15;;;;;;:::i;:::-;;;;;10557:2;10547:12;;;;10473:102;10602:6;10593:5;:15;10589:102;;10638:6;10629:15;;;;;;:::i;:::-;;;;;10673:2;10663:12;;;;10589:102;10718:5;10709;:14;10705:99;;10753:5;10744:14;;;;;;:::i;:::-;;;;;10787:1;10777:11;;;;10705:99;10831:5;10822;:14;10818:99;;10866:5;10857:14;;;;;;:::i;:::-;;;;;10900:1;10890:11;;;;10818:99;10944:5;10935;:14;10931:99;;10979:5;10970:14;;;;;;:::i;:::-;;;;;11013:1;11003:11;;;;10931:99;11057:5;11048;:14;11044:66;;11093:1;11083:11;;;;11044:66;11138:6;11131:13;;;10230:922;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:619::-;5015:6;5023;5031;5080:2;5068:9;5059:7;5055:23;5051:32;5048:119;;;5086:79;;:::i;:::-;5048:119;5206:1;5231:53;5276:7;5267:6;5256:9;5252:22;5231:53;:::i;:::-;5221:63;;5177:117;5333:2;5359:53;5404:7;5395:6;5384:9;5380:22;5359:53;:::i;:::-;5349:63;;5304:118;5461:2;5487:53;5532:7;5523:6;5512:9;5508:22;5487:53;:::i;:::-;5477:63;;5432:118;4938:619;;;;;:::o;5563:329::-;5622:6;5671:2;5659:9;5650:7;5646:23;5642:32;5639:119;;;5677:79;;:::i;:::-;5639:119;5797:1;5822:53;5867:7;5858:6;5847:9;5843:22;5822:53;:::i;:::-;5812:63;;5768:117;5563:329;;;;:::o;5898:118::-;5985:24;6003:5;5985:24;:::i;:::-;5980:3;5973:37;5898:118;;:::o;6022:222::-;6115:4;6153:2;6142:9;6138:18;6130:26;;6166:71;6234:1;6223:9;6219:17;6210:6;6166:71;:::i;:::-;6022:222;;;;:::o;6250:116::-;6320:21;6335:5;6320:21;:::i;:::-;6313:5;6310:32;6300:60;;6356:1;6353;6346:12;6300:60;6250:116;:::o;6372:133::-;6415:5;6453:6;6440:20;6431:29;;6469:30;6493:5;6469:30;:::i;:::-;6372:133;;;;:::o;6511:468::-;6576:6;6584;6633:2;6621:9;6612:7;6608:23;6604:32;6601:119;;;6639:79;;:::i;:::-;6601:119;6759:1;6784:53;6829:7;6820:6;6809:9;6805:22;6784:53;:::i;:::-;6774:63;;6730:117;6886:2;6912:50;6954:7;6945:6;6934:9;6930:22;6912:50;:::i;:::-;6902:60;;6857:115;6511:468;;;;;:::o;6985:117::-;7094:1;7091;7084:12;7108:117;7217:1;7214;7207:12;7231:180;7279:77;7276:1;7269:88;7376:4;7373:1;7366:15;7400:4;7397:1;7390:15;7417:281;7500:27;7522:4;7500:27;:::i;:::-;7492:6;7488:40;7630:6;7618:10;7615:22;7594:18;7582:10;7579:34;7576:62;7573:88;;;7641:18;;:::i;:::-;7573:88;7681:10;7677:2;7670:22;7460:238;7417:281;;:::o;7704:129::-;7738:6;7765:20;;:::i;:::-;7755:30;;7794:33;7822:4;7814:6;7794:33;:::i;:::-;7704:129;;;:::o;7839:307::-;7900:4;7990:18;7982:6;7979:30;7976:56;;;8012:18;;:::i;:::-;7976:56;8050:29;8072:6;8050:29;:::i;:::-;8042:37;;8134:4;8128;8124:15;8116:23;;7839:307;;;:::o;8152:154::-;8236:6;8231:3;8226;8213:30;8298:1;8289:6;8284:3;8280:16;8273:27;8152:154;;;:::o;8312:410::-;8389:5;8414:65;8430:48;8471:6;8430:48;:::i;:::-;8414:65;:::i;:::-;8405:74;;8502:6;8495:5;8488:21;8540:4;8533:5;8529:16;8578:3;8569:6;8564:3;8560:16;8557:25;8554:112;;;8585:79;;:::i;:::-;8554:112;8675:41;8709:6;8704:3;8699;8675:41;:::i;:::-;8395:327;8312:410;;;;;:::o;8741:338::-;8796:5;8845:3;8838:4;8830:6;8826:17;8822:27;8812:122;;8853:79;;:::i;:::-;8812:122;8970:6;8957:20;8995:78;9069:3;9061:6;9054:4;9046:6;9042:17;8995:78;:::i;:::-;8986:87;;8802:277;8741:338;;;;:::o;9085:943::-;9180:6;9188;9196;9204;9253:3;9241:9;9232:7;9228:23;9224:33;9221:120;;;9260:79;;:::i;:::-;9221:120;9380:1;9405:53;9450:7;9441:6;9430:9;9426:22;9405:53;:::i;:::-;9395:63;;9351:117;9507:2;9533:53;9578:7;9569:6;9558:9;9554:22;9533:53;:::i;:::-;9523:63;;9478:118;9635:2;9661:53;9706:7;9697:6;9686:9;9682:22;9661:53;:::i;:::-;9651:63;;9606:118;9791:2;9780:9;9776:18;9763:32;9822:18;9814:6;9811:30;9808:117;;;9844:79;;:::i;:::-;9808:117;9949:62;10003:7;9994:6;9983:9;9979:22;9949:62;:::i;:::-;9939:72;;9734:287;9085:943;;;;;;;:::o;10034:308::-;10096:4;10186:18;10178:6;10175:30;10172:56;;;10208:18;;:::i;:::-;10172:56;10246:29;10268:6;10246:29;:::i;:::-;10238:37;;10330:4;10324;10320:15;10312:23;;10034:308;;;:::o;10348:412::-;10426:5;10451:66;10467:49;10509:6;10467:49;:::i;:::-;10451:66;:::i;:::-;10442:75;;10540:6;10533:5;10526:21;10578:4;10571:5;10567:16;10616:3;10607:6;10602:3;10598:16;10595:25;10592:112;;;10623:79;;:::i;:::-;10592:112;10713:41;10747:6;10742:3;10737;10713:41;:::i;:::-;10432:328;10348:412;;;;;:::o;10780:340::-;10836:5;10885:3;10878:4;10870:6;10866:17;10862:27;10852:122;;10893:79;;:::i;:::-;10852:122;11010:6;10997:20;11035:79;11110:3;11102:6;11095:4;11087:6;11083:17;11035:79;:::i;:::-;11026:88;;10842:278;10780:340;;;;:::o;11126:799::-;11213:6;11221;11229;11278:2;11266:9;11257:7;11253:23;11249:32;11246:119;;;11284:79;;:::i;:::-;11246:119;11404:1;11429:53;11474:7;11465:6;11454:9;11450:22;11429:53;:::i;:::-;11419:63;;11375:117;11531:2;11557:53;11602:7;11593:6;11582:9;11578:22;11557:53;:::i;:::-;11547:63;;11502:118;11687:2;11676:9;11672:18;11659:32;11718:18;11710:6;11707:30;11704:117;;;11740:79;;:::i;:::-;11704:117;11845:63;11900:7;11891:6;11880:9;11876:22;11845:63;:::i;:::-;11835:73;;11630:288;11126:799;;;;;:::o;11931:474::-;11999:6;12007;12056:2;12044:9;12035:7;12031:23;12027:32;12024:119;;;12062:79;;:::i;:::-;12024:119;12182:1;12207:53;12252:7;12243:6;12232:9;12228:22;12207:53;:::i;:::-;12197:63;;12153:117;12309:2;12335:53;12380:7;12371:6;12360:9;12356:22;12335:53;:::i;:::-;12325:63;;12280:118;11931:474;;;;;:::o;12411:180::-;12459:77;12456:1;12449:88;12556:4;12553:1;12546:15;12580:4;12577:1;12570:15;12597:320;12641:6;12678:1;12672:4;12668:12;12658:22;;12725:1;12719:4;12715:12;12746:18;12736:81;;12802:4;12794:6;12790:17;12780:27;;12736:81;12864:2;12856:6;12853:14;12833:18;12830:38;12827:84;;12883:18;;:::i;:::-;12827:84;12648:269;12597:320;;;:::o;12923:220::-;13063:34;13059:1;13051:6;13047:14;13040:58;13132:3;13127:2;13119:6;13115:15;13108:28;12923:220;:::o;13149:366::-;13291:3;13312:67;13376:2;13371:3;13312:67;:::i;:::-;13305:74;;13388:93;13477:3;13388:93;:::i;:::-;13506:2;13501:3;13497:12;13490:19;;13149:366;;;:::o;13521:419::-;13687:4;13725:2;13714:9;13710:18;13702:26;;13774:9;13768:4;13764:20;13760:1;13749:9;13745:17;13738:47;13802:131;13928:4;13802:131;:::i;:::-;13794:139;;13521:419;;;:::o;13946:248::-;14086:34;14082:1;14074:6;14070:14;14063:58;14155:31;14150:2;14142:6;14138:15;14131:56;13946:248;:::o;14200:366::-;14342:3;14363:67;14427:2;14422:3;14363:67;:::i;:::-;14356:74;;14439:93;14528:3;14439:93;:::i;:::-;14557:2;14552:3;14548:12;14541:19;;14200:366;;;:::o;14572:419::-;14738:4;14776:2;14765:9;14761:18;14753:26;;14825:9;14819:4;14815:20;14811:1;14800:9;14796:17;14789:47;14853:131;14979:4;14853:131;:::i;:::-;14845:139;;14572:419;;;:::o;14997:232::-;15137:34;15133:1;15125:6;15121:14;15114:58;15206:15;15201:2;15193:6;15189:15;15182:40;14997:232;:::o;15235:366::-;15377:3;15398:67;15462:2;15457:3;15398:67;:::i;:::-;15391:74;;15474:93;15563:3;15474:93;:::i;:::-;15592:2;15587:3;15583:12;15576:19;;15235:366;;;:::o;15607:419::-;15773:4;15811:2;15800:9;15796:18;15788:26;;15860:9;15854:4;15850:20;15846:1;15835:9;15831:17;15824:47;15888:131;16014:4;15888:131;:::i;:::-;15880:139;;15607:419;;;:::o;16032:174::-;16172:26;16168:1;16160:6;16156:14;16149:50;16032:174;:::o;16212:366::-;16354:3;16375:67;16439:2;16434:3;16375:67;:::i;:::-;16368:74;;16451:93;16540:3;16451:93;:::i;:::-;16569:2;16564:3;16560:12;16553:19;;16212:366;;;:::o;16584:419::-;16750:4;16788:2;16777:9;16773:18;16765:26;;16837:9;16831:4;16827:20;16823:1;16812:9;16808:17;16801:47;16865:131;16991:4;16865:131;:::i;:::-;16857:139;;16584:419;;;:::o;17009:228::-;17149:34;17145:1;17137:6;17133:14;17126:58;17218:11;17213:2;17205:6;17201:15;17194:36;17009:228;:::o;17243:366::-;17385:3;17406:67;17470:2;17465:3;17406:67;:::i;:::-;17399:74;;17482:93;17571:3;17482:93;:::i;:::-;17600:2;17595:3;17591:12;17584:19;;17243:366;;;:::o;17615:419::-;17781:4;17819:2;17808:9;17804:18;17796:26;;17868:9;17862:4;17858:20;17854:1;17843:9;17839:17;17832:47;17896:131;18022:4;17896:131;:::i;:::-;17888:139;;17615:419;;;:::o;18040:225::-;18180:34;18176:1;18168:6;18164:14;18157:58;18249:8;18244:2;18236:6;18232:15;18225:33;18040:225;:::o;18271:366::-;18413:3;18434:67;18498:2;18493:3;18434:67;:::i;:::-;18427:74;;18510:93;18599:3;18510:93;:::i;:::-;18628:2;18623:3;18619:12;18612:19;;18271:366;;;:::o;18643:419::-;18809:4;18847:2;18836:9;18832:18;18824:26;;18896:9;18890:4;18886:20;18882:1;18871:9;18867:17;18860:47;18924:131;19050:4;18924:131;:::i;:::-;18916:139;;18643:419;;;:::o;19068:224::-;19208:34;19204:1;19196:6;19192:14;19185:58;19277:7;19272:2;19264:6;19260:15;19253:32;19068:224;:::o;19298:366::-;19440:3;19461:67;19525:2;19520:3;19461:67;:::i;:::-;19454:74;;19537:93;19626:3;19537:93;:::i;:::-;19655:2;19650:3;19646:12;19639:19;;19298:366;;;:::o;19670:419::-;19836:4;19874:2;19863:9;19859:18;19851:26;;19923:9;19917:4;19913:20;19909:1;19898:9;19894:17;19887:47;19951:131;20077:4;19951:131;:::i;:::-;19943:139;;19670:419;;;:::o;20095:223::-;20235:34;20231:1;20223:6;20219:14;20212:58;20304:6;20299:2;20291:6;20287:15;20280:31;20095:223;:::o;20324:366::-;20466:3;20487:67;20551:2;20546:3;20487:67;:::i;:::-;20480:74;;20563:93;20652:3;20563:93;:::i;:::-;20681:2;20676:3;20672:12;20665:19;;20324:366;;;:::o;20696:419::-;20862:4;20900:2;20889:9;20885:18;20877:26;;20949:9;20943:4;20939:20;20935:1;20924:9;20920:17;20913:47;20977:131;21103:4;20977:131;:::i;:::-;20969:139;;20696:419;;;:::o;21121:182::-;21261:34;21257:1;21249:6;21245:14;21238:58;21121:182;:::o;21309:366::-;21451:3;21472:67;21536:2;21531:3;21472:67;:::i;:::-;21465:74;;21548:93;21637:3;21548:93;:::i;:::-;21666:2;21661:3;21657:12;21650:19;;21309:366;;;:::o;21681:419::-;21847:4;21885:2;21874:9;21870:18;21862:26;;21934:9;21928:4;21924:20;21920:1;21909:9;21905:17;21898:47;21962:131;22088:4;21962:131;:::i;:::-;21954:139;;21681:419;;;:::o;22106:175::-;22246:27;22242:1;22234:6;22230:14;22223:51;22106:175;:::o;22287:366::-;22429:3;22450:67;22514:2;22509:3;22450:67;:::i;:::-;22443:74;;22526:93;22615:3;22526:93;:::i;:::-;22644:2;22639:3;22635:12;22628:19;;22287:366;;;:::o;22659:419::-;22825:4;22863:2;22852:9;22848:18;22840:26;;22912:9;22906:4;22902:20;22898:1;22887:9;22883:17;22876:47;22940:131;23066:4;22940:131;:::i;:::-;22932:139;;22659:419;;;:::o;23084:237::-;23224:34;23220:1;23212:6;23208:14;23201:58;23293:20;23288:2;23280:6;23276:15;23269:45;23084:237;:::o;23327:366::-;23469:3;23490:67;23554:2;23549:3;23490:67;:::i;:::-;23483:74;;23566:93;23655:3;23566:93;:::i;:::-;23684:2;23679:3;23675:12;23668:19;;23327:366;;;:::o;23699:419::-;23865:4;23903:2;23892:9;23888:18;23880:26;;23952:9;23946:4;23942:20;23938:1;23927:9;23923:17;23916:47;23980:131;24106:4;23980:131;:::i;:::-;23972:139;;23699:419;;;:::o;24124:148::-;24226:11;24263:3;24248:18;;24124:148;;;;:::o;24278:377::-;24384:3;24412:39;24445:5;24412:39;:::i;:::-;24467:89;24549:6;24544:3;24467:89;:::i;:::-;24460:96;;24565:52;24610:6;24605:3;24598:4;24591:5;24587:16;24565:52;:::i;:::-;24642:6;24637:3;24633:16;24626:23;;24388:267;24278:377;;;;:::o;24661:435::-;24841:3;24863:95;24954:3;24945:6;24863:95;:::i;:::-;24856:102;;24975:95;25066:3;25057:6;24975:95;:::i;:::-;24968:102;;25087:3;25080:10;;24661:435;;;;;:::o;25102:233::-;25242:34;25238:1;25230:6;25226:14;25219:58;25311:16;25306:2;25298:6;25294:15;25287:41;25102:233;:::o;25341:366::-;25483:3;25504:67;25568:2;25563:3;25504:67;:::i;:::-;25497:74;;25580:93;25669:3;25580:93;:::i;:::-;25698:2;25693:3;25689:12;25682:19;;25341:366;;;:::o;25713:419::-;25879:4;25917:2;25906:9;25902:18;25894:26;;25966:9;25960:4;25956:20;25952:1;25941:9;25937:17;25930:47;25994:131;26120:4;25994:131;:::i;:::-;25986:139;;25713:419;;;:::o;26138:141::-;26187:4;26210:3;26202:11;;26233:3;26230:1;26223:14;26267:4;26264:1;26254:18;26246:26;;26138:141;;;:::o;26285:93::-;26322:6;26369:2;26364;26357:5;26353:14;26349:23;26339:33;;26285:93;;;:::o;26384:107::-;26428:8;26478:5;26472:4;26468:16;26447:37;;26384:107;;;;:::o;26497:393::-;26566:6;26616:1;26604:10;26600:18;26639:97;26669:66;26658:9;26639:97;:::i;:::-;26757:39;26787:8;26776:9;26757:39;:::i;:::-;26745:51;;26829:4;26825:9;26818:5;26814:21;26805:30;;26878:4;26868:8;26864:19;26857:5;26854:30;26844:40;;26573:317;;26497:393;;;;;:::o;26896:60::-;26924:3;26945:5;26938:12;;26896:60;;;:::o;26962:142::-;27012:9;27045:53;27063:34;27072:24;27090:5;27072:24;:::i;:::-;27063:34;:::i;:::-;27045:53;:::i;:::-;27032:66;;26962:142;;;:::o;27110:75::-;27153:3;27174:5;27167:12;;27110:75;;;:::o;27191:269::-;27301:39;27332:7;27301:39;:::i;:::-;27362:91;27411:41;27435:16;27411:41;:::i;:::-;27403:6;27396:4;27390:11;27362:91;:::i;:::-;27356:4;27349:105;27267:193;27191:269;;;:::o;27466:73::-;27511:3;27466:73;:::o;27545:189::-;27622:32;;:::i;:::-;27663:65;27721:6;27713;27707:4;27663:65;:::i;:::-;27598:136;27545:189;;:::o;27740:186::-;27800:120;27817:3;27810:5;27807:14;27800:120;;;27871:39;27908:1;27901:5;27871:39;:::i;:::-;27844:1;27837:5;27833:13;27824:22;;27800:120;;;27740:186;;:::o;27932:543::-;28033:2;28028:3;28025:11;28022:446;;;28067:38;28099:5;28067:38;:::i;:::-;28151:29;28169:10;28151:29;:::i;:::-;28141:8;28137:44;28334:2;28322:10;28319:18;28316:49;;;28355:8;28340:23;;28316:49;28378:80;28434:22;28452:3;28434:22;:::i;:::-;28424:8;28420:37;28407:11;28378:80;:::i;:::-;28037:431;;28022:446;27932:543;;;:::o;28481:117::-;28535:8;28585:5;28579:4;28575:16;28554:37;;28481:117;;;;:::o;28604:169::-;28648:6;28681:51;28729:1;28725:6;28717:5;28714:1;28710:13;28681:51;:::i;:::-;28677:56;28762:4;28756;28752:15;28742:25;;28655:118;28604:169;;;;:::o;28778:295::-;28854:4;29000:29;29025:3;29019:4;29000:29;:::i;:::-;28992:37;;29062:3;29059:1;29055:11;29049:4;29046:21;29038:29;;28778:295;;;;:::o;29078:1395::-;29195:37;29228:3;29195:37;:::i;:::-;29297:18;29289:6;29286:30;29283:56;;;29319:18;;:::i;:::-;29283:56;29363:38;29395:4;29389:11;29363:38;:::i;:::-;29448:67;29508:6;29500;29494:4;29448:67;:::i;:::-;29542:1;29566:4;29553:17;;29598:2;29590:6;29587:14;29615:1;29610:618;;;;30272:1;30289:6;30286:77;;;30338:9;30333:3;30329:19;30323:26;30314:35;;30286:77;30389:67;30449:6;30442:5;30389:67;:::i;:::-;30383:4;30376:81;30245:222;29580:887;;29610:618;29662:4;29658:9;29650:6;29646:22;29696:37;29728:4;29696:37;:::i;:::-;29755:1;29769:208;29783:7;29780:1;29777:14;29769:208;;;29862:9;29857:3;29853:19;29847:26;29839:6;29832:42;29913:1;29905:6;29901:14;29891:24;;29960:2;29949:9;29945:18;29932:31;;29806:4;29803:1;29799:12;29794:17;;29769:208;;;30005:6;29996:7;29993:19;29990:179;;;30063:9;30058:3;30054:19;30048:26;30106:48;30148:4;30140:6;30136:17;30125:9;30106:48;:::i;:::-;30098:6;30091:64;30013:156;29990:179;30215:1;30211;30203:6;30199:14;30195:22;30189:4;30182:36;29617:611;;;29580:887;;29170:1303;;;29078:1395;;:::o;30479:170::-;30619:22;30615:1;30607:6;30603:14;30596:46;30479:170;:::o;30655:366::-;30797:3;30818:67;30882:2;30877:3;30818:67;:::i;:::-;30811:74;;30894:93;30983:3;30894:93;:::i;:::-;31012:2;31007:3;31003:12;30996:19;;30655:366;;;:::o;31027:419::-;31193:4;31231:2;31220:9;31216:18;31208:26;;31280:9;31274:4;31270:20;31266:1;31255:9;31251:17;31244:47;31308:131;31434:4;31308:131;:::i;:::-;31300:139;;31027:419;;;:::o;31452:166::-;31592:18;31588:1;31580:6;31576:14;31569:42;31452:166;:::o;31624:366::-;31766:3;31787:67;31851:2;31846:3;31787:67;:::i;:::-;31780:74;;31863:93;31952:3;31863:93;:::i;:::-;31981:2;31976:3;31972:12;31965:19;;31624:366;;;:::o;31996:419::-;32162:4;32200:2;32189:9;32185:18;32177:26;;32249:9;32243:4;32239:20;32235:1;32224:9;32220:17;32213:47;32277:131;32403:4;32277:131;:::i;:::-;32269:139;;31996:419;;;:::o;32421:98::-;32472:6;32506:5;32500:12;32490:22;;32421:98;;;:::o;32525:168::-;32608:11;32642:6;32637:3;32630:19;32682:4;32677:3;32673:14;32658:29;;32525:168;;;;:::o;32699:360::-;32785:3;32813:38;32845:5;32813:38;:::i;:::-;32867:70;32930:6;32925:3;32867:70;:::i;:::-;32860:77;;32946:52;32991:6;32986:3;32979:4;32972:5;32968:16;32946:52;:::i;:::-;33023:29;33045:6;33023:29;:::i;:::-;33018:3;33014:39;33007:46;;32789:270;32699:360;;;;:::o;33065:640::-;33260:4;33298:3;33287:9;33283:19;33275:27;;33312:71;33380:1;33369:9;33365:17;33356:6;33312:71;:::i;:::-;33393:72;33461:2;33450:9;33446:18;33437:6;33393:72;:::i;:::-;33475;33543:2;33532:9;33528:18;33519:6;33475:72;:::i;:::-;33594:9;33588:4;33584:20;33579:2;33568:9;33564:18;33557:48;33622:76;33693:4;33684:6;33622:76;:::i;:::-;33614:84;;33065:640;;;;;;;:::o;33711:141::-;33767:5;33798:6;33792:13;33783:22;;33814:32;33840:5;33814:32;:::i;:::-;33711:141;;;;:::o;33858:349::-;33927:6;33976:2;33964:9;33955:7;33951:23;33947:32;33944:119;;;33982:79;;:::i;:::-;33944:119;34102:1;34127:63;34182:7;34173:6;34162:9;34158:22;34127:63;:::i;:::-;34117:73;;34073:127;33858:349;;;;:::o;34213:180::-;34261:77;34258:1;34251:88;34358:4;34355:1;34348:15;34382:4;34379:1;34372:15;34399:191;34439:4;34459:20;34477:1;34459:20;:::i;:::-;34454:25;;34493:20;34511:1;34493:20;:::i;:::-;34488:25;;34532:1;34529;34526:8;34523:34;;;34537:18;;:::i;:::-;34523:34;34582:1;34579;34575:9;34567:17;;34399:191;;;;:::o;34596:305::-;34636:3;34655:20;34673:1;34655:20;:::i;:::-;34650:25;;34689:20;34707:1;34689:20;:::i;:::-;34684:25;;34843:1;34775:66;34771:74;34768:1;34765:81;34762:107;;;34849:18;;:::i;:::-;34762:107;34893:1;34890;34886:9;34879:16;;34596:305;;;;:::o;34907:180::-;34955:77;34952:1;34945:88;35052:4;35049:1;35042:15;35076:4;35073:1;35066:15;35093:182;35233:34;35229:1;35221:6;35217:14;35210:58;35093:182;:::o;35281:366::-;35423:3;35444:67;35508:2;35503:3;35444:67;:::i;:::-;35437:74;;35520:93;35609:3;35520:93;:::i;:::-;35638:2;35633:3;35629:12;35622:19;;35281:366;;;:::o;35653:419::-;35819:4;35857:2;35846:9;35842:18;35834:26;;35906:9;35900:4;35896:20;35892:1;35881:9;35877:17;35870:47;35934:131;36060:4;35934:131;:::i;:::-;35926:139;;35653:419;;;:::o;36078:178::-;36218:30;36214:1;36206:6;36202:14;36195:54;36078:178;:::o;36262:366::-;36404:3;36425:67;36489:2;36484:3;36425:67;:::i;:::-;36418:74;;36501:93;36590:3;36501:93;:::i;:::-;36619:2;36614:3;36610:12;36603:19;;36262:366;;;:::o;36634:419::-;36800:4;36838:2;36827:9;36823:18;36815:26;;36887:9;36881:4;36877:20;36873:1;36862:9;36858:17;36851:47;36915:131;37041:4;36915:131;:::i;:::-;36907:139;;36634:419;;;:::o
Swarm Source
ipfs://eceea694bc135e855ef463ea6258f4587c333b28843cfe990c8ddbb58d8b663b
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.