ERC-721
Overview
Max Total Supply
541 BPVC
Holders
144
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
2 BPVCLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
NFT
Compiler Version
v0.8.18+commit.87f61d96
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-06-07 */ // File: @openzeppelin/contracts/utils/math/SignedMath.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol) pragma solidity ^0.8.0; /** * @dev Standard signed math utilities missing in the Solidity language. */ library SignedMath { /** * @dev Returns the largest of two signed numbers. */ function max(int256 a, int256 b) internal pure returns (int256) { return a > b ? a : b; } /** * @dev Returns the smallest of two signed numbers. */ function min(int256 a, int256 b) internal pure returns (int256) { return a < b ? a : b; } /** * @dev Returns the average of two signed numbers without overflow. * The result is rounded towards zero. */ function average(int256 a, int256 b) internal pure returns (int256) { // Formula from the book "Hacker's Delight" int256 x = (a & b) + ((a ^ b) >> 1); return x + (int256(uint256(x) >> 255) & (a ^ b)); } /** * @dev Returns the absolute unsigned value of a signed value. */ function abs(int256 n) internal pure returns (uint256) { unchecked { // must be unchecked in order to support `n = type(int256).min` return uint256(n >= 0 ? n : -n); } } } // File: @openzeppelin/contracts/utils/math/Math.sol // OpenZeppelin Contracts (last updated v4.9.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) { // Solidity will revert if denominator == 0, unlike the div opcode on its own. // The surrounding unchecked block does not change this fact. // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic. return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1, "Math: mulDiv overflow"); /////////////////////////////////////////////// // 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 256, 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 << 3) < value ? 1 : 0); } } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts (last updated v4.9.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 `int256` to its ASCII `string` decimal representation. */ function toString(int256 value) internal pure returns (string memory) { return string(abi.encodePacked(value < 0 ? "-" : "", toString(SignedMath.abs(value)))); } /** * @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); } /** * @dev Returns true if the two strings are equal. */ function equal(string memory a, string memory b) internal pure returns (bool) { return keccak256(bytes(a)) == keccak256(bytes(b)); } } // 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.9.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. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.9.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 * * Furthermore, `isContract` will also return true if the target contract within * the same transaction is already scheduled for destruction by `SELFDESTRUCT`, * which only has an effect at the end of a transaction. * ==== * * [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://consensys.net/diligence/blog/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.8.0/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.9.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/IERC721Enumerable.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol // OpenZeppelin Contracts (last updated v4.9.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 {} /** * @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 {} /** * @dev Unsafe write access to the balances, used by extensions that "mint" tokens using an {ownerOf} override. * * WARNING: Anyone calling this MUST ensure that the balances remain consistent with the ownership. The invariant * being that for any address `a` the value returned by `balanceOf(a)` must be equal to the number of tokens such * that `ownerOf(tokenId)` is `a`. */ // solhint-disable-next-line func-name-mixedcase function __unsafe_increaseBalance(address account, uint256 amount) internal { _balances[account] += amount; } } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/extensions/ERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev See {ERC721-_beforeTokenTransfer}. */ function _beforeTokenTransfer( address from, address to, uint256 firstTokenId, uint256 batchSize ) internal virtual override { super._beforeTokenTransfer(from, to, firstTokenId, batchSize); if (batchSize > 1) { // Will only trigger during construction. Batch transferring (minting) is not available afterwards. revert("ERC721Enumerable: consecutive transfers not supported"); } uint256 tokenId = firstTokenId; if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } // File: BORED PEPE.sol pragma solidity >=0.7.0 <0.9.0; contract NFT is ERC721Enumerable, Ownable { using Strings for uint256; string baseURI; string public baseExtension = ".json"; uint256 public pepePrice = 0.08 ether; uint256 public MAX_PEPES = 10000; uint256 public maxPepePurchase = 20; bool public paused = true; bool public revealed = false; string public notRevealedUri; constructor( string memory _name, string memory _symbol, string memory _initBaseURI, string memory _initNotRevealedUri ) ERC721(_name, _symbol) { setBaseURI(_initBaseURI); setNotRevealedURI(_initNotRevealedUri); } // internal function _baseURI() internal view virtual override returns (string memory) { return baseURI; } // public function mintPepe(uint256 _mintAmount) public payable { uint256 supply = totalSupply(); require(!paused); require(_mintAmount > 0); require(_mintAmount <= maxPepePurchase); require(supply + _mintAmount <= MAX_PEPES); if (msg.sender != owner()) { require(msg.value >= pepePrice * _mintAmount); } for (uint256 i = 1; i <= _mintAmount; i++) { _safeMint(msg.sender, supply + i); } } function walletOfOwner(address _owner) public view returns (uint256[] memory) { uint256 ownerTokenCount = balanceOf(_owner); uint256[] memory tokenIds = new uint256[](ownerTokenCount); for (uint256 i; i < ownerTokenCount; i++) { tokenIds[i] = tokenOfOwnerByIndex(_owner, i); } return tokenIds; } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require( _exists(tokenId), "ERC721Metadata: URI query for nonexistent token" ); if(revealed == false) { return notRevealedUri; } string memory currentBaseURI = _baseURI(); return bytes(currentBaseURI).length > 0 ? string(abi.encodePacked(currentBaseURI, tokenId.toString(), baseExtension)) : ""; } //only owner function reveal() public onlyOwner { revealed = true; } function setPepePrice(uint256 _pepePrice) public onlyOwner { pepePrice = _pepePrice; } function setMaxPepePurchase(uint256 _maxPepePurchase) public onlyOwner { maxPepePurchase = _maxPepePurchase; } function setNotRevealedURI(string memory _notRevealedURI) public onlyOwner { notRevealedUri = _notRevealedURI; } function setBaseURI(string memory _newBaseURI) public onlyOwner { baseURI = _newBaseURI; } function setBaseExtension(string memory _newBaseExtension) public onlyOwner { baseExtension = _newBaseExtension; } function pause(bool _state) public onlyOwner { paused = _state; } function withdraw() public payable onlyOwner { // ============================================================================= (bool os, ) = payable(owner()).call{value: address(this).balance}(""); require(os); // ============================================================================= } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string","name":"_initBaseURI","type":"string"},{"internalType":"string","name":"_initNotRevealedUri","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_PEPES","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPepePurchase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mintPepe","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notRevealedUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pepePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxPepePurchase","type":"uint256"}],"name":"setMaxPepePurchase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_notRevealedURI","type":"string"}],"name":"setNotRevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pepePrice","type":"uint256"}],"name":"setPepePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]
Contract Creation Code
60806040526040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600c90816200004a91906200058c565b5067011c37937e080000600d55612710600e556014600f556001601060006101000a81548160ff0219169083151502179055506000601060016101000a81548160ff021916908315150217905550348015620000a557600080fd5b5060405162004b3238038062004b328339818101604052810190620000cb9190620007d7565b83838160009081620000de91906200058c565b508060019081620000f091906200058c565b50505062000113620001076200013f60201b60201c565b6200014760201b60201c565b62000124826200020d60201b60201c565b62000135816200023260201b60201c565b5050505062000948565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6200021d6200025760201b60201c565b80600b90816200022e91906200058c565b5050565b620002426200025760201b60201c565b80601190816200025391906200058c565b5050565b620002676200013f60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166200028d620002e860201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620002e6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002dd9062000926565b60405180910390fd5b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200039457607f821691505b602082108103620003aa57620003a96200034c565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620004147fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620003d5565b620004208683620003d5565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006200046d62000467620004618462000438565b62000442565b62000438565b9050919050565b6000819050919050565b62000489836200044c565b620004a1620004988262000474565b848454620003e2565b825550505050565b600090565b620004b8620004a9565b620004c58184846200047e565b505050565b5b81811015620004ed57620004e1600082620004ae565b600181019050620004cb565b5050565b601f8211156200053c576200050681620003b0565b6200051184620003c5565b8101602085101562000521578190505b620005396200053085620003c5565b830182620004ca565b50505b505050565b600082821c905092915050565b6000620005616000198460080262000541565b1980831691505092915050565b60006200057c83836200054e565b9150826002028217905092915050565b620005978262000312565b67ffffffffffffffff811115620005b357620005b26200031d565b5b620005bf82546200037b565b620005cc828285620004f1565b600060209050601f831160018114620006045760008415620005ef578287015190505b620005fb85826200056e565b8655506200066b565b601f1984166200061486620003b0565b60005b828110156200063e5784890151825560018201915060208501945060208101905062000617565b868310156200065e57848901516200065a601f8916826200054e565b8355505b6001600288020188555050505b505050505050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b620006ad8262000691565b810181811067ffffffffffffffff82111715620006cf57620006ce6200031d565b5b80604052505050565b6000620006e462000673565b9050620006f28282620006a2565b919050565b600067ffffffffffffffff8211156200071557620007146200031d565b5b620007208262000691565b9050602081019050919050565b60005b838110156200074d57808201518184015260208101905062000730565b60008484015250505050565b6000620007706200076a84620006f7565b620006d8565b9050828152602081018484840111156200078f576200078e6200068c565b5b6200079c8482856200072d565b509392505050565b600082601f830112620007bc57620007bb62000687565b5b8151620007ce84826020860162000759565b91505092915050565b60008060008060808587031215620007f457620007f36200067d565b5b600085015167ffffffffffffffff81111562000815576200081462000682565b5b6200082387828801620007a4565b945050602085015167ffffffffffffffff81111562000847576200084662000682565b5b6200085587828801620007a4565b935050604085015167ffffffffffffffff81111562000879576200087862000682565b5b6200088787828801620007a4565b925050606085015167ffffffffffffffff811115620008ab57620008aa62000682565b5b620008b987828801620007a4565b91505092959194509250565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006200090e602083620008c5565b91506200091b82620008d6565b602082019050919050565b600060208201905081810360008301526200094181620008ff565b9050919050565b6141da80620009586000396000f3fe60806040526004361061020f5760003560e01c80636352211e11610118578063b88d4fde116100a0578063da3ef23f1161006f578063da3ef23f14610771578063e985e9c51461079a578063ebbe2c08146107d7578063f2c4ce1e14610800578063f2fde38b146108295761020f565b8063b88d4fde146106b7578063c6682862146106e0578063c7aa12401461070b578063c87b56dd146107345761020f565b806394ceedbd116100e757806394ceedbd1461060557806395d89b4114610630578063a22cb4651461065b578063a475b5dd14610684578063b011561d1461069b5761020f565b80636352211e1461054957806370a0823114610586578063715018a6146105c35780638da5cb5b146105da5761020f565b806335df333e1161019b5780634f6ccce71161016a5780634f6ccce714610462578063518302271461049f57806355f804b3146104ca57806359e07717146104f35780635c975abb1461051e5761020f565b806335df333e146103c75780633ccfd60b146103f257806342842e0e146103fc578063438b6300146104255761020f565b8063081c8c44116101e2578063081c8c44146102e2578063095ea7b31461030d57806318160ddd1461033657806323b872dd146103615780632f745c591461038a5761020f565b806301ffc9a71461021457806302329a291461025157806306fdde031461027a578063081812fc146102a5575b600080fd5b34801561022057600080fd5b5061023b60048036038101906102369190612ac6565b610852565b6040516102489190612b0e565b60405180910390f35b34801561025d57600080fd5b5061027860048036038101906102739190612b55565b6108cc565b005b34801561028657600080fd5b5061028f6108f1565b60405161029c9190612c12565b60405180910390f35b3480156102b157600080fd5b506102cc60048036038101906102c79190612c6a565b610983565b6040516102d99190612cd8565b60405180910390f35b3480156102ee57600080fd5b506102f76109c9565b6040516103049190612c12565b60405180910390f35b34801561031957600080fd5b50610334600480360381019061032f9190612d1f565b610a57565b005b34801561034257600080fd5b5061034b610b6e565b6040516103589190612d6e565b60405180910390f35b34801561036d57600080fd5b5061038860048036038101906103839190612d89565b610b7b565b005b34801561039657600080fd5b506103b160048036038101906103ac9190612d1f565b610bdb565b6040516103be9190612d6e565b60405180910390f35b3480156103d357600080fd5b506103dc610c80565b6040516103e99190612d6e565b60405180910390f35b6103fa610c86565b005b34801561040857600080fd5b50610423600480360381019061041e9190612d89565b610d0e565b005b34801561043157600080fd5b5061044c60048036038101906104479190612ddc565b610d2e565b6040516104599190612ec7565b60405180910390f35b34801561046e57600080fd5b5061048960048036038101906104849190612c6a565b610ddc565b6040516104969190612d6e565b60405180910390f35b3480156104ab57600080fd5b506104b4610e4d565b6040516104c19190612b0e565b60405180910390f35b3480156104d657600080fd5b506104f160048036038101906104ec919061301e565b610e60565b005b3480156104ff57600080fd5b50610508610e7b565b6040516105159190612d6e565b60405180910390f35b34801561052a57600080fd5b50610533610e81565b6040516105409190612b0e565b60405180910390f35b34801561055557600080fd5b50610570600480360381019061056b9190612c6a565b610e94565b60405161057d9190612cd8565b60405180910390f35b34801561059257600080fd5b506105ad60048036038101906105a89190612ddc565b610f1a565b6040516105ba9190612d6e565b60405180910390f35b3480156105cf57600080fd5b506105d8610fd1565b005b3480156105e657600080fd5b506105ef610fe5565b6040516105fc9190612cd8565b60405180910390f35b34801561061157600080fd5b5061061a61100f565b6040516106279190612d6e565b60405180910390f35b34801561063c57600080fd5b50610645611015565b6040516106529190612c12565b60405180910390f35b34801561066757600080fd5b50610682600480360381019061067d9190613067565b6110a7565b005b34801561069057600080fd5b506106996110bd565b005b6106b560048036038101906106b09190612c6a565b6110e2565b005b3480156106c357600080fd5b506106de60048036038101906106d99190613148565b6111ce565b005b3480156106ec57600080fd5b506106f5611230565b6040516107029190612c12565b60405180910390f35b34801561071757600080fd5b50610732600480360381019061072d9190612c6a565b6112be565b005b34801561074057600080fd5b5061075b60048036038101906107569190612c6a565b6112d0565b6040516107689190612c12565b60405180910390f35b34801561077d57600080fd5b506107986004803603810190610793919061301e565b611428565b005b3480156107a657600080fd5b506107c160048036038101906107bc91906131cb565b611443565b6040516107ce9190612b0e565b60405180910390f35b3480156107e357600080fd5b506107fe60048036038101906107f99190612c6a565b6114d7565b005b34801561080c57600080fd5b506108276004803603810190610822919061301e565b6114e9565b005b34801561083557600080fd5b50610850600480360381019061084b9190612ddc565b611504565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108c557506108c482611587565b5b9050919050565b6108d4611669565b80601060006101000a81548160ff02191690831515021790555050565b6060600080546109009061323a565b80601f016020809104026020016040519081016040528092919081815260200182805461092c9061323a565b80156109795780601f1061094e57610100808354040283529160200191610979565b820191906000526020600020905b81548152906001019060200180831161095c57829003601f168201915b5050505050905090565b600061098e826116e7565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b601180546109d69061323a565b80601f0160208091040260200160405190810160405280929190818152602001828054610a029061323a565b8015610a4f5780601f10610a2457610100808354040283529160200191610a4f565b820191906000526020600020905b815481529060010190602001808311610a3257829003601f168201915b505050505081565b6000610a6282610e94565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610ad2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac9906132dd565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610af1611732565b73ffffffffffffffffffffffffffffffffffffffff161480610b205750610b1f81610b1a611732565b611443565b5b610b5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b569061336f565b60405180910390fd5b610b69838361173a565b505050565b6000600880549050905090565b610b8c610b86611732565b826117f3565b610bcb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc290613401565b60405180910390fd5b610bd6838383611888565b505050565b6000610be683610f1a565b8210610c27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1e90613493565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600d5481565b610c8e611669565b6000610c98610fe5565b73ffffffffffffffffffffffffffffffffffffffff1647604051610cbb906134e4565b60006040518083038185875af1925050503d8060008114610cf8576040519150601f19603f3d011682016040523d82523d6000602084013e610cfd565b606091505b5050905080610d0b57600080fd5b50565b610d29838383604051806020016040528060008152506111ce565b505050565b60606000610d3b83610f1a565b905060008167ffffffffffffffff811115610d5957610d58612ef3565b5b604051908082528060200260200182016040528015610d875781602001602082028036833780820191505090505b50905060005b82811015610dd157610d9f8582610bdb565b828281518110610db257610db16134f9565b5b6020026020010181815250508080610dc990613557565b915050610d8d565b508092505050919050565b6000610de6610b6e565b8210610e27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1e90613611565b60405180910390fd5b60088281548110610e3b57610e3a6134f9565b5b90600052602060002001549050919050565b601060019054906101000a900460ff1681565b610e68611669565b80600b9081610e7791906137dd565b5050565b600f5481565b601060009054906101000a900460ff1681565b600080610ea083611b81565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610f11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f08906138fb565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610f8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f819061398d565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610fd9611669565b610fe36000611bbe565b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600e5481565b6060600180546110249061323a565b80601f01602080910402602001604051908101604052809291908181526020018280546110509061323a565b801561109d5780601f106110725761010080835404028352916020019161109d565b820191906000526020600020905b81548152906001019060200180831161108057829003601f168201915b5050505050905090565b6110b96110b2611732565b8383611c84565b5050565b6110c5611669565b6001601060016101000a81548160ff021916908315150217905550565b60006110ec610b6e565b9050601060009054906101000a900460ff161561110857600080fd5b6000821161111557600080fd5b600f5482111561112457600080fd5b600e54828261113391906139ad565b111561113e57600080fd5b611146610fe5565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146111935781600d5461118691906139e1565b34101561119257600080fd5b5b6000600190505b8281116111c9576111b63382846111b191906139ad565b611df0565b80806111c190613557565b91505061119a565b505050565b6111df6111d9611732565b836117f3565b61121e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121590613401565b60405180910390fd5b61122a84848484611e0e565b50505050565b600c805461123d9061323a565b80601f01602080910402602001604051908101604052809291908181526020018280546112699061323a565b80156112b65780601f1061128b576101008083540402835291602001916112b6565b820191906000526020600020905b81548152906001019060200180831161129957829003601f168201915b505050505081565b6112c6611669565b80600d8190555050565b60606112db82611e6a565b61131a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131190613a95565b60405180910390fd5b60001515601060019054906101000a900460ff161515036113c757601180546113429061323a565b80601f016020809104026020016040519081016040528092919081815260200182805461136e9061323a565b80156113bb5780601f10611390576101008083540402835291602001916113bb565b820191906000526020600020905b81548152906001019060200180831161139e57829003601f168201915b50505050509050611423565b60006113d1611eab565b905060008151116113f1576040518060200160405280600081525061141f565b806113fb84611f3d565b600c60405160200161140f93929190613b74565b6040516020818303038152906040525b9150505b919050565b611430611669565b80600c908161143f91906137dd565b5050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6114df611669565b80600f8190555050565b6114f1611669565b806011908161150091906137dd565b5050565b61150c611669565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361157b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157290613c17565b60405180910390fd5b61158481611bbe565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061165257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061166257506116618261200b565b5b9050919050565b611671611732565b73ffffffffffffffffffffffffffffffffffffffff1661168f610fe5565b73ffffffffffffffffffffffffffffffffffffffff16146116e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116dc90613c83565b60405180910390fd5b565b6116f081611e6a565b61172f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611726906138fb565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166117ad83610e94565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000806117ff83610e94565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061184157506118408185611443565b5b8061187f57508373ffffffffffffffffffffffffffffffffffffffff1661186784610983565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166118a882610e94565b73ffffffffffffffffffffffffffffffffffffffff16146118fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f590613d15565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361196d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196490613da7565b60405180910390fd5b61197a8383836001612075565b8273ffffffffffffffffffffffffffffffffffffffff1661199a82610e94565b73ffffffffffffffffffffffffffffffffffffffff16146119f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e790613d15565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611b7c83838360016121d3565b505050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611cf2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce990613e13565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611de39190612b0e565b60405180910390a3505050565b611e0a8282604051806020016040528060008152506121d9565b5050565b611e19848484611888565b611e2584848484612234565b611e64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5b90613ea5565b60405180910390fd5b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff16611e8c83611b81565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6060600b8054611eba9061323a565b80601f0160208091040260200160405190810160405280929190818152602001828054611ee69061323a565b8015611f335780601f10611f0857610100808354040283529160200191611f33565b820191906000526020600020905b815481529060010190602001808311611f1657829003601f168201915b5050505050905090565b606060006001611f4c846123bb565b01905060008167ffffffffffffffff811115611f6b57611f6a612ef3565b5b6040519080825280601f01601f191660200182016040528015611f9d5781602001600182028036833780820191505090505b509050600082602001820190505b600115612000578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581611ff457611ff3613ec5565b5b04945060008503611fab575b819350505050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6120818484848461250e565b60018111156120c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120bc90613f66565b60405180910390fd5b6000829050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff160361210c5761210781612514565b61214b565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161461214a57612149858261255d565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361218d57612188816126ca565b6121cc565b8473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146121cb576121ca848261279b565b5b5b5050505050565b50505050565b6121e3838361281a565b6121f06000848484612234565b61222f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222690613ea5565b60405180910390fd5b505050565b60006122558473ffffffffffffffffffffffffffffffffffffffff16612a37565b156123ae578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261227e611732565b8786866040518563ffffffff1660e01b81526004016122a09493929190613fdb565b6020604051808303816000875af19250505080156122dc57506040513d601f19601f820116820180604052508101906122d9919061403c565b60015b61235e573d806000811461230c576040519150601f19603f3d011682016040523d82523d6000602084013e612311565b606091505b506000815103612356576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234d90613ea5565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506123b3565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612419577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000838161240f5761240e613ec5565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612456576d04ee2d6d415b85acef8100000000838161244c5761244b613ec5565b5b0492506020810190505b662386f26fc10000831061248557662386f26fc10000838161247b5761247a613ec5565b5b0492506010810190505b6305f5e10083106124ae576305f5e10083816124a4576124a3613ec5565b5b0492506008810190505b61271083106124d35761271083816124c9576124c8613ec5565b5b0492506004810190505b606483106124f657606483816124ec576124eb613ec5565b5b0492506002810190505b600a8310612505576001810190505b80915050919050565b50505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161256a84610f1a565b6125749190614069565b9050600060076000848152602001908152602001600020549050818114612659576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506126de9190614069565b905060006009600084815260200190815260200160002054905060006008838154811061270e5761270d6134f9565b5b9060005260206000200154905080600883815481106127305761272f6134f9565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061277f5761277e61409d565b5b6001900381819060005260206000200160009055905550505050565b60006127a683610f1a565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612889576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161288090614118565b60405180910390fd5b61289281611e6a565b156128d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128c990614184565b60405180910390fd5b6128e0600083836001612075565b6128e981611e6a565b15612929576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161292090614184565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612a336000838360016121d3565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612aa381612a6e565b8114612aae57600080fd5b50565b600081359050612ac081612a9a565b92915050565b600060208284031215612adc57612adb612a64565b5b6000612aea84828501612ab1565b91505092915050565b60008115159050919050565b612b0881612af3565b82525050565b6000602082019050612b236000830184612aff565b92915050565b612b3281612af3565b8114612b3d57600080fd5b50565b600081359050612b4f81612b29565b92915050565b600060208284031215612b6b57612b6a612a64565b5b6000612b7984828501612b40565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612bbc578082015181840152602081019050612ba1565b60008484015250505050565b6000601f19601f8301169050919050565b6000612be482612b82565b612bee8185612b8d565b9350612bfe818560208601612b9e565b612c0781612bc8565b840191505092915050565b60006020820190508181036000830152612c2c8184612bd9565b905092915050565b6000819050919050565b612c4781612c34565b8114612c5257600080fd5b50565b600081359050612c6481612c3e565b92915050565b600060208284031215612c8057612c7f612a64565b5b6000612c8e84828501612c55565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612cc282612c97565b9050919050565b612cd281612cb7565b82525050565b6000602082019050612ced6000830184612cc9565b92915050565b612cfc81612cb7565b8114612d0757600080fd5b50565b600081359050612d1981612cf3565b92915050565b60008060408385031215612d3657612d35612a64565b5b6000612d4485828601612d0a565b9250506020612d5585828601612c55565b9150509250929050565b612d6881612c34565b82525050565b6000602082019050612d836000830184612d5f565b92915050565b600080600060608486031215612da257612da1612a64565b5b6000612db086828701612d0a565b9350506020612dc186828701612d0a565b9250506040612dd286828701612c55565b9150509250925092565b600060208284031215612df257612df1612a64565b5b6000612e0084828501612d0a565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612e3e81612c34565b82525050565b6000612e508383612e35565b60208301905092915050565b6000602082019050919050565b6000612e7482612e09565b612e7e8185612e14565b9350612e8983612e25565b8060005b83811015612eba578151612ea18882612e44565b9750612eac83612e5c565b925050600181019050612e8d565b5085935050505092915050565b60006020820190508181036000830152612ee18184612e69565b905092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612f2b82612bc8565b810181811067ffffffffffffffff82111715612f4a57612f49612ef3565b5b80604052505050565b6000612f5d612a5a565b9050612f698282612f22565b919050565b600067ffffffffffffffff821115612f8957612f88612ef3565b5b612f9282612bc8565b9050602081019050919050565b82818337600083830152505050565b6000612fc1612fbc84612f6e565b612f53565b905082815260208101848484011115612fdd57612fdc612eee565b5b612fe8848285612f9f565b509392505050565b600082601f83011261300557613004612ee9565b5b8135613015848260208601612fae565b91505092915050565b60006020828403121561303457613033612a64565b5b600082013567ffffffffffffffff81111561305257613051612a69565b5b61305e84828501612ff0565b91505092915050565b6000806040838503121561307e5761307d612a64565b5b600061308c85828601612d0a565b925050602061309d85828601612b40565b9150509250929050565b600067ffffffffffffffff8211156130c2576130c1612ef3565b5b6130cb82612bc8565b9050602081019050919050565b60006130eb6130e6846130a7565b612f53565b90508281526020810184848401111561310757613106612eee565b5b613112848285612f9f565b509392505050565b600082601f83011261312f5761312e612ee9565b5b813561313f8482602086016130d8565b91505092915050565b6000806000806080858703121561316257613161612a64565b5b600061317087828801612d0a565b945050602061318187828801612d0a565b935050604061319287828801612c55565b925050606085013567ffffffffffffffff8111156131b3576131b2612a69565b5b6131bf8782880161311a565b91505092959194509250565b600080604083850312156131e2576131e1612a64565b5b60006131f085828601612d0a565b925050602061320185828601612d0a565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061325257607f821691505b6020821081036132655761326461320b565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006132c7602183612b8d565b91506132d28261326b565b604082019050919050565b600060208201905081810360008301526132f6816132ba565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000613359603d83612b8d565b9150613364826132fd565b604082019050919050565b600060208201905081810360008301526133888161334c565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b60006133eb602d83612b8d565b91506133f68261338f565b604082019050919050565b6000602082019050818103600083015261341a816133de565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b600061347d602b83612b8d565b915061348882613421565b604082019050919050565b600060208201905081810360008301526134ac81613470565b9050919050565b600081905092915050565b50565b60006134ce6000836134b3565b91506134d9826134be565b600082019050919050565b60006134ef826134c1565b9150819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061356282612c34565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361359457613593613528565b5b600182019050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b60006135fb602c83612b8d565b91506136068261359f565b604082019050919050565b6000602082019050818103600083015261362a816135ee565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026136937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613656565b61369d8683613656565b95508019841693508086168417925050509392505050565b6000819050919050565b60006136da6136d56136d084612c34565b6136b5565b612c34565b9050919050565b6000819050919050565b6136f4836136bf565b613708613700826136e1565b848454613663565b825550505050565b600090565b61371d613710565b6137288184846136eb565b505050565b5b8181101561374c57613741600082613715565b60018101905061372e565b5050565b601f8211156137915761376281613631565b61376b84613646565b8101602085101561377a578190505b61378e61378685613646565b83018261372d565b50505b505050565b600082821c905092915050565b60006137b460001984600802613796565b1980831691505092915050565b60006137cd83836137a3565b9150826002028217905092915050565b6137e682612b82565b67ffffffffffffffff8111156137ff576137fe612ef3565b5b613809825461323a565b613814828285613750565b600060209050601f8311600181146138475760008415613835578287015190505b61383f85826137c1565b8655506138a7565b601f19841661385586613631565b60005b8281101561387d57848901518255600182019150602085019450602081019050613858565b8683101561389a5784890151613896601f8916826137a3565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b60006138e5601883612b8d565b91506138f0826138af565b602082019050919050565b60006020820190508181036000830152613914816138d8565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000613977602983612b8d565b91506139828261391b565b604082019050919050565b600060208201905081810360008301526139a68161396a565b9050919050565b60006139b882612c34565b91506139c383612c34565b92508282019050808211156139db576139da613528565b5b92915050565b60006139ec82612c34565b91506139f783612c34565b9250828202613a0581612c34565b91508282048414831517613a1c57613a1b613528565b5b5092915050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000613a7f602f83612b8d565b9150613a8a82613a23565b604082019050919050565b60006020820190508181036000830152613aae81613a72565b9050919050565b600081905092915050565b6000613acb82612b82565b613ad58185613ab5565b9350613ae5818560208601612b9e565b80840191505092915050565b60008154613afe8161323a565b613b088186613ab5565b94506001821660008114613b235760018114613b3857613b6b565b60ff1983168652811515820286019350613b6b565b613b4185613631565b60005b83811015613b6357815481890152600182019150602081019050613b44565b838801955050505b50505092915050565b6000613b808286613ac0565b9150613b8c8285613ac0565b9150613b988284613af1565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613c01602683612b8d565b9150613c0c82613ba5565b604082019050919050565b60006020820190508181036000830152613c3081613bf4565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613c6d602083612b8d565b9150613c7882613c37565b602082019050919050565b60006020820190508181036000830152613c9c81613c60565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000613cff602583612b8d565b9150613d0a82613ca3565b604082019050919050565b60006020820190508181036000830152613d2e81613cf2565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613d91602483612b8d565b9150613d9c82613d35565b604082019050919050565b60006020820190508181036000830152613dc081613d84565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000613dfd601983612b8d565b9150613e0882613dc7565b602082019050919050565b60006020820190508181036000830152613e2c81613df0565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000613e8f603283612b8d565b9150613e9a82613e33565b604082019050919050565b60006020820190508181036000830152613ebe81613e82565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f455243373231456e756d657261626c653a20636f6e736563757469766520747260008201527f616e7366657273206e6f7420737570706f727465640000000000000000000000602082015250565b6000613f50603583612b8d565b9150613f5b82613ef4565b604082019050919050565b60006020820190508181036000830152613f7f81613f43565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000613fad82613f86565b613fb78185613f91565b9350613fc7818560208601612b9e565b613fd081612bc8565b840191505092915050565b6000608082019050613ff06000830187612cc9565b613ffd6020830186612cc9565b61400a6040830185612d5f565b818103606083015261401c8184613fa2565b905095945050505050565b60008151905061403681612a9a565b92915050565b60006020828403121561405257614051612a64565b5b600061406084828501614027565b91505092915050565b600061407482612c34565b915061407f83612c34565b925082820390508181111561409757614096613528565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614102602083612b8d565b915061410d826140cc565b602082019050919050565b60006020820190508181036000830152614131816140f5565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b600061416e601c83612b8d565b915061417982614138565b602082019050919050565b6000602082019050818103600083015261419d81614161565b905091905056fea264697066735822122035bddcaf63a456c8dfdee0fc650cb52643d980342e3fd51d877f5f2cefa3899a64736f6c63430008120033000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000010426f72656450657065566970436c75620000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044250564300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f697066733a2f2f787878787878782f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f697066733a2f2f787878787878782f0000000000000000000000000000000000
Deployed Bytecode
0x60806040526004361061020f5760003560e01c80636352211e11610118578063b88d4fde116100a0578063da3ef23f1161006f578063da3ef23f14610771578063e985e9c51461079a578063ebbe2c08146107d7578063f2c4ce1e14610800578063f2fde38b146108295761020f565b8063b88d4fde146106b7578063c6682862146106e0578063c7aa12401461070b578063c87b56dd146107345761020f565b806394ceedbd116100e757806394ceedbd1461060557806395d89b4114610630578063a22cb4651461065b578063a475b5dd14610684578063b011561d1461069b5761020f565b80636352211e1461054957806370a0823114610586578063715018a6146105c35780638da5cb5b146105da5761020f565b806335df333e1161019b5780634f6ccce71161016a5780634f6ccce714610462578063518302271461049f57806355f804b3146104ca57806359e07717146104f35780635c975abb1461051e5761020f565b806335df333e146103c75780633ccfd60b146103f257806342842e0e146103fc578063438b6300146104255761020f565b8063081c8c44116101e2578063081c8c44146102e2578063095ea7b31461030d57806318160ddd1461033657806323b872dd146103615780632f745c591461038a5761020f565b806301ffc9a71461021457806302329a291461025157806306fdde031461027a578063081812fc146102a5575b600080fd5b34801561022057600080fd5b5061023b60048036038101906102369190612ac6565b610852565b6040516102489190612b0e565b60405180910390f35b34801561025d57600080fd5b5061027860048036038101906102739190612b55565b6108cc565b005b34801561028657600080fd5b5061028f6108f1565b60405161029c9190612c12565b60405180910390f35b3480156102b157600080fd5b506102cc60048036038101906102c79190612c6a565b610983565b6040516102d99190612cd8565b60405180910390f35b3480156102ee57600080fd5b506102f76109c9565b6040516103049190612c12565b60405180910390f35b34801561031957600080fd5b50610334600480360381019061032f9190612d1f565b610a57565b005b34801561034257600080fd5b5061034b610b6e565b6040516103589190612d6e565b60405180910390f35b34801561036d57600080fd5b5061038860048036038101906103839190612d89565b610b7b565b005b34801561039657600080fd5b506103b160048036038101906103ac9190612d1f565b610bdb565b6040516103be9190612d6e565b60405180910390f35b3480156103d357600080fd5b506103dc610c80565b6040516103e99190612d6e565b60405180910390f35b6103fa610c86565b005b34801561040857600080fd5b50610423600480360381019061041e9190612d89565b610d0e565b005b34801561043157600080fd5b5061044c60048036038101906104479190612ddc565b610d2e565b6040516104599190612ec7565b60405180910390f35b34801561046e57600080fd5b5061048960048036038101906104849190612c6a565b610ddc565b6040516104969190612d6e565b60405180910390f35b3480156104ab57600080fd5b506104b4610e4d565b6040516104c19190612b0e565b60405180910390f35b3480156104d657600080fd5b506104f160048036038101906104ec919061301e565b610e60565b005b3480156104ff57600080fd5b50610508610e7b565b6040516105159190612d6e565b60405180910390f35b34801561052a57600080fd5b50610533610e81565b6040516105409190612b0e565b60405180910390f35b34801561055557600080fd5b50610570600480360381019061056b9190612c6a565b610e94565b60405161057d9190612cd8565b60405180910390f35b34801561059257600080fd5b506105ad60048036038101906105a89190612ddc565b610f1a565b6040516105ba9190612d6e565b60405180910390f35b3480156105cf57600080fd5b506105d8610fd1565b005b3480156105e657600080fd5b506105ef610fe5565b6040516105fc9190612cd8565b60405180910390f35b34801561061157600080fd5b5061061a61100f565b6040516106279190612d6e565b60405180910390f35b34801561063c57600080fd5b50610645611015565b6040516106529190612c12565b60405180910390f35b34801561066757600080fd5b50610682600480360381019061067d9190613067565b6110a7565b005b34801561069057600080fd5b506106996110bd565b005b6106b560048036038101906106b09190612c6a565b6110e2565b005b3480156106c357600080fd5b506106de60048036038101906106d99190613148565b6111ce565b005b3480156106ec57600080fd5b506106f5611230565b6040516107029190612c12565b60405180910390f35b34801561071757600080fd5b50610732600480360381019061072d9190612c6a565b6112be565b005b34801561074057600080fd5b5061075b60048036038101906107569190612c6a565b6112d0565b6040516107689190612c12565b60405180910390f35b34801561077d57600080fd5b506107986004803603810190610793919061301e565b611428565b005b3480156107a657600080fd5b506107c160048036038101906107bc91906131cb565b611443565b6040516107ce9190612b0e565b60405180910390f35b3480156107e357600080fd5b506107fe60048036038101906107f99190612c6a565b6114d7565b005b34801561080c57600080fd5b506108276004803603810190610822919061301e565b6114e9565b005b34801561083557600080fd5b50610850600480360381019061084b9190612ddc565b611504565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108c557506108c482611587565b5b9050919050565b6108d4611669565b80601060006101000a81548160ff02191690831515021790555050565b6060600080546109009061323a565b80601f016020809104026020016040519081016040528092919081815260200182805461092c9061323a565b80156109795780601f1061094e57610100808354040283529160200191610979565b820191906000526020600020905b81548152906001019060200180831161095c57829003601f168201915b5050505050905090565b600061098e826116e7565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b601180546109d69061323a565b80601f0160208091040260200160405190810160405280929190818152602001828054610a029061323a565b8015610a4f5780601f10610a2457610100808354040283529160200191610a4f565b820191906000526020600020905b815481529060010190602001808311610a3257829003601f168201915b505050505081565b6000610a6282610e94565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610ad2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac9906132dd565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610af1611732565b73ffffffffffffffffffffffffffffffffffffffff161480610b205750610b1f81610b1a611732565b611443565b5b610b5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b569061336f565b60405180910390fd5b610b69838361173a565b505050565b6000600880549050905090565b610b8c610b86611732565b826117f3565b610bcb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc290613401565b60405180910390fd5b610bd6838383611888565b505050565b6000610be683610f1a565b8210610c27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1e90613493565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600d5481565b610c8e611669565b6000610c98610fe5565b73ffffffffffffffffffffffffffffffffffffffff1647604051610cbb906134e4565b60006040518083038185875af1925050503d8060008114610cf8576040519150601f19603f3d011682016040523d82523d6000602084013e610cfd565b606091505b5050905080610d0b57600080fd5b50565b610d29838383604051806020016040528060008152506111ce565b505050565b60606000610d3b83610f1a565b905060008167ffffffffffffffff811115610d5957610d58612ef3565b5b604051908082528060200260200182016040528015610d875781602001602082028036833780820191505090505b50905060005b82811015610dd157610d9f8582610bdb565b828281518110610db257610db16134f9565b5b6020026020010181815250508080610dc990613557565b915050610d8d565b508092505050919050565b6000610de6610b6e565b8210610e27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1e90613611565b60405180910390fd5b60088281548110610e3b57610e3a6134f9565b5b90600052602060002001549050919050565b601060019054906101000a900460ff1681565b610e68611669565b80600b9081610e7791906137dd565b5050565b600f5481565b601060009054906101000a900460ff1681565b600080610ea083611b81565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610f11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f08906138fb565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610f8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f819061398d565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610fd9611669565b610fe36000611bbe565b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600e5481565b6060600180546110249061323a565b80601f01602080910402602001604051908101604052809291908181526020018280546110509061323a565b801561109d5780601f106110725761010080835404028352916020019161109d565b820191906000526020600020905b81548152906001019060200180831161108057829003601f168201915b5050505050905090565b6110b96110b2611732565b8383611c84565b5050565b6110c5611669565b6001601060016101000a81548160ff021916908315150217905550565b60006110ec610b6e565b9050601060009054906101000a900460ff161561110857600080fd5b6000821161111557600080fd5b600f5482111561112457600080fd5b600e54828261113391906139ad565b111561113e57600080fd5b611146610fe5565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146111935781600d5461118691906139e1565b34101561119257600080fd5b5b6000600190505b8281116111c9576111b63382846111b191906139ad565b611df0565b80806111c190613557565b91505061119a565b505050565b6111df6111d9611732565b836117f3565b61121e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121590613401565b60405180910390fd5b61122a84848484611e0e565b50505050565b600c805461123d9061323a565b80601f01602080910402602001604051908101604052809291908181526020018280546112699061323a565b80156112b65780601f1061128b576101008083540402835291602001916112b6565b820191906000526020600020905b81548152906001019060200180831161129957829003601f168201915b505050505081565b6112c6611669565b80600d8190555050565b60606112db82611e6a565b61131a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131190613a95565b60405180910390fd5b60001515601060019054906101000a900460ff161515036113c757601180546113429061323a565b80601f016020809104026020016040519081016040528092919081815260200182805461136e9061323a565b80156113bb5780601f10611390576101008083540402835291602001916113bb565b820191906000526020600020905b81548152906001019060200180831161139e57829003601f168201915b50505050509050611423565b60006113d1611eab565b905060008151116113f1576040518060200160405280600081525061141f565b806113fb84611f3d565b600c60405160200161140f93929190613b74565b6040516020818303038152906040525b9150505b919050565b611430611669565b80600c908161143f91906137dd565b5050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6114df611669565b80600f8190555050565b6114f1611669565b806011908161150091906137dd565b5050565b61150c611669565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361157b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157290613c17565b60405180910390fd5b61158481611bbe565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061165257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061166257506116618261200b565b5b9050919050565b611671611732565b73ffffffffffffffffffffffffffffffffffffffff1661168f610fe5565b73ffffffffffffffffffffffffffffffffffffffff16146116e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116dc90613c83565b60405180910390fd5b565b6116f081611e6a565b61172f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611726906138fb565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166117ad83610e94565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000806117ff83610e94565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061184157506118408185611443565b5b8061187f57508373ffffffffffffffffffffffffffffffffffffffff1661186784610983565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166118a882610e94565b73ffffffffffffffffffffffffffffffffffffffff16146118fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f590613d15565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361196d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196490613da7565b60405180910390fd5b61197a8383836001612075565b8273ffffffffffffffffffffffffffffffffffffffff1661199a82610e94565b73ffffffffffffffffffffffffffffffffffffffff16146119f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e790613d15565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611b7c83838360016121d3565b505050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611cf2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce990613e13565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611de39190612b0e565b60405180910390a3505050565b611e0a8282604051806020016040528060008152506121d9565b5050565b611e19848484611888565b611e2584848484612234565b611e64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5b90613ea5565b60405180910390fd5b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff16611e8c83611b81565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6060600b8054611eba9061323a565b80601f0160208091040260200160405190810160405280929190818152602001828054611ee69061323a565b8015611f335780601f10611f0857610100808354040283529160200191611f33565b820191906000526020600020905b815481529060010190602001808311611f1657829003601f168201915b5050505050905090565b606060006001611f4c846123bb565b01905060008167ffffffffffffffff811115611f6b57611f6a612ef3565b5b6040519080825280601f01601f191660200182016040528015611f9d5781602001600182028036833780820191505090505b509050600082602001820190505b600115612000578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581611ff457611ff3613ec5565b5b04945060008503611fab575b819350505050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6120818484848461250e565b60018111156120c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120bc90613f66565b60405180910390fd5b6000829050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff160361210c5761210781612514565b61214b565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161461214a57612149858261255d565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361218d57612188816126ca565b6121cc565b8473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146121cb576121ca848261279b565b5b5b5050505050565b50505050565b6121e3838361281a565b6121f06000848484612234565b61222f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222690613ea5565b60405180910390fd5b505050565b60006122558473ffffffffffffffffffffffffffffffffffffffff16612a37565b156123ae578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261227e611732565b8786866040518563ffffffff1660e01b81526004016122a09493929190613fdb565b6020604051808303816000875af19250505080156122dc57506040513d601f19601f820116820180604052508101906122d9919061403c565b60015b61235e573d806000811461230c576040519150601f19603f3d011682016040523d82523d6000602084013e612311565b606091505b506000815103612356576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234d90613ea5565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506123b3565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612419577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000838161240f5761240e613ec5565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612456576d04ee2d6d415b85acef8100000000838161244c5761244b613ec5565b5b0492506020810190505b662386f26fc10000831061248557662386f26fc10000838161247b5761247a613ec5565b5b0492506010810190505b6305f5e10083106124ae576305f5e10083816124a4576124a3613ec5565b5b0492506008810190505b61271083106124d35761271083816124c9576124c8613ec5565b5b0492506004810190505b606483106124f657606483816124ec576124eb613ec5565b5b0492506002810190505b600a8310612505576001810190505b80915050919050565b50505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161256a84610f1a565b6125749190614069565b9050600060076000848152602001908152602001600020549050818114612659576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506126de9190614069565b905060006009600084815260200190815260200160002054905060006008838154811061270e5761270d6134f9565b5b9060005260206000200154905080600883815481106127305761272f6134f9565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061277f5761277e61409d565b5b6001900381819060005260206000200160009055905550505050565b60006127a683610f1a565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612889576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161288090614118565b60405180910390fd5b61289281611e6a565b156128d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128c990614184565b60405180910390fd5b6128e0600083836001612075565b6128e981611e6a565b15612929576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161292090614184565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612a336000838360016121d3565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612aa381612a6e565b8114612aae57600080fd5b50565b600081359050612ac081612a9a565b92915050565b600060208284031215612adc57612adb612a64565b5b6000612aea84828501612ab1565b91505092915050565b60008115159050919050565b612b0881612af3565b82525050565b6000602082019050612b236000830184612aff565b92915050565b612b3281612af3565b8114612b3d57600080fd5b50565b600081359050612b4f81612b29565b92915050565b600060208284031215612b6b57612b6a612a64565b5b6000612b7984828501612b40565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612bbc578082015181840152602081019050612ba1565b60008484015250505050565b6000601f19601f8301169050919050565b6000612be482612b82565b612bee8185612b8d565b9350612bfe818560208601612b9e565b612c0781612bc8565b840191505092915050565b60006020820190508181036000830152612c2c8184612bd9565b905092915050565b6000819050919050565b612c4781612c34565b8114612c5257600080fd5b50565b600081359050612c6481612c3e565b92915050565b600060208284031215612c8057612c7f612a64565b5b6000612c8e84828501612c55565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612cc282612c97565b9050919050565b612cd281612cb7565b82525050565b6000602082019050612ced6000830184612cc9565b92915050565b612cfc81612cb7565b8114612d0757600080fd5b50565b600081359050612d1981612cf3565b92915050565b60008060408385031215612d3657612d35612a64565b5b6000612d4485828601612d0a565b9250506020612d5585828601612c55565b9150509250929050565b612d6881612c34565b82525050565b6000602082019050612d836000830184612d5f565b92915050565b600080600060608486031215612da257612da1612a64565b5b6000612db086828701612d0a565b9350506020612dc186828701612d0a565b9250506040612dd286828701612c55565b9150509250925092565b600060208284031215612df257612df1612a64565b5b6000612e0084828501612d0a565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612e3e81612c34565b82525050565b6000612e508383612e35565b60208301905092915050565b6000602082019050919050565b6000612e7482612e09565b612e7e8185612e14565b9350612e8983612e25565b8060005b83811015612eba578151612ea18882612e44565b9750612eac83612e5c565b925050600181019050612e8d565b5085935050505092915050565b60006020820190508181036000830152612ee18184612e69565b905092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612f2b82612bc8565b810181811067ffffffffffffffff82111715612f4a57612f49612ef3565b5b80604052505050565b6000612f5d612a5a565b9050612f698282612f22565b919050565b600067ffffffffffffffff821115612f8957612f88612ef3565b5b612f9282612bc8565b9050602081019050919050565b82818337600083830152505050565b6000612fc1612fbc84612f6e565b612f53565b905082815260208101848484011115612fdd57612fdc612eee565b5b612fe8848285612f9f565b509392505050565b600082601f83011261300557613004612ee9565b5b8135613015848260208601612fae565b91505092915050565b60006020828403121561303457613033612a64565b5b600082013567ffffffffffffffff81111561305257613051612a69565b5b61305e84828501612ff0565b91505092915050565b6000806040838503121561307e5761307d612a64565b5b600061308c85828601612d0a565b925050602061309d85828601612b40565b9150509250929050565b600067ffffffffffffffff8211156130c2576130c1612ef3565b5b6130cb82612bc8565b9050602081019050919050565b60006130eb6130e6846130a7565b612f53565b90508281526020810184848401111561310757613106612eee565b5b613112848285612f9f565b509392505050565b600082601f83011261312f5761312e612ee9565b5b813561313f8482602086016130d8565b91505092915050565b6000806000806080858703121561316257613161612a64565b5b600061317087828801612d0a565b945050602061318187828801612d0a565b935050604061319287828801612c55565b925050606085013567ffffffffffffffff8111156131b3576131b2612a69565b5b6131bf8782880161311a565b91505092959194509250565b600080604083850312156131e2576131e1612a64565b5b60006131f085828601612d0a565b925050602061320185828601612d0a565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061325257607f821691505b6020821081036132655761326461320b565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006132c7602183612b8d565b91506132d28261326b565b604082019050919050565b600060208201905081810360008301526132f6816132ba565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000613359603d83612b8d565b9150613364826132fd565b604082019050919050565b600060208201905081810360008301526133888161334c565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b60006133eb602d83612b8d565b91506133f68261338f565b604082019050919050565b6000602082019050818103600083015261341a816133de565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b600061347d602b83612b8d565b915061348882613421565b604082019050919050565b600060208201905081810360008301526134ac81613470565b9050919050565b600081905092915050565b50565b60006134ce6000836134b3565b91506134d9826134be565b600082019050919050565b60006134ef826134c1565b9150819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061356282612c34565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361359457613593613528565b5b600182019050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b60006135fb602c83612b8d565b91506136068261359f565b604082019050919050565b6000602082019050818103600083015261362a816135ee565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026136937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613656565b61369d8683613656565b95508019841693508086168417925050509392505050565b6000819050919050565b60006136da6136d56136d084612c34565b6136b5565b612c34565b9050919050565b6000819050919050565b6136f4836136bf565b613708613700826136e1565b848454613663565b825550505050565b600090565b61371d613710565b6137288184846136eb565b505050565b5b8181101561374c57613741600082613715565b60018101905061372e565b5050565b601f8211156137915761376281613631565b61376b84613646565b8101602085101561377a578190505b61378e61378685613646565b83018261372d565b50505b505050565b600082821c905092915050565b60006137b460001984600802613796565b1980831691505092915050565b60006137cd83836137a3565b9150826002028217905092915050565b6137e682612b82565b67ffffffffffffffff8111156137ff576137fe612ef3565b5b613809825461323a565b613814828285613750565b600060209050601f8311600181146138475760008415613835578287015190505b61383f85826137c1565b8655506138a7565b601f19841661385586613631565b60005b8281101561387d57848901518255600182019150602085019450602081019050613858565b8683101561389a5784890151613896601f8916826137a3565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b60006138e5601883612b8d565b91506138f0826138af565b602082019050919050565b60006020820190508181036000830152613914816138d8565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000613977602983612b8d565b91506139828261391b565b604082019050919050565b600060208201905081810360008301526139a68161396a565b9050919050565b60006139b882612c34565b91506139c383612c34565b92508282019050808211156139db576139da613528565b5b92915050565b60006139ec82612c34565b91506139f783612c34565b9250828202613a0581612c34565b91508282048414831517613a1c57613a1b613528565b5b5092915050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000613a7f602f83612b8d565b9150613a8a82613a23565b604082019050919050565b60006020820190508181036000830152613aae81613a72565b9050919050565b600081905092915050565b6000613acb82612b82565b613ad58185613ab5565b9350613ae5818560208601612b9e565b80840191505092915050565b60008154613afe8161323a565b613b088186613ab5565b94506001821660008114613b235760018114613b3857613b6b565b60ff1983168652811515820286019350613b6b565b613b4185613631565b60005b83811015613b6357815481890152600182019150602081019050613b44565b838801955050505b50505092915050565b6000613b808286613ac0565b9150613b8c8285613ac0565b9150613b988284613af1565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613c01602683612b8d565b9150613c0c82613ba5565b604082019050919050565b60006020820190508181036000830152613c3081613bf4565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613c6d602083612b8d565b9150613c7882613c37565b602082019050919050565b60006020820190508181036000830152613c9c81613c60565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000613cff602583612b8d565b9150613d0a82613ca3565b604082019050919050565b60006020820190508181036000830152613d2e81613cf2565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613d91602483612b8d565b9150613d9c82613d35565b604082019050919050565b60006020820190508181036000830152613dc081613d84565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000613dfd601983612b8d565b9150613e0882613dc7565b602082019050919050565b60006020820190508181036000830152613e2c81613df0565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000613e8f603283612b8d565b9150613e9a82613e33565b604082019050919050565b60006020820190508181036000830152613ebe81613e82565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f455243373231456e756d657261626c653a20636f6e736563757469766520747260008201527f616e7366657273206e6f7420737570706f727465640000000000000000000000602082015250565b6000613f50603583612b8d565b9150613f5b82613ef4565b604082019050919050565b60006020820190508181036000830152613f7f81613f43565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000613fad82613f86565b613fb78185613f91565b9350613fc7818560208601612b9e565b613fd081612bc8565b840191505092915050565b6000608082019050613ff06000830187612cc9565b613ffd6020830186612cc9565b61400a6040830185612d5f565b818103606083015261401c8184613fa2565b905095945050505050565b60008151905061403681612a9a565b92915050565b60006020828403121561405257614051612a64565b5b600061406084828501614027565b91505092915050565b600061407482612c34565b915061407f83612c34565b925082820390508181111561409757614096613528565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614102602083612b8d565b915061410d826140cc565b602082019050919050565b60006020820190508181036000830152614131816140f5565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b600061416e601c83612b8d565b915061417982614138565b602082019050919050565b6000602082019050818103600083015261419d81614161565b905091905056fea264697066735822122035bddcaf63a456c8dfdee0fc650cb52643d980342e3fd51d877f5f2cefa3899a64736f6c63430008120033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000010426f72656450657065566970436c75620000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044250564300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f697066733a2f2f787878787878782f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f697066733a2f2f787878787878782f0000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _name (string): BoredPepeVipClub
Arg [1] : _symbol (string): BPVC
Arg [2] : _initBaseURI (string): ipfs://xxxxxxx/
Arg [3] : _initNotRevealedUri (string): ipfs://xxxxxxx/
-----Encoded View---------------
12 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000140
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000010
Arg [5] : 426f72656450657065566970436c756200000000000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [7] : 4250564300000000000000000000000000000000000000000000000000000000
Arg [8] : 000000000000000000000000000000000000000000000000000000000000000f
Arg [9] : 697066733a2f2f787878787878782f0000000000000000000000000000000000
Arg [10] : 000000000000000000000000000000000000000000000000000000000000000f
Arg [11] : 697066733a2f2f787878787878782f0000000000000000000000000000000000
Deployed Bytecode Sourcemap
64721:3128:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58712:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67449:73;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42761:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44273:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65043:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43791:416;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59352:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44973:301;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59020:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64861:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67529:317;;;:::i;:::-;;45345:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65919:348;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59542:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65010:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67217:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64940:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64980:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42471:223;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42202:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20091:103;;;;;;;;;;;;;:::i;:::-;;19450:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64903:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42930:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44516:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66792:65;;;;;;;;;;;;;:::i;:::-;;65469:444;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45567:279;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64819:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66865:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66273:497;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67321:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44742:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66965:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67091:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20349:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58712:224;58814:4;58853:35;58838:50;;;:11;:50;;;;:90;;;;58892:36;58916:11;58892:23;:36::i;:::-;58838:90;58831:97;;58712:224;;;:::o;67449:73::-;19336:13;:11;:13::i;:::-;67510:6:::1;67501;;:15;;;;;;;;;;;;;;;;;;67449:73:::0;:::o;42761:100::-;42815:13;42848:5;42841:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42761:100;:::o;44273:171::-;44349:7;44369:23;44384:7;44369:14;:23::i;:::-;44412:15;:24;44428:7;44412:24;;;;;;;;;;;;;;;;;;;;;44405:31;;44273:171;;;:::o;65043:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;43791:416::-;43872:13;43888:23;43903:7;43888:14;:23::i;:::-;43872:39;;43936:5;43930:11;;:2;:11;;;43922:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;44030:5;44014:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;44039:37;44056:5;44063:12;:10;:12::i;:::-;44039:16;:37::i;:::-;44014:62;43992:173;;;;;;;;;;;;:::i;:::-;;;;;;;;;44178:21;44187:2;44191:7;44178:8;:21::i;:::-;43861:346;43791:416;;:::o;59352:113::-;59413:7;59440:10;:17;;;;59433:24;;59352:113;:::o;44973:301::-;45134:41;45153:12;:10;:12::i;:::-;45167:7;45134:18;:41::i;:::-;45126:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;45238:28;45248:4;45254:2;45258:7;45238:9;:28::i;:::-;44973:301;;;:::o;59020:256::-;59117:7;59153:23;59170:5;59153:16;:23::i;:::-;59145:5;:31;59137:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;59242:12;:19;59255:5;59242:19;;;;;;;;;;;;;;;:26;59262:5;59242:26;;;;;;;;;;;;59235:33;;59020:256;;;;:::o;64861:37::-;;;;:::o;67529:317::-;19336:13;:11;:13::i;:::-;67668:7:::1;67689;:5;:7::i;:::-;67681:21;;67710;67681:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67667:69;;;67751:2;67743:11;;;::::0;::::1;;67574:272;67529:317::o:0;45345:151::-;45449:39;45466:4;45472:2;45476:7;45449:39;;;;;;;;;;;;:16;:39::i;:::-;45345:151;;;:::o;65919:348::-;65994:16;66022:23;66048:17;66058:6;66048:9;:17::i;:::-;66022:43;;66072:25;66114:15;66100:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66072:58;;66142:9;66137:103;66157:15;66153:1;:19;66137:103;;;66202:30;66222:6;66230:1;66202:19;:30::i;:::-;66188:8;66197:1;66188:11;;;;;;;;:::i;:::-;;;;;;;:44;;;;;66174:3;;;;;:::i;:::-;;;;66137:103;;;;66253:8;66246:15;;;;65919:348;;;:::o;59542:233::-;59617:7;59653:30;:28;:30::i;:::-;59645:5;:38;59637:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;59750:10;59761:5;59750:17;;;;;;;;:::i;:::-;;;;;;;;;;59743:24;;59542:233;;;:::o;65010:28::-;;;;;;;;;;;;;:::o;67217:98::-;19336:13;:11;:13::i;:::-;67298:11:::1;67288:7;:21;;;;;;:::i;:::-;;67217:98:::0;:::o;64940:35::-;;;;:::o;64980:25::-;;;;;;;;;;;;;:::o;42471:223::-;42543:7;42563:13;42579:17;42588:7;42579:8;:17::i;:::-;42563:33;;42632:1;42615:19;;:5;:19;;;42607:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;42681:5;42674:12;;;42471:223;;;:::o;42202:207::-;42274:7;42319:1;42302:19;;:5;:19;;;42294:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;42385:9;:16;42395:5;42385:16;;;;;;;;;;;;;;;;42378:23;;42202:207;;;:::o;20091:103::-;19336:13;:11;:13::i;:::-;20156:30:::1;20183:1;20156:18;:30::i;:::-;20091:103::o:0;19450:87::-;19496:7;19523:6;;;;;;;;;;;19516:13;;19450:87;:::o;64903:32::-;;;;:::o;42930:104::-;42986:13;43019:7;43012:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42930:104;:::o;44516:155::-;44611:52;44630:12;:10;:12::i;:::-;44644:8;44654;44611:18;:52::i;:::-;44516:155;;:::o;66792:65::-;19336:13;:11;:13::i;:::-;66847:4:::1;66836:8;;:15;;;;;;;;;;;;;;;;;;66792:65::o:0;65469:444::-;65530:14;65547:13;:11;:13::i;:::-;65530:30;;65576:6;;;;;;;;;;;65575:7;65567:16;;;;;;65612:1;65598:11;:15;65590:24;;;;;;65644:15;;65629:11;:30;;65621:39;;;;;;65699:9;;65684:11;65675:6;:20;;;;:::i;:::-;:33;;65667:42;;;;;;65736:7;:5;:7::i;:::-;65722:21;;:10;:21;;;65718:89;;65787:11;65775:9;;:23;;;;:::i;:::-;65762:9;:36;;65754:45;;;;;;65718:89;65820:9;65832:1;65820:13;;65815:93;65840:11;65835:1;:16;65815:93;;65867:33;65877:10;65898:1;65889:6;:10;;;;:::i;:::-;65867:9;:33::i;:::-;65853:3;;;;;:::i;:::-;;;;65815:93;;;;65523:390;65469:444;:::o;45567:279::-;45698:41;45717:12;:10;:12::i;:::-;45731:7;45698:18;:41::i;:::-;45690:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;45800:38;45814:4;45820:2;45824:7;45833:4;45800:13;:38::i;:::-;45567:279;;;;:::o;64819:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;66865:94::-;19336:13;:11;:13::i;:::-;66943:10:::1;66931:9;:22;;;;66865:94:::0;:::o;66273:497::-;66371:13;66412:16;66420:7;66412;:16::i;:::-;66396:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;66521:5;66509:17;;:8;;;;;;;;;;;:17;;;66506:62;;66546:14;66539:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66506:62;66576:28;66607:10;:8;:10::i;:::-;66576:41;;66662:1;66637:14;66631:28;:32;:133;;;;;;;;;;;;;;;;;66699:14;66715:18;:7;:16;:18::i;:::-;66735:13;66682:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;66631:133;66624:140;;;66273:497;;;;:::o;67321:122::-;19336:13;:11;:13::i;:::-;67420:17:::1;67404:13;:33;;;;;;:::i;:::-;;67321:122:::0;:::o;44742:164::-;44839:4;44863:18;:25;44882:5;44863:25;;;;;;;;;;;;;;;:35;44889:8;44863:35;;;;;;;;;;;;;;;;;;;;;;;;;44856:42;;44742:164;;;;:::o;66965:118::-;19336:13;:11;:13::i;:::-;67061:16:::1;67043:15;:34;;;;66965:118:::0;:::o;67091:120::-;19336:13;:11;:13::i;:::-;67190:15:::1;67173:14;:32;;;;;;:::i;:::-;;67091:120:::0;:::o;20349:201::-;19336:13;:11;:13::i;:::-;20458:1:::1;20438:22;;:8;:22;;::::0;20430:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;20514:28;20533:8;20514:18;:28::i;:::-;20349:201:::0;:::o;41833:305::-;41935:4;41987:25;41972:40;;;:11;:40;;;;:105;;;;42044:33;42029:48;;;:11;:48;;;;41972:105;:158;;;;42094:36;42118:11;42094:23;:36::i;:::-;41972:158;41952:178;;41833:305;;;:::o;19615:132::-;19690:12;:10;:12::i;:::-;19679:23;;:7;:5;:7::i;:::-;:23;;;19671:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;19615:132::o;53836:135::-;53918:16;53926:7;53918;:16::i;:::-;53910:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;53836:135;:::o;18001:98::-;18054:7;18081:10;18074:17;;18001:98;:::o;53149:174::-;53251:2;53224:15;:24;53240:7;53224:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;53307:7;53303:2;53269:46;;53278:23;53293:7;53278:14;:23::i;:::-;53269:46;;;;;;;;;;;;53149:174;;:::o;47836:264::-;47929:4;47946:13;47962:23;47977:7;47962:14;:23::i;:::-;47946:39;;48015:5;48004:16;;:7;:16;;;:52;;;;48024:32;48041:5;48048:7;48024:16;:32::i;:::-;48004:52;:87;;;;48084:7;48060:31;;:20;48072:7;48060:11;:20::i;:::-;:31;;;48004:87;47996:96;;;47836:264;;;;:::o;51801:1229::-;51926:4;51899:31;;:23;51914:7;51899:14;:23::i;:::-;:31;;;51891:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;52005:1;51991:16;;:2;:16;;;51983:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;52061:42;52082:4;52088:2;52092:7;52101:1;52061:20;:42::i;:::-;52233:4;52206:31;;:23;52221:7;52206:14;:23::i;:::-;:31;;;52198:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;52351:15;:24;52367:7;52351:24;;;;;;;;;;;;52344:31;;;;;;;;;;;52846:1;52827:9;:15;52837:4;52827:15;;;;;;;;;;;;;;;;:20;;;;;;;;;;;52879:1;52862:9;:13;52872:2;52862:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;52921:2;52902:7;:16;52910:7;52902:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;52960:7;52956:2;52941:27;;52950:4;52941:27;;;;;;;;;;;;52981:41;53001:4;53007:2;53011:7;53020:1;52981:19;:41::i;:::-;51801:1229;;;:::o;47111:117::-;47177:7;47204;:16;47212:7;47204:16;;;;;;;;;;;;;;;;;;;;;47197:23;;47111:117;;;:::o;20710:191::-;20784:16;20803:6;;;;;;;;;;;20784:25;;20829:8;20820:6;;:17;;;;;;;;;;;;;;;;;;20884:8;20853:40;;20874:8;20853:40;;;;;;;;;;;;20773:128;20710:191;:::o;53466:281::-;53587:8;53578:17;;:5;:17;;;53570:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;53674:8;53636:18;:25;53655:5;53636:25;;;;;;;;;;;;;;;:35;53662:8;53636:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;53720:8;53698:41;;53713:5;53698:41;;;53730:8;53698:41;;;;;;:::i;:::-;;;;;;;;53466:281;;;:::o;48442:110::-;48518:26;48528:2;48532:7;48518:26;;;;;;;;;;;;:9;:26::i;:::-;48442:110;;:::o;46727:270::-;46840:28;46850:4;46856:2;46860:7;46840:9;:28::i;:::-;46887:47;46910:4;46916:2;46920:7;46929:4;46887:22;:47::i;:::-;46879:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;46727:270;;;;:::o;47541:128::-;47606:4;47659:1;47630:31;;:17;47639:7;47630:8;:17::i;:::-;:31;;;;47623:38;;47541:128;;;:::o;65348:102::-;65408:13;65437:7;65430:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65348:102;:::o;14920:716::-;14976:13;15027:14;15064:1;15044:17;15055:5;15044:10;:17::i;:::-;:21;15027:38;;15080:20;15114:6;15103:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15080:41;;15136:11;15265:6;15261:2;15257:15;15249:6;15245:28;15238:35;;15302:288;15309:4;15302:288;;;15334:5;;;;;;;;15476:8;15471:2;15464:5;15460:14;15455:30;15450:3;15442:44;15532:2;15523:11;;;;;;:::i;:::-;;;;;15566:1;15557:5;:10;15302:288;15553:21;15302:288;15611:6;15604:13;;;;;14920:716;;;:::o;33377:157::-;33462:4;33501:25;33486:40;;;:11;:40;;;;33479:47;;33377:157;;;:::o;59849:915::-;60026:61;60053:4;60059:2;60063:12;60077:9;60026:26;:61::i;:::-;60116:1;60104:9;:13;60100:222;;;60247:63;;;;;;;;;;:::i;:::-;;;;;;;;60100:222;60334:15;60352:12;60334:30;;60397:1;60381:18;;:4;:18;;;60377:187;;60416:40;60448:7;60416:31;:40::i;:::-;60377:187;;;60486:2;60478:10;;:4;:10;;;60474:90;;60505:47;60538:4;60544:7;60505:32;:47::i;:::-;60474:90;60377:187;60592:1;60578:16;;:2;:16;;;60574:183;;60611:45;60648:7;60611:36;:45::i;:::-;60574:183;;;60684:4;60678:10;;:2;:10;;;60674:83;;60705:40;60733:2;60737:7;60705:27;:40::i;:::-;60674:83;60574:183;60015:749;59849:915;;;;:::o;56958:115::-;;;;;:::o;48779:285::-;48874:18;48880:2;48884:7;48874:5;:18::i;:::-;48925:53;48956:1;48960:2;48964:7;48973:4;48925:22;:53::i;:::-;48903:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;48779:285;;;:::o;54535:853::-;54689:4;54710:15;:2;:13;;;:15::i;:::-;54706:675;;;54762:2;54746:36;;;54783:12;:10;:12::i;:::-;54797:4;54803:7;54812:4;54746:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;54742:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55004:1;54987:6;:13;:18;54983:328;;55030:60;;;;;;;;;;:::i;:::-;;;;;;;;54983:328;55261:6;55255:13;55246:6;55242:2;55238:15;55231:38;54742:584;54878:41;;;54868:51;;;:6;:51;;;;54861:58;;;;;54706:675;55365:4;55358:11;;54535:853;;;;;;;:::o;11754:948::-;11807:7;11827:14;11844:1;11827:18;;11894:8;11885:5;:17;11881:106;;11932:8;11923:17;;;;;;:::i;:::-;;;;;11969:2;11959:12;;;;11881:106;12014:8;12005:5;:17;12001:106;;12052:8;12043:17;;;;;;:::i;:::-;;;;;12089:2;12079:12;;;;12001:106;12134:8;12125:5;:17;12121:106;;12172:8;12163:17;;;;;;:::i;:::-;;;;;12209:2;12199:12;;;;12121:106;12254:7;12245:5;:16;12241:103;;12291:7;12282:16;;;;;;:::i;:::-;;;;;12327:1;12317:11;;;;12241:103;12371:7;12362:5;:16;12358:103;;12408:7;12399:16;;;;;;:::i;:::-;;;;;12444:1;12434:11;;;;12358:103;12488:7;12479:5;:16;12475:103;;12525:7;12516:16;;;;;;:::i;:::-;;;;;12561:1;12551:11;;;;12475:103;12605:7;12596:5;:16;12592:68;;12643:1;12633:11;;;;12592:68;12688:6;12681:13;;;11754:948;;;:::o;56120:116::-;;;;;:::o;61487:164::-;61591:10;:17;;;;61564:15;:24;61580:7;61564:24;;;;;;;;;;;:44;;;;61619:10;61635:7;61619:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61487:164;:::o;62278:988::-;62544:22;62594:1;62569:22;62586:4;62569:16;:22::i;:::-;:26;;;;:::i;:::-;62544:51;;62606:18;62627:17;:26;62645:7;62627:26;;;;;;;;;;;;62606:47;;62774:14;62760:10;:28;62756:328;;62805:19;62827:12;:18;62840:4;62827:18;;;;;;;;;;;;;;;:34;62846:14;62827:34;;;;;;;;;;;;62805:56;;62911:11;62878:12;:18;62891:4;62878:18;;;;;;;;;;;;;;;:30;62897:10;62878:30;;;;;;;;;;;:44;;;;63028:10;62995:17;:30;63013:11;62995:30;;;;;;;;;;;:43;;;;62790:294;62756:328;63180:17;:26;63198:7;63180:26;;;;;;;;;;;63173:33;;;63224:12;:18;63237:4;63224:18;;;;;;;;;;;;;;;:34;63243:14;63224:34;;;;;;;;;;;63217:41;;;62359:907;;62278:988;;:::o;63561:1079::-;63814:22;63859:1;63839:10;:17;;;;:21;;;;:::i;:::-;63814:46;;63871:18;63892:15;:24;63908:7;63892:24;;;;;;;;;;;;63871:45;;64243:19;64265:10;64276:14;64265:26;;;;;;;;:::i;:::-;;;;;;;;;;64243:48;;64329:11;64304:10;64315;64304:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;64440:10;64409:15;:28;64425:11;64409:28;;;;;;;;;;;:41;;;;64581:15;:24;64597:7;64581:24;;;;;;;;;;;64574:31;;;64616:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;63632:1008;;;63561:1079;:::o;61065:221::-;61150:14;61167:20;61184:2;61167:16;:20::i;:::-;61150:37;;61225:7;61198:12;:16;61211:2;61198:16;;;;;;;;;;;;;;;:24;61215:6;61198:24;;;;;;;;;;;:34;;;;61272:6;61243:17;:26;61261:7;61243:26;;;;;;;;;;;:35;;;;61139:147;61065:221;;:::o;49400:942::-;49494:1;49480:16;;:2;:16;;;49472:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;49553:16;49561:7;49553;:16::i;:::-;49552:17;49544:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;49615:48;49644:1;49648:2;49652:7;49661:1;49615:20;:48::i;:::-;49762:16;49770:7;49762;:16::i;:::-;49761:17;49753:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;50177:1;50160:9;:13;50170:2;50160:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;50221:2;50202:7;:16;50210:7;50202:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;50266:7;50262:2;50241:33;;50258:1;50241:33;;;;;;;;;;;;50287:47;50315:1;50319:2;50323:7;50332:1;50287:19;:47::i;:::-;49400:942;;:::o;22382:326::-;22442:4;22699:1;22677:7;:19;;;:23;22670:30;;22382:326;;;:::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:116::-;1588:21;1603:5;1588:21;:::i;:::-;1581:5;1578:32;1568:60;;1624:1;1621;1614:12;1568:60;1518:116;:::o;1640:133::-;1683:5;1721:6;1708:20;1699:29;;1737:30;1761:5;1737:30;:::i;:::-;1640:133;;;;:::o;1779:323::-;1835:6;1884:2;1872:9;1863:7;1859:23;1855:32;1852:119;;;1890:79;;:::i;:::-;1852:119;2010:1;2035:50;2077:7;2068:6;2057:9;2053:22;2035:50;:::i;:::-;2025:60;;1981:114;1779:323;;;;:::o;2108:99::-;2160:6;2194:5;2188:12;2178:22;;2108:99;;;:::o;2213:169::-;2297:11;2331:6;2326:3;2319:19;2371:4;2366:3;2362:14;2347:29;;2213:169;;;;:::o;2388:246::-;2469:1;2479:113;2493:6;2490:1;2487:13;2479:113;;;2578:1;2573:3;2569:11;2563:18;2559:1;2554:3;2550:11;2543:39;2515:2;2512:1;2508:10;2503:15;;2479:113;;;2626:1;2617:6;2612:3;2608:16;2601:27;2450:184;2388:246;;;:::o;2640:102::-;2681:6;2732:2;2728:7;2723:2;2716:5;2712:14;2708:28;2698:38;;2640:102;;;:::o;2748:377::-;2836:3;2864:39;2897:5;2864:39;:::i;:::-;2919:71;2983:6;2978:3;2919:71;:::i;:::-;2912:78;;2999:65;3057:6;3052:3;3045:4;3038:5;3034:16;2999:65;:::i;:::-;3089:29;3111:6;3089:29;:::i;:::-;3084:3;3080:39;3073:46;;2840:285;2748:377;;;;:::o;3131:313::-;3244:4;3282:2;3271:9;3267:18;3259:26;;3331:9;3325:4;3321:20;3317:1;3306:9;3302:17;3295:47;3359:78;3432:4;3423:6;3359:78;:::i;:::-;3351:86;;3131:313;;;;:::o;3450:77::-;3487:7;3516:5;3505:16;;3450:77;;;:::o;3533:122::-;3606:24;3624:5;3606:24;:::i;:::-;3599:5;3596:35;3586:63;;3645:1;3642;3635:12;3586:63;3533:122;:::o;3661:139::-;3707:5;3745:6;3732:20;3723:29;;3761:33;3788:5;3761:33;:::i;:::-;3661:139;;;;:::o;3806:329::-;3865:6;3914:2;3902:9;3893:7;3889:23;3885:32;3882:119;;;3920:79;;:::i;:::-;3882:119;4040:1;4065:53;4110:7;4101:6;4090:9;4086:22;4065:53;:::i;:::-;4055:63;;4011:117;3806:329;;;;:::o;4141:126::-;4178:7;4218:42;4211:5;4207:54;4196:65;;4141:126;;;:::o;4273:96::-;4310:7;4339:24;4357:5;4339:24;:::i;:::-;4328:35;;4273:96;;;:::o;4375:118::-;4462:24;4480:5;4462:24;:::i;:::-;4457:3;4450:37;4375:118;;:::o;4499:222::-;4592:4;4630:2;4619:9;4615:18;4607:26;;4643:71;4711:1;4700:9;4696:17;4687:6;4643:71;:::i;:::-;4499:222;;;;:::o;4727:122::-;4800:24;4818:5;4800:24;:::i;:::-;4793:5;4790:35;4780:63;;4839:1;4836;4829:12;4780:63;4727:122;:::o;4855:139::-;4901:5;4939:6;4926:20;4917:29;;4955:33;4982:5;4955:33;:::i;:::-;4855:139;;;;:::o;5000:474::-;5068:6;5076;5125:2;5113:9;5104:7;5100:23;5096:32;5093:119;;;5131:79;;:::i;:::-;5093:119;5251:1;5276:53;5321:7;5312:6;5301:9;5297:22;5276:53;:::i;:::-;5266:63;;5222:117;5378:2;5404:53;5449:7;5440:6;5429:9;5425:22;5404:53;:::i;:::-;5394:63;;5349:118;5000:474;;;;;:::o;5480:118::-;5567:24;5585:5;5567:24;:::i;:::-;5562:3;5555:37;5480:118;;:::o;5604:222::-;5697:4;5735:2;5724:9;5720:18;5712:26;;5748:71;5816:1;5805:9;5801:17;5792:6;5748:71;:::i;:::-;5604:222;;;;:::o;5832:619::-;5909:6;5917;5925;5974:2;5962:9;5953:7;5949:23;5945:32;5942:119;;;5980:79;;:::i;:::-;5942:119;6100:1;6125:53;6170:7;6161:6;6150:9;6146:22;6125:53;:::i;:::-;6115:63;;6071:117;6227:2;6253:53;6298:7;6289:6;6278:9;6274:22;6253:53;:::i;:::-;6243:63;;6198:118;6355:2;6381:53;6426:7;6417:6;6406:9;6402:22;6381:53;:::i;:::-;6371:63;;6326:118;5832:619;;;;;:::o;6457:329::-;6516:6;6565:2;6553:9;6544:7;6540:23;6536:32;6533:119;;;6571:79;;:::i;:::-;6533:119;6691:1;6716:53;6761:7;6752:6;6741:9;6737:22;6716:53;:::i;:::-;6706:63;;6662:117;6457:329;;;;:::o;6792:114::-;6859:6;6893:5;6887:12;6877:22;;6792:114;;;:::o;6912:184::-;7011:11;7045:6;7040:3;7033:19;7085:4;7080:3;7076:14;7061:29;;6912:184;;;;:::o;7102:132::-;7169:4;7192:3;7184:11;;7222:4;7217:3;7213:14;7205:22;;7102:132;;;:::o;7240:108::-;7317:24;7335:5;7317:24;:::i;:::-;7312:3;7305:37;7240:108;;:::o;7354:179::-;7423:10;7444:46;7486:3;7478:6;7444:46;:::i;:::-;7522:4;7517:3;7513:14;7499:28;;7354:179;;;;:::o;7539:113::-;7609:4;7641;7636:3;7632:14;7624:22;;7539:113;;;:::o;7688:732::-;7807:3;7836:54;7884:5;7836:54;:::i;:::-;7906:86;7985:6;7980:3;7906:86;:::i;:::-;7899:93;;8016:56;8066:5;8016:56;:::i;:::-;8095:7;8126:1;8111:284;8136:6;8133:1;8130:13;8111:284;;;8212:6;8206:13;8239:63;8298:3;8283:13;8239:63;:::i;:::-;8232:70;;8325:60;8378:6;8325:60;:::i;:::-;8315:70;;8171:224;8158:1;8155;8151:9;8146:14;;8111:284;;;8115:14;8411:3;8404:10;;7812:608;;;7688:732;;;;:::o;8426:373::-;8569:4;8607:2;8596:9;8592:18;8584:26;;8656:9;8650:4;8646:20;8642:1;8631:9;8627:17;8620:47;8684:108;8787:4;8778:6;8684:108;:::i;:::-;8676:116;;8426:373;;;;:::o;8805:117::-;8914:1;8911;8904:12;8928:117;9037:1;9034;9027:12;9051:180;9099:77;9096:1;9089:88;9196:4;9193:1;9186:15;9220:4;9217:1;9210:15;9237:281;9320:27;9342:4;9320:27;:::i;:::-;9312:6;9308:40;9450:6;9438:10;9435:22;9414:18;9402:10;9399:34;9396:62;9393:88;;;9461:18;;:::i;:::-;9393:88;9501:10;9497:2;9490:22;9280:238;9237:281;;:::o;9524:129::-;9558:6;9585:20;;:::i;:::-;9575:30;;9614:33;9642:4;9634:6;9614:33;:::i;:::-;9524:129;;;:::o;9659:308::-;9721:4;9811:18;9803:6;9800:30;9797:56;;;9833:18;;:::i;:::-;9797:56;9871:29;9893:6;9871:29;:::i;:::-;9863:37;;9955:4;9949;9945:15;9937:23;;9659:308;;;:::o;9973:146::-;10070:6;10065:3;10060;10047:30;10111:1;10102:6;10097:3;10093:16;10086:27;9973:146;;;:::o;10125:425::-;10203:5;10228:66;10244:49;10286:6;10244:49;:::i;:::-;10228:66;:::i;:::-;10219:75;;10317:6;10310:5;10303:21;10355:4;10348:5;10344:16;10393:3;10384:6;10379:3;10375:16;10372:25;10369:112;;;10400:79;;:::i;:::-;10369:112;10490:54;10537:6;10532:3;10527;10490:54;:::i;:::-;10209:341;10125:425;;;;;:::o;10570:340::-;10626:5;10675:3;10668:4;10660:6;10656:17;10652:27;10642:122;;10683:79;;:::i;:::-;10642:122;10800:6;10787:20;10825:79;10900:3;10892:6;10885:4;10877:6;10873:17;10825:79;:::i;:::-;10816:88;;10632:278;10570:340;;;;:::o;10916:509::-;10985:6;11034:2;11022:9;11013:7;11009:23;11005:32;11002:119;;;11040:79;;:::i;:::-;11002:119;11188:1;11177:9;11173:17;11160:31;11218:18;11210:6;11207:30;11204:117;;;11240:79;;:::i;:::-;11204:117;11345:63;11400:7;11391:6;11380:9;11376:22;11345:63;:::i;:::-;11335:73;;11131:287;10916:509;;;;:::o;11431:468::-;11496:6;11504;11553:2;11541:9;11532:7;11528:23;11524:32;11521:119;;;11559:79;;:::i;:::-;11521:119;11679:1;11704:53;11749:7;11740:6;11729:9;11725:22;11704:53;:::i;:::-;11694:63;;11650:117;11806:2;11832:50;11874:7;11865:6;11854:9;11850:22;11832:50;:::i;:::-;11822:60;;11777:115;11431:468;;;;;:::o;11905:307::-;11966:4;12056:18;12048:6;12045:30;12042:56;;;12078:18;;:::i;:::-;12042:56;12116:29;12138:6;12116:29;:::i;:::-;12108:37;;12200:4;12194;12190:15;12182:23;;11905:307;;;:::o;12218:423::-;12295:5;12320:65;12336:48;12377:6;12336:48;:::i;:::-;12320:65;:::i;:::-;12311:74;;12408:6;12401:5;12394:21;12446:4;12439:5;12435:16;12484:3;12475:6;12470:3;12466:16;12463:25;12460:112;;;12491:79;;:::i;:::-;12460:112;12581:54;12628:6;12623:3;12618;12581:54;:::i;:::-;12301:340;12218:423;;;;;:::o;12660:338::-;12715:5;12764:3;12757:4;12749:6;12745:17;12741:27;12731:122;;12772:79;;:::i;:::-;12731:122;12889:6;12876:20;12914:78;12988:3;12980:6;12973:4;12965:6;12961:17;12914:78;:::i;:::-;12905:87;;12721:277;12660:338;;;;:::o;13004:943::-;13099:6;13107;13115;13123;13172:3;13160:9;13151:7;13147:23;13143:33;13140:120;;;13179:79;;:::i;:::-;13140:120;13299:1;13324:53;13369:7;13360:6;13349:9;13345:22;13324:53;:::i;:::-;13314:63;;13270:117;13426:2;13452:53;13497:7;13488:6;13477:9;13473:22;13452:53;:::i;:::-;13442:63;;13397:118;13554:2;13580:53;13625:7;13616:6;13605:9;13601:22;13580:53;:::i;:::-;13570:63;;13525:118;13710:2;13699:9;13695:18;13682:32;13741:18;13733:6;13730:30;13727:117;;;13763:79;;:::i;:::-;13727:117;13868:62;13922:7;13913:6;13902:9;13898:22;13868:62;:::i;:::-;13858:72;;13653:287;13004:943;;;;;;;:::o;13953:474::-;14021:6;14029;14078:2;14066:9;14057:7;14053:23;14049:32;14046:119;;;14084:79;;:::i;:::-;14046:119;14204:1;14229:53;14274:7;14265:6;14254:9;14250:22;14229:53;:::i;:::-;14219:63;;14175:117;14331:2;14357:53;14402:7;14393:6;14382:9;14378:22;14357:53;:::i;:::-;14347:63;;14302:118;13953:474;;;;;:::o;14433:180::-;14481:77;14478:1;14471:88;14578:4;14575:1;14568:15;14602:4;14599:1;14592:15;14619:320;14663:6;14700:1;14694:4;14690:12;14680:22;;14747:1;14741:4;14737:12;14768:18;14758:81;;14824:4;14816:6;14812:17;14802:27;;14758:81;14886:2;14878:6;14875:14;14855:18;14852:38;14849:84;;14905:18;;:::i;:::-;14849:84;14670:269;14619:320;;;:::o;14945:220::-;15085:34;15081:1;15073:6;15069:14;15062:58;15154:3;15149:2;15141:6;15137:15;15130:28;14945:220;:::o;15171:366::-;15313:3;15334:67;15398:2;15393:3;15334:67;:::i;:::-;15327:74;;15410:93;15499:3;15410:93;:::i;:::-;15528:2;15523:3;15519:12;15512:19;;15171:366;;;:::o;15543:419::-;15709:4;15747:2;15736:9;15732:18;15724:26;;15796:9;15790:4;15786:20;15782:1;15771:9;15767:17;15760:47;15824:131;15950:4;15824:131;:::i;:::-;15816:139;;15543:419;;;:::o;15968:248::-;16108:34;16104:1;16096:6;16092:14;16085:58;16177:31;16172:2;16164:6;16160:15;16153:56;15968:248;:::o;16222:366::-;16364:3;16385:67;16449:2;16444:3;16385:67;:::i;:::-;16378:74;;16461:93;16550:3;16461:93;:::i;:::-;16579:2;16574:3;16570:12;16563:19;;16222:366;;;:::o;16594:419::-;16760:4;16798:2;16787:9;16783:18;16775:26;;16847:9;16841:4;16837:20;16833:1;16822:9;16818:17;16811:47;16875:131;17001:4;16875:131;:::i;:::-;16867:139;;16594:419;;;:::o;17019:232::-;17159:34;17155:1;17147:6;17143:14;17136:58;17228:15;17223:2;17215:6;17211:15;17204:40;17019:232;:::o;17257:366::-;17399:3;17420:67;17484:2;17479:3;17420:67;:::i;:::-;17413:74;;17496:93;17585:3;17496:93;:::i;:::-;17614:2;17609:3;17605:12;17598:19;;17257:366;;;:::o;17629:419::-;17795:4;17833:2;17822:9;17818:18;17810:26;;17882:9;17876:4;17872:20;17868:1;17857:9;17853:17;17846:47;17910:131;18036:4;17910:131;:::i;:::-;17902:139;;17629:419;;;:::o;18054:230::-;18194:34;18190:1;18182:6;18178:14;18171:58;18263:13;18258:2;18250:6;18246:15;18239:38;18054:230;:::o;18290:366::-;18432:3;18453:67;18517:2;18512:3;18453:67;:::i;:::-;18446:74;;18529:93;18618:3;18529:93;:::i;:::-;18647:2;18642:3;18638:12;18631:19;;18290:366;;;:::o;18662:419::-;18828:4;18866:2;18855:9;18851:18;18843:26;;18915:9;18909:4;18905:20;18901:1;18890:9;18886:17;18879:47;18943:131;19069:4;18943:131;:::i;:::-;18935:139;;18662:419;;;:::o;19087:147::-;19188:11;19225:3;19210:18;;19087:147;;;;:::o;19240:114::-;;:::o;19360:398::-;19519:3;19540:83;19621:1;19616:3;19540:83;:::i;:::-;19533:90;;19632:93;19721:3;19632:93;:::i;:::-;19750:1;19745:3;19741:11;19734:18;;19360:398;;;:::o;19764:379::-;19948:3;19970:147;20113:3;19970:147;:::i;:::-;19963:154;;20134:3;20127:10;;19764:379;;;:::o;20149:180::-;20197:77;20194:1;20187:88;20294:4;20291:1;20284:15;20318:4;20315:1;20308:15;20335:180;20383:77;20380:1;20373:88;20480:4;20477:1;20470:15;20504:4;20501:1;20494:15;20521:233;20560:3;20583:24;20601:5;20583:24;:::i;:::-;20574:33;;20629:66;20622:5;20619:77;20616:103;;20699:18;;:::i;:::-;20616:103;20746:1;20739:5;20735:13;20728:20;;20521:233;;;:::o;20760:231::-;20900:34;20896:1;20888:6;20884:14;20877:58;20969:14;20964:2;20956:6;20952:15;20945:39;20760:231;:::o;20997:366::-;21139:3;21160:67;21224:2;21219:3;21160:67;:::i;:::-;21153:74;;21236:93;21325:3;21236:93;:::i;:::-;21354:2;21349:3;21345:12;21338:19;;20997:366;;;:::o;21369:419::-;21535:4;21573:2;21562:9;21558:18;21550:26;;21622:9;21616:4;21612:20;21608:1;21597:9;21593:17;21586:47;21650:131;21776:4;21650:131;:::i;:::-;21642:139;;21369:419;;;:::o;21794:141::-;21843:4;21866:3;21858:11;;21889:3;21886:1;21879:14;21923:4;21920:1;21910:18;21902:26;;21794:141;;;:::o;21941:93::-;21978:6;22025:2;22020;22013:5;22009:14;22005:23;21995:33;;21941:93;;;:::o;22040:107::-;22084:8;22134:5;22128:4;22124:16;22103:37;;22040:107;;;;:::o;22153:393::-;22222:6;22272:1;22260:10;22256:18;22295:97;22325:66;22314:9;22295:97;:::i;:::-;22413:39;22443:8;22432:9;22413:39;:::i;:::-;22401:51;;22485:4;22481:9;22474:5;22470:21;22461:30;;22534:4;22524:8;22520:19;22513:5;22510:30;22500:40;;22229:317;;22153:393;;;;;:::o;22552:60::-;22580:3;22601:5;22594:12;;22552:60;;;:::o;22618:142::-;22668:9;22701:53;22719:34;22728:24;22746:5;22728:24;:::i;:::-;22719:34;:::i;:::-;22701:53;:::i;:::-;22688:66;;22618:142;;;:::o;22766:75::-;22809:3;22830:5;22823:12;;22766:75;;;:::o;22847:269::-;22957:39;22988:7;22957:39;:::i;:::-;23018:91;23067:41;23091:16;23067:41;:::i;:::-;23059:6;23052:4;23046:11;23018:91;:::i;:::-;23012:4;23005:105;22923:193;22847:269;;;:::o;23122:73::-;23167:3;23122:73;:::o;23201:189::-;23278:32;;:::i;:::-;23319:65;23377:6;23369;23363:4;23319:65;:::i;:::-;23254:136;23201:189;;:::o;23396:186::-;23456:120;23473:3;23466:5;23463:14;23456:120;;;23527:39;23564:1;23557:5;23527:39;:::i;:::-;23500:1;23493:5;23489:13;23480:22;;23456:120;;;23396:186;;:::o;23588:543::-;23689:2;23684:3;23681:11;23678:446;;;23723:38;23755:5;23723:38;:::i;:::-;23807:29;23825:10;23807:29;:::i;:::-;23797:8;23793:44;23990:2;23978:10;23975:18;23972:49;;;24011:8;23996:23;;23972:49;24034:80;24090:22;24108:3;24090:22;:::i;:::-;24080:8;24076:37;24063:11;24034:80;:::i;:::-;23693:431;;23678:446;23588:543;;;:::o;24137:117::-;24191:8;24241:5;24235:4;24231:16;24210:37;;24137:117;;;;:::o;24260:169::-;24304:6;24337:51;24385:1;24381:6;24373:5;24370:1;24366:13;24337:51;:::i;:::-;24333:56;24418:4;24412;24408:15;24398:25;;24311:118;24260:169;;;;:::o;24434:295::-;24510:4;24656:29;24681:3;24675:4;24656:29;:::i;:::-;24648:37;;24718:3;24715:1;24711:11;24705:4;24702:21;24694:29;;24434:295;;;;:::o;24734:1395::-;24851:37;24884:3;24851:37;:::i;:::-;24953:18;24945:6;24942:30;24939:56;;;24975:18;;:::i;:::-;24939:56;25019:38;25051:4;25045:11;25019:38;:::i;:::-;25104:67;25164:6;25156;25150:4;25104:67;:::i;:::-;25198:1;25222:4;25209:17;;25254:2;25246:6;25243:14;25271:1;25266:618;;;;25928:1;25945:6;25942:77;;;25994:9;25989:3;25985:19;25979:26;25970:35;;25942:77;26045:67;26105:6;26098:5;26045:67;:::i;:::-;26039:4;26032:81;25901:222;25236:887;;25266:618;25318:4;25314:9;25306:6;25302:22;25352:37;25384:4;25352:37;:::i;:::-;25411:1;25425:208;25439:7;25436:1;25433:14;25425:208;;;25518:9;25513:3;25509:19;25503:26;25495:6;25488:42;25569:1;25561:6;25557:14;25547:24;;25616:2;25605:9;25601:18;25588:31;;25462:4;25459:1;25455:12;25450:17;;25425:208;;;25661:6;25652:7;25649:19;25646:179;;;25719:9;25714:3;25710:19;25704:26;25762:48;25804:4;25796:6;25792:17;25781:9;25762:48;:::i;:::-;25754:6;25747:64;25669:156;25646:179;25871:1;25867;25859:6;25855:14;25851:22;25845:4;25838:36;25273:611;;;25236:887;;24826:1303;;;24734:1395;;:::o;26135:174::-;26275:26;26271:1;26263:6;26259:14;26252:50;26135:174;:::o;26315:366::-;26457:3;26478:67;26542:2;26537:3;26478:67;:::i;:::-;26471:74;;26554:93;26643:3;26554:93;:::i;:::-;26672:2;26667:3;26663:12;26656:19;;26315:366;;;:::o;26687:419::-;26853:4;26891:2;26880:9;26876:18;26868:26;;26940:9;26934:4;26930:20;26926:1;26915:9;26911:17;26904:47;26968:131;27094:4;26968:131;:::i;:::-;26960:139;;26687:419;;;:::o;27112:228::-;27252:34;27248:1;27240:6;27236:14;27229:58;27321:11;27316:2;27308:6;27304:15;27297:36;27112:228;:::o;27346:366::-;27488:3;27509:67;27573:2;27568:3;27509:67;:::i;:::-;27502:74;;27585:93;27674:3;27585:93;:::i;:::-;27703:2;27698:3;27694:12;27687:19;;27346:366;;;:::o;27718:419::-;27884:4;27922:2;27911:9;27907:18;27899:26;;27971:9;27965:4;27961:20;27957:1;27946:9;27942:17;27935:47;27999:131;28125:4;27999:131;:::i;:::-;27991:139;;27718:419;;;:::o;28143:191::-;28183:3;28202:20;28220:1;28202:20;:::i;:::-;28197:25;;28236:20;28254:1;28236:20;:::i;:::-;28231:25;;28279:1;28276;28272:9;28265:16;;28300:3;28297:1;28294:10;28291:36;;;28307:18;;:::i;:::-;28291:36;28143:191;;;;:::o;28340:410::-;28380:7;28403:20;28421:1;28403:20;:::i;:::-;28398:25;;28437:20;28455:1;28437:20;:::i;:::-;28432:25;;28492:1;28489;28485:9;28514:30;28532:11;28514:30;:::i;:::-;28503:41;;28693:1;28684:7;28680:15;28677:1;28674:22;28654:1;28647:9;28627:83;28604:139;;28723:18;;:::i;:::-;28604:139;28388:362;28340:410;;;;:::o;28756:234::-;28896:34;28892:1;28884:6;28880:14;28873:58;28965:17;28960:2;28952:6;28948:15;28941:42;28756:234;:::o;28996:366::-;29138:3;29159:67;29223:2;29218:3;29159:67;:::i;:::-;29152:74;;29235:93;29324:3;29235:93;:::i;:::-;29353:2;29348:3;29344:12;29337:19;;28996:366;;;:::o;29368:419::-;29534:4;29572:2;29561:9;29557:18;29549:26;;29621:9;29615:4;29611:20;29607:1;29596:9;29592:17;29585:47;29649:131;29775:4;29649:131;:::i;:::-;29641:139;;29368:419;;;:::o;29793:148::-;29895:11;29932:3;29917:18;;29793:148;;;;:::o;29947:390::-;30053:3;30081:39;30114:5;30081:39;:::i;:::-;30136:89;30218:6;30213:3;30136:89;:::i;:::-;30129:96;;30234:65;30292:6;30287:3;30280:4;30273:5;30269:16;30234:65;:::i;:::-;30324:6;30319:3;30315:16;30308:23;;30057:280;29947:390;;;;:::o;30367:874::-;30470:3;30507:5;30501:12;30536:36;30562:9;30536:36;:::i;:::-;30588:89;30670:6;30665:3;30588:89;:::i;:::-;30581:96;;30708:1;30697:9;30693:17;30724:1;30719:166;;;;30899:1;30894:341;;;;30686:549;;30719:166;30803:4;30799:9;30788;30784:25;30779:3;30772:38;30865:6;30858:14;30851:22;30843:6;30839:35;30834:3;30830:45;30823:52;;30719:166;;30894:341;30961:38;30993:5;30961:38;:::i;:::-;31021:1;31035:154;31049:6;31046:1;31043:13;31035:154;;;31123:7;31117:14;31113:1;31108:3;31104:11;31097:35;31173:1;31164:7;31160:15;31149:26;;31071:4;31068:1;31064:12;31059:17;;31035:154;;;31218:6;31213:3;31209:16;31202:23;;30901:334;;30686:549;;30474:767;;30367:874;;;;:::o;31247:589::-;31472:3;31494:95;31585:3;31576:6;31494:95;:::i;:::-;31487:102;;31606:95;31697:3;31688:6;31606:95;:::i;:::-;31599:102;;31718:92;31806:3;31797:6;31718:92;:::i;:::-;31711:99;;31827:3;31820:10;;31247:589;;;;;;:::o;31842:225::-;31982:34;31978:1;31970:6;31966:14;31959:58;32051:8;32046:2;32038:6;32034:15;32027:33;31842:225;:::o;32073:366::-;32215:3;32236:67;32300:2;32295:3;32236:67;:::i;:::-;32229:74;;32312:93;32401:3;32312:93;:::i;:::-;32430:2;32425:3;32421:12;32414:19;;32073:366;;;:::o;32445:419::-;32611:4;32649:2;32638:9;32634:18;32626:26;;32698:9;32692:4;32688:20;32684:1;32673:9;32669:17;32662:47;32726:131;32852:4;32726:131;:::i;:::-;32718:139;;32445:419;;;:::o;32870:182::-;33010:34;33006:1;32998:6;32994:14;32987:58;32870:182;:::o;33058:366::-;33200:3;33221:67;33285:2;33280:3;33221:67;:::i;:::-;33214:74;;33297:93;33386:3;33297:93;:::i;:::-;33415:2;33410:3;33406:12;33399:19;;33058:366;;;:::o;33430:419::-;33596:4;33634:2;33623:9;33619:18;33611:26;;33683:9;33677:4;33673:20;33669:1;33658:9;33654:17;33647:47;33711:131;33837:4;33711:131;:::i;:::-;33703:139;;33430:419;;;:::o;33855:224::-;33995:34;33991:1;33983:6;33979:14;33972:58;34064:7;34059:2;34051:6;34047:15;34040:32;33855:224;:::o;34085:366::-;34227:3;34248:67;34312:2;34307:3;34248:67;:::i;:::-;34241:74;;34324:93;34413:3;34324:93;:::i;:::-;34442:2;34437:3;34433:12;34426:19;;34085:366;;;:::o;34457:419::-;34623:4;34661:2;34650:9;34646:18;34638:26;;34710:9;34704:4;34700:20;34696:1;34685:9;34681:17;34674:47;34738:131;34864:4;34738:131;:::i;:::-;34730:139;;34457:419;;;:::o;34882:223::-;35022:34;35018:1;35010:6;35006:14;34999:58;35091:6;35086:2;35078:6;35074:15;35067:31;34882:223;:::o;35111:366::-;35253:3;35274:67;35338:2;35333:3;35274:67;:::i;:::-;35267:74;;35350:93;35439:3;35350:93;:::i;:::-;35468:2;35463:3;35459:12;35452:19;;35111:366;;;:::o;35483:419::-;35649:4;35687:2;35676:9;35672:18;35664:26;;35736:9;35730:4;35726:20;35722:1;35711:9;35707:17;35700:47;35764:131;35890:4;35764:131;:::i;:::-;35756:139;;35483:419;;;:::o;35908:175::-;36048:27;36044:1;36036:6;36032:14;36025:51;35908:175;:::o;36089:366::-;36231:3;36252:67;36316:2;36311:3;36252:67;:::i;:::-;36245:74;;36328:93;36417:3;36328:93;:::i;:::-;36446:2;36441:3;36437:12;36430:19;;36089:366;;;:::o;36461:419::-;36627:4;36665:2;36654:9;36650:18;36642:26;;36714:9;36708:4;36704:20;36700:1;36689:9;36685:17;36678:47;36742:131;36868:4;36742:131;:::i;:::-;36734:139;;36461:419;;;:::o;36886:237::-;37026:34;37022:1;37014:6;37010:14;37003:58;37095:20;37090:2;37082:6;37078:15;37071:45;36886:237;:::o;37129:366::-;37271:3;37292:67;37356:2;37351:3;37292:67;:::i;:::-;37285:74;;37368:93;37457:3;37368:93;:::i;:::-;37486:2;37481:3;37477:12;37470:19;;37129:366;;;:::o;37501:419::-;37667:4;37705:2;37694:9;37690:18;37682:26;;37754:9;37748:4;37744:20;37740:1;37729:9;37725:17;37718:47;37782:131;37908:4;37782:131;:::i;:::-;37774:139;;37501:419;;;:::o;37926:180::-;37974:77;37971:1;37964:88;38071:4;38068:1;38061:15;38095:4;38092:1;38085:15;38112:240;38252:34;38248:1;38240:6;38236:14;38229:58;38321:23;38316:2;38308:6;38304:15;38297:48;38112:240;:::o;38358:366::-;38500:3;38521:67;38585:2;38580:3;38521:67;:::i;:::-;38514:74;;38597:93;38686:3;38597:93;:::i;:::-;38715:2;38710:3;38706:12;38699:19;;38358:366;;;:::o;38730:419::-;38896:4;38934:2;38923:9;38919:18;38911:26;;38983:9;38977:4;38973:20;38969:1;38958:9;38954:17;38947:47;39011:131;39137:4;39011:131;:::i;:::-;39003:139;;38730:419;;;:::o;39155:98::-;39206:6;39240:5;39234:12;39224:22;;39155:98;;;:::o;39259:168::-;39342:11;39376:6;39371:3;39364:19;39416:4;39411:3;39407:14;39392:29;;39259:168;;;;:::o;39433:373::-;39519:3;39547:38;39579:5;39547:38;:::i;:::-;39601:70;39664:6;39659:3;39601:70;:::i;:::-;39594:77;;39680:65;39738:6;39733:3;39726:4;39719:5;39715:16;39680:65;:::i;:::-;39770:29;39792:6;39770:29;:::i;:::-;39765:3;39761:39;39754:46;;39523:283;39433:373;;;;:::o;39812:640::-;40007:4;40045:3;40034:9;40030:19;40022:27;;40059:71;40127:1;40116:9;40112:17;40103:6;40059:71;:::i;:::-;40140:72;40208:2;40197:9;40193:18;40184:6;40140:72;:::i;:::-;40222;40290:2;40279:9;40275:18;40266:6;40222:72;:::i;:::-;40341:9;40335:4;40331:20;40326:2;40315:9;40311:18;40304:48;40369:76;40440:4;40431:6;40369:76;:::i;:::-;40361:84;;39812:640;;;;;;;:::o;40458:141::-;40514:5;40545:6;40539:13;40530:22;;40561:32;40587:5;40561:32;:::i;:::-;40458:141;;;;:::o;40605:349::-;40674:6;40723:2;40711:9;40702:7;40698:23;40694:32;40691:119;;;40729:79;;:::i;:::-;40691:119;40849:1;40874:63;40929:7;40920:6;40909:9;40905:22;40874:63;:::i;:::-;40864:73;;40820:127;40605:349;;;;:::o;40960:194::-;41000:4;41020:20;41038:1;41020:20;:::i;:::-;41015:25;;41054:20;41072:1;41054:20;:::i;:::-;41049:25;;41098:1;41095;41091:9;41083:17;;41122:1;41116:4;41113:11;41110:37;;;41127:18;;:::i;:::-;41110:37;40960:194;;;;:::o;41160:180::-;41208:77;41205:1;41198:88;41305:4;41302:1;41295:15;41329:4;41326:1;41319:15;41346:182;41486:34;41482:1;41474:6;41470:14;41463:58;41346:182;:::o;41534:366::-;41676:3;41697:67;41761:2;41756:3;41697:67;:::i;:::-;41690:74;;41773:93;41862:3;41773:93;:::i;:::-;41891:2;41886:3;41882:12;41875:19;;41534:366;;;:::o;41906:419::-;42072:4;42110:2;42099:9;42095:18;42087:26;;42159:9;42153:4;42149:20;42145:1;42134:9;42130:17;42123:47;42187:131;42313:4;42187:131;:::i;:::-;42179:139;;41906:419;;;:::o;42331:178::-;42471:30;42467:1;42459:6;42455:14;42448:54;42331:178;:::o;42515:366::-;42657:3;42678:67;42742:2;42737:3;42678:67;:::i;:::-;42671:74;;42754:93;42843:3;42754:93;:::i;:::-;42872:2;42867:3;42863:12;42856:19;;42515:366;;;:::o;42887:419::-;43053:4;43091:2;43080:9;43076:18;43068:26;;43140:9;43134:4;43130:20;43126:1;43115:9;43111:17;43104:47;43168:131;43294:4;43168:131;:::i;:::-;43160:139;;42887:419;;;:::o
Swarm Source
ipfs://35bddcaf63a456c8dfdee0fc650cb52643d980342e3fd51d877f5f2cefa3899a
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.