Contract Overview
Balance:
0 CRO
CRO Value:
$0.00
[ Download CSV Export ]
Latest 5 internal transactions
Parent Txn Hash | Block | From | To | Value | |||
---|---|---|---|---|---|---|---|
0xd422877a25184fecb29151403b46fbd2dafd03d9945af6bfe83d44ffecce778c | 8509475 | 11 days 12 hrs ago | 0x59594894615bb0941a3bc746d8f99fcf5a1977b5 | 0x881420a347b81fb691b348a9b412c39e695dd6ae | 40 CRO | ||
0xd422877a25184fecb29151403b46fbd2dafd03d9945af6bfe83d44ffecce778c | 8509475 | 11 days 12 hrs ago | 0x59594894615bb0941a3bc746d8f99fcf5a1977b5 | 0x4995a7787816e2898c171d1064615ee7e4c3dd22 | 80 CRO | ||
0xd422877a25184fecb29151403b46fbd2dafd03d9945af6bfe83d44ffecce778c | 8509475 | 11 days 12 hrs ago | 0x59594894615bb0941a3bc746d8f99fcf5a1977b5 | 0x2b98dbf6e4af55fad3f509152a867849b358677f | 80 CRO | ||
0xd422877a25184fecb29151403b46fbd2dafd03d9945af6bfe83d44ffecce778c | 8509475 | 11 days 12 hrs ago | 0x59594894615bb0941a3bc746d8f99fcf5a1977b5 | 0x4995a7787816e2898c171d1064615ee7e4c3dd22 | 200 CRO | ||
0xd422877a25184fecb29151403b46fbd2dafd03d9945af6bfe83d44ffecce778c | 8509475 | 11 days 12 hrs ago | 0x59594894615bb0941a3bc746d8f99fcf5a1977b5 | 0x4d1d39e722a26d485de95c9bada1e004690e7931 | 600 CRO |
[ Download CSV Export ]
Contract Source Code Verified (Exact Match)
Contract Name:
GhostlyLands
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity)
/** *Submitted for verification at cronoscan.com on 2023-05-23 */ // File: @openzeppelin/contracts/security/ReentrancyGuard.sol // OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be _NOT_ENTERED require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); } // File: @openzeppelin/contracts/utils/math/Math.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv( uint256 x, uint256 y, uint256 denominator ) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv( uint256 x, uint256 y, uint256 denominator, Rounding rounding ) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10**64) { value /= 10**64; result += 64; } if (value >= 10**32) { value /= 10**32; result += 32; } if (value >= 10**16) { value /= 10**16; result += 16; } if (value >= 10**8) { value /= 10**8; result += 8; } if (value >= 10**4) { value /= 10**4; result += 4; } if (value >= 10**2) { value /= 10**2; result += 2; } if (value >= 10**1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0); } } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { unchecked { uint256 length = Math.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), _SYMBOLS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, Math.log256(value) + 1); } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/interfaces/IERC2981.sol // OpenZeppelin Contracts (last updated v4.6.0) (interfaces/IERC2981.sol) pragma solidity ^0.8.0; /** * @dev Interface for the NFT Royalty Standard. * * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal * support for royalty payments across all NFT marketplaces and ecosystem participants. * * _Available since v4.5._ */ interface IERC2981 is IERC165 { /** * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of * exchange. The royalty amount is denominated and should be paid in that same unit of exchange. */ function royaltyInfo(uint256 tokenId, uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount); } // 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/common/ERC2981.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/common/ERC2981.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information. * * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first. * * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the * fee is specified in basis points by default. * * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported. * * _Available since v4.5._ */ abstract contract ERC2981 is IERC2981, ERC165 { struct RoyaltyInfo { address receiver; uint96 royaltyFraction; } RoyaltyInfo private _defaultRoyaltyInfo; mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) { return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId); } /** * @inheritdoc IERC2981 */ function royaltyInfo(uint256 _tokenId, uint256 _salePrice) public view virtual override returns (address, uint256) { RoyaltyInfo memory royalty = _tokenRoyaltyInfo[_tokenId]; if (royalty.receiver == address(0)) { royalty = _defaultRoyaltyInfo; } uint256 royaltyAmount = (_salePrice * royalty.royaltyFraction) / _feeDenominator(); return (royalty.receiver, royaltyAmount); } /** * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an * override. */ function _feeDenominator() internal pure virtual returns (uint96) { return 10000; } /** * @dev Sets the royalty information that all ids in this contract will default to. * * Requirements: * * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual { require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice"); require(receiver != address(0), "ERC2981: invalid receiver"); _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Removes default royalty information. */ function _deleteDefaultRoyalty() internal virtual { delete _defaultRoyaltyInfo; } /** * @dev Sets the royalty information for a specific token id, overriding the global default. * * Requirements: * * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setTokenRoyalty( uint256 tokenId, address receiver, uint96 feeNumerator ) internal virtual { require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice"); require(receiver != address(0), "ERC2981: Invalid parameters"); _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Resets royalty information for the token id back to the global default. */ function _resetTokenRoyalty(uint256 tokenId) internal virtual { delete _tokenRoyaltyInfo[tokenId]; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721 * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must * understand this adds an external call which potentially creates a reentrancy vulnerability. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC721/extensions/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.8.2) (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: contracts/3_Ballot.sol pragma solidity ^0.8.17; contract GhostlyLands is ERC721Enumerable, Ownable, ReentrancyGuard, ERC2981 { uint256 public constant MAX_SUPPLY = 1212; uint256 public constant TOKENS_PER_TYPE = 303; uint256 public ogHoldersPriceBoo; uint256 public publicPriceBoo; uint256 public ogHoldersPriceCro; uint256 public publicPriceCro; address payable public ghostWalletLiquidity = payable(0x4d1d39E722A26d485DE95C9BaDA1E004690E7931); address payable public ghostclubDev = payable(0x4995A7787816e2898c171D1064615EE7e4c3DD22); address payable public drDao = payable(0x2b98dbF6E4af55FaD3f509152a867849b358677F); address payable public projectFee = payable(0x4995A7787816e2898c171D1064615EE7e4c3DD22); address payable public collabManager = payable(0x881420a347B81Fb691b348A9B412C39e695dd6AE); IERC20 public booToken = IERC20(0x3484D2216174aD804808DE2D25d807Bf21535b46); IERC721 public ghostOGCollection = IERC721(0xe0160145ec09f98fb3Dbc03b2b5da08D16871e3f); bool public saleIsActive = false; string private _baseTokenURI = "ipfs://QmQZ8BnCzbxq9LMo3cC392SdxQ981fTASiCnhdTHq97UPP/"; mapping(uint256 => bool) private mintedTokens; constructor() ERC721("Ghostly Lands", "GHL") { // Initialize prices ogHoldersPriceBoo = 5000 * 10**18; publicPriceBoo = 7500 * 10**18; ogHoldersPriceCro = 200 ether; publicPriceCro = 250 ether; setDefaultRoyalty(ghostWalletLiquidity, 1000); } function flipSaleState() public onlyOwner { saleIsActive = !saleIsActive; } function setPrices( uint256 _ogHoldersPriceBoo, uint256 _publicPriceBoo, uint256 _ogHoldersPriceCro, uint256 _publicPriceCro ) public onlyOwner { ogHoldersPriceBoo = _ogHoldersPriceBoo; publicPriceBoo = _publicPriceBoo; ogHoldersPriceCro = _ogHoldersPriceCro; publicPriceCro = _publicPriceCro; } function setGhostWalletLiquidity(address payable _ghostWalletLiquidity) public onlyOwner { ghostWalletLiquidity = _ghostWalletLiquidity; } function setGhostclubDev(address payable _ghostclubDev) public onlyOwner { ghostclubDev = _ghostclubDev; } function setDrDao(address payable _drDao) public onlyOwner { drDao = _drDao; } function setProjectFee(address payable _projectFee) public onlyOwner { projectFee = _projectFee; } function setCollabManager(address payable _collabManager) public onlyOwner { collabManager = _collabManager; } function mint(uint256 numTokens) public payable nonReentrant { require(saleIsActive, "Sale has not started yet be"); require(totalSupply() + numTokens <= MAX_SUPPLY, "Exceeds MAX_SUPPLY"); require(numTokens > 0, "Must mint at least one token"); // Determine the current payment token and price uint256 price = _getCurrentMintPrice(msg.sender); address paymentToken = _getCurrentPaymentToken(); // Check payment if (paymentToken == address(0)) { // CRO payment require(msg.value == numTokens * price, "Incorrect amount of CRO sent"); } else { // BOO payment require( msg.value == 0, "Should not send CRO when minting with BOO" ); require( booToken.transferFrom( msg.sender, address(this), numTokens * price ), "Failed to transfer BOO tokens" ); } for (uint256 i = 0; i < numTokens; i++) { uint256 newTokenId = getRandomId(); _safeMint(msg.sender, newTokenId); } } function getRandomId() internal view returns (uint256) { uint256 randomId = uint256( keccak256(abi.encodePacked(block.difficulty, block.timestamp)) ) % MAX_SUPPLY; while (_exists(randomId + 1)) { randomId = uint256( keccak256( abi.encodePacked( block.difficulty, block.timestamp, randomId ) ) ) % MAX_SUPPLY; } return randomId + 1; } function _baseURI() internal view override returns (string memory) { return _baseTokenURI; } function setBaseURI(string memory baseURI) public onlyOwner { _baseTokenURI = baseURI; } function withdraw() public onlyOwner { uint256 balance = address(this).balance; uint256 ghostWalletShare = (balance * 60) / 100; uint256 ghostclubDevShare = (balance * 20) / 100; uint256 otherShares = (balance * 8) / 100; uint256 collabManagerShare = (balance * 4) / 100; ghostWalletLiquidity.transfer(ghostWalletShare); ghostclubDev.transfer(ghostclubDevShare); drDao.transfer(otherShares); projectFee.transfer(otherShares); collabManager.transfer(collabManagerShare); } function withdrawBooTokens() public onlyOwner { uint256 balance = booToken.balanceOf(address(this)); booToken.transfer(ghostWalletLiquidity, balance); } function _getCurrentMintPrice(address user) internal view returns (uint256) { bool isOGHolder = ghostOGCollection.balanceOf(user) > 0; if ( totalSupply() < TOKENS_PER_TYPE || (totalSupply() >= 2 * TOKENS_PER_TYPE && totalSupply() < 3 * TOKENS_PER_TYPE) ) { // CRO minting phase return isOGHolder ? ogHoldersPriceCro : publicPriceCro; } else { // BOO minting phase return isOGHolder ? ogHoldersPriceBoo : publicPriceBoo; } } function _getCurrentPaymentToken() internal view returns (address) { if ( totalSupply() < TOKENS_PER_TYPE || (totalSupply() >= 2 * TOKENS_PER_TYPE && totalSupply() < 3 * TOKENS_PER_TYPE) ) { // CRO minting phase return address(0); // Representing native currency } else { // BOO minting phase return address(booToken); } } function setDefaultRoyalty(address receiver, uint96 feeNumerator) public onlyOwner { _setDefaultRoyalty(receiver, feeNumerator); } function supportsInterface(bytes4 interfaceId) public view override(ERC721Enumerable, ERC2981) returns (bool) { return super.supportsInterface(interfaceId); } string public baseExtension = ".json"; function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require( _exists(tokenId), "ERC721Metadata: URI query for nonexistent token" ); string memory currentBaseURI = _baseURI(); return bytes(currentBaseURI).length > 0 ? string( abi.encodePacked( currentBaseURI, Strings.toString(tokenId), baseExtension ) ) : ""; } function setBaseExtension(string memory _newBaseExtension) public onlyOwner { baseExtension = _newBaseExtension; } }
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOKENS_PER_TYPE","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":[],"name":"booToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"collabManager","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"drDao","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ghostOGCollection","outputs":[{"internalType":"contract IERC721","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ghostWalletLiquidity","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ghostclubDev","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numTokens","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ogHoldersPriceBoo","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ogHoldersPriceCro","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"projectFee","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicPriceBoo","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicPriceCro","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"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":"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":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_collabManager","type":"address"}],"name":"setCollabManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint96","name":"feeNumerator","type":"uint96"}],"name":"setDefaultRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_drDao","type":"address"}],"name":"setDrDao","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_ghostWalletLiquidity","type":"address"}],"name":"setGhostWalletLiquidity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_ghostclubDev","type":"address"}],"name":"setGhostclubDev","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_ogHoldersPriceBoo","type":"uint256"},{"internalType":"uint256","name":"_publicPriceBoo","type":"uint256"},{"internalType":"uint256","name":"_ogHoldersPriceCro","type":"uint256"},{"internalType":"uint256","name":"_publicPriceCro","type":"uint256"}],"name":"setPrices","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_projectFee","type":"address"}],"name":"setProjectFee","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":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawBooTokens","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052734d1d39e722a26d485de95c9bada1e004690e7931601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550734995a7787816e2898c171d1064615ee7e4c3dd22601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550732b98dbf6e4af55fad3f509152a867849b358677f601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550734995a7787816e2898c171d1064615ee7e4c3dd22601560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073881420a347b81fb691b348a9b412c39e695dd6ae601660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550733484d2216174ad804808de2d25d807bf21535b46601760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073e0160145ec09f98fb3dbc03b2b5da08d16871e3f601860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000601860146101000a81548160ff0219169083151502179055506040518060600160405280603681526020016200650660369139601990816200029c919062000a00565b506040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250601b9081620002e3919062000a00565b50348015620002f157600080fd5b506040518060400160405280600d81526020017f47686f73746c79204c616e6473000000000000000000000000000000000000008152506040518060400160405280600381526020017f47484c000000000000000000000000000000000000000000000000000000000081525081600090816200036f919062000a00565b50806001908162000381919062000a00565b505050620003a4620003986200042a60201b60201c565b6200043260201b60201c565b6001600b8190555069010f0cf064dd59200000600e819055506901969368974c05b00000600f81905550680ad78ebc5ac6200000601081905550680d8d726b7177a8000060118190555062000424601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166103e8620004f860201b60201c565b62000c74565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620005086200051e60201b60201c565b6200051a8282620005af60201b60201c565b5050565b6200052e6200042a60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620005546200075260201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620005ad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005a49062000b48565b60405180910390fd5b565b620005bf6200077c60201b60201c565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff16111562000620576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620006179062000be0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000692576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620006899062000c52565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600c60008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000612710905090565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200080857607f821691505b6020821081036200081e576200081d620007c0565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620008887fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000849565b62000894868362000849565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620008e1620008db620008d584620008ac565b620008b6565b620008ac565b9050919050565b6000819050919050565b620008fd83620008c0565b620009156200090c82620008e8565b84845462000856565b825550505050565b600090565b6200092c6200091d565b62000939818484620008f2565b505050565b5b8181101562000961576200095560008262000922565b6001810190506200093f565b5050565b601f821115620009b0576200097a8162000824565b620009858462000839565b8101602085101562000995578190505b620009ad620009a48562000839565b8301826200093e565b50505b505050565b600082821c905092915050565b6000620009d560001984600802620009b5565b1980831691505092915050565b6000620009f08383620009c2565b9150826002028217905092915050565b62000a0b8262000786565b67ffffffffffffffff81111562000a275762000a2662000791565b5b62000a338254620007ef565b62000a4082828562000965565b600060209050601f83116001811462000a78576000841562000a63578287015190505b62000a6f8582620009e2565b86555062000adf565b601f19841662000a888662000824565b60005b8281101562000ab25784890151825560018201915060208501945060208101905062000a8b565b8683101562000ad2578489015162000ace601f891682620009c2565b8355505b6001600288020188555050505b505050505050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600062000b3060208362000ae7565b915062000b3d8262000af8565b602082019050919050565b6000602082019050818103600083015262000b638162000b21565b9050919050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b600062000bc8602a8362000ae7565b915062000bd58262000b6a565b604082019050919050565b6000602082019050818103600083015262000bfb8162000bb9565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b600062000c3a60198362000ae7565b915062000c478262000c02565b602082019050919050565b6000602082019050818103600083015262000c6d8162000c2b565b9050919050565b6158828062000c846000396000f3fe6080604052600436106102935760003560e01c806370a082311161015a578063c52a851d116100c1578063da3ef23f1161007a578063da3ef23f146109c0578063df176b43146109e9578063e4c8233714610a12578063e985e9c514610a3d578063eb8d244414610a7a578063f2fde38b14610aa557610293565b8063c52a851d146108b2578063c6682862146108db578063c87b56dd14610906578063cbeb4ac114610943578063d58f2f271461096c578063d8e868541461099757610293565b806395d89b411161011357806395d89b41146107c55780639fdb0267146107f0578063a0712d681461081b578063a22cb46514610837578063b88d4fde14610860578063be9413c61461088957610293565b806370a08231146106c5578063715018a61461070257806388f0036f146107195780638da5cb5b146107445780638de48c0b1461076f57806392368a7a1461079a57610293565b80632f745c59116101fe578063449cb046116101b7578063449cb046146105a15780634f6ccce7146105cc5780634fe270351461060957806355f804b3146106345780636158874f1461065d5780636352211e1461068857610293565b80632f745c59146104b957806332cb6b0c146104f657806334918dfd1461052157806337060732146105385780633ccfd60b1461056157806342842e0e1461057857610293565b806318160ddd1161025057806318160ddd146103ba5780631f8f10e8146103e557806322f08cb11461041057806323b872dd146104275780632a55205a146104505780632f3178211461048e57610293565b806301ffc9a71461029857806304634d8d146102d557806306fdde03146102fe578063081812fc14610329578063095ea7b3146103665780631114c9a91461038f575b600080fd5b3480156102a457600080fd5b506102bf60048036038101906102ba9190613a23565b610ace565b6040516102cc9190613a6b565b60405180910390f35b3480156102e157600080fd5b506102fc60048036038101906102f79190613b28565b610ae0565b005b34801561030a57600080fd5b50610313610af6565b6040516103209190613bf8565b60405180910390f35b34801561033557600080fd5b50610350600480360381019061034b9190613c50565b610b88565b60405161035d9190613c8c565b60405180910390f35b34801561037257600080fd5b5061038d60048036038101906103889190613ca7565b610bce565b005b34801561039b57600080fd5b506103a4610ce5565b6040516103b19190613d08565b60405180910390f35b3480156103c657600080fd5b506103cf610d0b565b6040516103dc9190613d32565b60405180910390f35b3480156103f157600080fd5b506103fa610d18565b6040516104079190613dac565b60405180910390f35b34801561041c57600080fd5b50610425610d3e565b005b34801561043357600080fd5b5061044e60048036038101906104499190613dc7565b610eac565b005b34801561045c57600080fd5b5061047760048036038101906104729190613e1a565b610f0c565b604051610485929190613e5a565b60405180910390f35b34801561049a57600080fd5b506104a36110f6565b6040516104b09190613ea4565b60405180910390f35b3480156104c557600080fd5b506104e060048036038101906104db9190613ca7565b61111c565b6040516104ed9190613d32565b60405180910390f35b34801561050257600080fd5b5061050b6111c1565b6040516105189190613d32565b60405180910390f35b34801561052d57600080fd5b506105366111c7565b005b34801561054457600080fd5b5061055f600480360381019061055a9190613eeb565b6111fb565b005b34801561056d57600080fd5b50610576611247565b005b34801561058457600080fd5b5061059f600480360381019061059a9190613dc7565b6114dc565b005b3480156105ad57600080fd5b506105b66114fc565b6040516105c39190613d08565b60405180910390f35b3480156105d857600080fd5b506105f360048036038101906105ee9190613c50565b611522565b6040516106009190613d32565b60405180910390f35b34801561061557600080fd5b5061061e611593565b60405161062b9190613d32565b60405180910390f35b34801561064057600080fd5b5061065b6004803603810190610656919061404d565b611599565b005b34801561066957600080fd5b506106726115b4565b60405161067f9190613d08565b60405180910390f35b34801561069457600080fd5b506106af60048036038101906106aa9190613c50565b6115da565b6040516106bc9190613c8c565b60405180910390f35b3480156106d157600080fd5b506106ec60048036038101906106e79190614096565b611660565b6040516106f99190613d32565b60405180910390f35b34801561070e57600080fd5b50610717611717565b005b34801561072557600080fd5b5061072e61172b565b60405161073b9190613d32565b60405180910390f35b34801561075057600080fd5b50610759611731565b6040516107669190613c8c565b60405180910390f35b34801561077b57600080fd5b5061078461175b565b6040516107919190613d08565b60405180910390f35b3480156107a657600080fd5b506107af611781565b6040516107bc9190613d32565b60405180910390f35b3480156107d157600080fd5b506107da611787565b6040516107e79190613bf8565b60405180910390f35b3480156107fc57600080fd5b50610805611819565b6040516108129190613d32565b60405180910390f35b61083560048036038101906108309190613c50565b61181f565b005b34801561084357600080fd5b5061085e600480360381019061085991906140ef565b611b22565b005b34801561086c57600080fd5b50610887600480360381019061088291906141d0565b611b38565b005b34801561089557600080fd5b506108b060048036038101906108ab9190613eeb565b611b9a565b005b3480156108be57600080fd5b506108d960048036038101906108d49190613eeb565b611be6565b005b3480156108e757600080fd5b506108f0611c32565b6040516108fd9190613bf8565b60405180910390f35b34801561091257600080fd5b5061092d60048036038101906109289190613c50565b611cc0565b60405161093a9190613bf8565b60405180910390f35b34801561094f57600080fd5b5061096a60048036038101906109659190613eeb565b611d6a565b005b34801561097857600080fd5b50610981611db6565b60405161098e9190613d08565b60405180910390f35b3480156109a357600080fd5b506109be60048036038101906109b99190614253565b611ddc565b005b3480156109cc57600080fd5b506109e760048036038101906109e2919061404d565b611e06565b005b3480156109f557600080fd5b50610a106004803603810190610a0b9190613eeb565b611e21565b005b348015610a1e57600080fd5b50610a27611e6d565b604051610a349190613d32565b60405180910390f35b348015610a4957600080fd5b50610a646004803603810190610a5f91906142ba565b611e73565b604051610a719190613a6b565b60405180910390f35b348015610a8657600080fd5b50610a8f611f07565b604051610a9c9190613a6b565b60405180910390f35b348015610ab157600080fd5b50610acc6004803603810190610ac79190614096565b611f1a565b005b6000610ad982611f9d565b9050919050565b610ae8612017565b610af28282612095565b5050565b606060008054610b0590614329565b80601f0160208091040260200160405190810160405280929190818152602001828054610b3190614329565b8015610b7e5780601f10610b5357610100808354040283529160200191610b7e565b820191906000526020600020905b815481529060010190602001808311610b6157829003601f168201915b5050505050905090565b6000610b938261222a565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610bd9826115da565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610c49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c40906143cc565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c68612275565b73ffffffffffffffffffffffffffffffffffffffff161480610c975750610c9681610c91612275565b611e73565b5b610cd6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ccd9061445e565b60405180910390fd5b610ce0838361227d565b505050565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600880549050905090565b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610d46612017565b6000601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610da39190613c8c565b602060405180830381865afa158015610dc0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610de49190614493565b9050601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b8152600401610e659291906144e1565b6020604051808303816000875af1158015610e84573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ea8919061451f565b5050565b610ebd610eb7612275565b82612336565b610efc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef3906145be565b60405180910390fd5b610f078383836123cb565b505050565b6000806000600d60008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16036110a157600c6040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b60006110ab6126c4565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff16866110d7919061460d565b6110e1919061467e565b90508160000151819350935050509250929050565b601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600061112783611660565b8210611168576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115f90614721565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6104bc81565b6111cf612017565b601860149054906101000a900460ff1615601860146101000a81548160ff021916908315150217905550565b611203612017565b80601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61124f612017565b600047905060006064603c83611265919061460d565b61126f919061467e565b905060006064601484611282919061460d565b61128c919061467e565b90506000606460088561129f919061460d565b6112a9919061467e565b9050600060646004866112bc919061460d565b6112c6919061467e565b9050601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc859081150290604051600060405180830381858888f19350505050158015611330573d6000803e3d6000fd5b50601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f19350505050158015611399573d6000803e3d6000fd5b50601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015611402573d6000803e3d6000fd5b50601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f1935050505015801561146b573d6000803e3d6000fd5b50601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156114d4573d6000803e3d6000fd5b505050505050565b6114f783838360405180602001604052806000815250611b38565b505050565b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600061152c610d0b565b821061156d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611564906147b3565b60405180910390fd5b60088281548110611581576115806147d3565b5b90600052602060002001549050919050565b600f5481565b6115a1612017565b80601990816115b091906149a4565b5050565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806115e6836126ce565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611657576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164e90614ac2565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036116d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c790614b54565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61171f612017565b611729600061270b565b565b60105481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600e5481565b60606001805461179690614329565b80601f01602080910402602001604051908101604052809291908181526020018280546117c290614329565b801561180f5780601f106117e45761010080835404028352916020019161180f565b820191906000526020600020905b8154815290600101906020018083116117f257829003601f168201915b5050505050905090565b61012f81565b6118276127d1565b601860149054906101000a900460ff16611876576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186d90614bc0565b60405180910390fd5b6104bc81611882610d0b565b61188c9190614be0565b11156118cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c490614c60565b60405180910390fd5b60008111611910576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190790614ccc565b60405180910390fd5b600061191b33612820565b90506000611927612948565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036119af578183611969919061460d565b34146119aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a190614d38565b60405180910390fd5b611adf565b600034146119f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e990614dca565b60405180910390fd5b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd33308587611a3e919061460d565b6040518463ffffffff1660e01b8152600401611a5c93929190614dea565b6020604051808303816000875af1158015611a7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a9f919061451f565b611ade576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad590614e6d565b60405180910390fd5b5b60005b83811015611b14576000611af46129cd565b9050611b003382612a7b565b508080611b0c90614e8d565b915050611ae2565b505050611b1f612a99565b50565b611b34611b2d612275565b8383612aa3565b5050565b611b49611b43612275565b83612336565b611b88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7f906145be565b60405180910390fd5b611b9484848484612c0f565b50505050565b611ba2612017565b80601660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611bee612017565b80601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b601b8054611c3f90614329565b80601f0160208091040260200160405190810160405280929190818152602001828054611c6b90614329565b8015611cb85780601f10611c8d57610100808354040283529160200191611cb8565b820191906000526020600020905b815481529060010190602001808311611c9b57829003601f168201915b505050505081565b6060611ccb82612c6b565b611d0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0190614f47565b60405180910390fd5b6000611d14612cac565b90506000815111611d345760405180602001604052806000815250611d62565b80611d3e84612d3e565b601b604051602001611d5293929190615026565b6040516020818303038152906040525b915050919050565b611d72612017565b80601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611de4612017565b83600e8190555082600f81905550816010819055508060118190555050505050565b611e0e612017565b80601b9081611e1d91906149a4565b5050565b611e29612017565b80601560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60115481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b601860149054906101000a900460ff1681565b611f22612017565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611f91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f88906150c9565b60405180910390fd5b611f9a8161270b565b50565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612010575061200f82612e0c565b5b9050919050565b61201f612275565b73ffffffffffffffffffffffffffffffffffffffff1661203d611731565b73ffffffffffffffffffffffffffffffffffffffff1614612093576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208a90615135565b60405180910390fd5b565b61209d6126c4565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff1611156120fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f2906151c7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361216a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216190615233565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600c60008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b61223381612c6b565b612272576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226990614ac2565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166122f0836115da565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080612342836115da565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061238457506123838185611e73565b5b806123c257508373ffffffffffffffffffffffffffffffffffffffff166123aa84610b88565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166123eb826115da565b73ffffffffffffffffffffffffffffffffffffffff1614612441576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612438906152c5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036124b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124a790615357565b60405180910390fd5b6124bd8383836001612e86565b8273ffffffffffffffffffffffffffffffffffffffff166124dd826115da565b73ffffffffffffffffffffffffffffffffffffffff1614612533576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161252a906152c5565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46126bf8383836001612fe4565b505050565b6000612710905090565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6002600b5403612816576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161280d906153c3565b60405180910390fd5b6002600b81905550565b6000806000601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231856040518263ffffffff1660e01b81526004016128809190613c8c565b602060405180830381865afa15801561289d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128c19190614493565b11905061012f6128cf610d0b565b1080612910575061012f60026128e5919061460d565b6128ed610d0b565b1015801561290f575061012f6003612905919061460d565b61290d610d0b565b105b5b1561292e578061292257601154612926565b6010545b915050612943565b8061293b57600f5461293f565b600e545b9150505b919050565b600061012f612955610d0b565b1080612996575061012f600261296b919061460d565b612973610d0b565b10158015612995575061012f600361298b919061460d565b612993610d0b565b105b5b156129a457600090506129ca565b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b90565b6000806104bc44426040516020016129e6929190615404565b6040516020818303038152906040528051906020012060001c612a099190615430565b90505b612a21600182612a1c9190614be0565b612c6b565b15612a68576104bc444283604051602001612a3e93929190615461565b6040516020818303038152906040528051906020012060001c612a619190615430565b9050612a0c565b600181612a759190614be0565b91505090565b612a95828260405180602001604052806000815250612fea565b5050565b6001600b81905550565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612b11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b08906154ea565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612c029190613a6b565b60405180910390a3505050565b612c1a8484846123cb565b612c2684848484613045565b612c65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c5c9061557c565b60405180910390fd5b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff16612c8d836126ce565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b606060198054612cbb90614329565b80601f0160208091040260200160405190810160405280929190818152602001828054612ce790614329565b8015612d345780601f10612d0957610100808354040283529160200191612d34565b820191906000526020600020905b815481529060010190602001808311612d1757829003601f168201915b5050505050905090565b606060006001612d4d846131cc565b01905060008167ffffffffffffffff811115612d6c57612d6b613f22565b5b6040519080825280601f01601f191660200182016040528015612d9e5781602001600182028036833780820191505090505b509050600082602001820190505b600115612e01578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581612df557612df461464f565b5b04945060008503612dac575b819350505050919050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612e7f5750612e7e8261331f565b5b9050919050565b612e9284848484613401565b6001811115612ed6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ecd9061560e565b60405180910390fd5b6000829050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612f1d57612f1881613407565b612f5c565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614612f5b57612f5a8582613450565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612f9e57612f99816135bd565b612fdd565b8473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614612fdc57612fdb848261368e565b5b5b5050505050565b50505050565b612ff4838361370d565b6130016000848484613045565b613040576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130379061557c565b60405180910390fd5b505050565b60006130668473ffffffffffffffffffffffffffffffffffffffff1661392a565b156131bf578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261308f612275565b8786866040518563ffffffff1660e01b81526004016130b19493929190615683565b6020604051808303816000875af19250505080156130ed57506040513d601f19601f820116820180604052508101906130ea91906156e4565b60015b61316f573d806000811461311d576040519150601f19603f3d011682016040523d82523d6000602084013e613122565b606091505b506000815103613167576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161315e9061557c565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506131c4565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000831061322a577a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083816132205761321f61464f565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310613267576d04ee2d6d415b85acef8100000000838161325d5761325c61464f565b5b0492506020810190505b662386f26fc10000831061329657662386f26fc10000838161328c5761328b61464f565b5b0492506010810190505b6305f5e10083106132bf576305f5e10083816132b5576132b461464f565b5b0492506008810190505b61271083106132e45761271083816132da576132d961464f565b5b0492506004810190505b6064831061330757606483816132fd576132fc61464f565b5b0492506002810190505b600a8310613316576001810190505b80915050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806133ea57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806133fa57506133f98261394d565b5b9050919050565b50505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161345d84611660565b6134679190615711565b905060006007600084815260200190815260200160002054905081811461354c576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506135d19190615711565b9050600060096000848152602001908152602001600020549050600060088381548110613601576136006147d3565b5b906000526020600020015490508060088381548110613623576136226147d3565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061367257613671615745565b5b6001900381819060005260206000200160009055905550505050565b600061369983611660565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361377c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613773906157c0565b60405180910390fd5b61378581612c6b565b156137c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137bc9061582c565b60405180910390fd5b6137d3600083836001612e86565b6137dc81612c6b565b1561381c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138139061582c565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613926600083836001612fe4565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613a00816139cb565b8114613a0b57600080fd5b50565b600081359050613a1d816139f7565b92915050565b600060208284031215613a3957613a386139c1565b5b6000613a4784828501613a0e565b91505092915050565b60008115159050919050565b613a6581613a50565b82525050565b6000602082019050613a806000830184613a5c565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613ab182613a86565b9050919050565b613ac181613aa6565b8114613acc57600080fd5b50565b600081359050613ade81613ab8565b92915050565b60006bffffffffffffffffffffffff82169050919050565b613b0581613ae4565b8114613b1057600080fd5b50565b600081359050613b2281613afc565b92915050565b60008060408385031215613b3f57613b3e6139c1565b5b6000613b4d85828601613acf565b9250506020613b5e85828601613b13565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613ba2578082015181840152602081019050613b87565b60008484015250505050565b6000601f19601f8301169050919050565b6000613bca82613b68565b613bd48185613b73565b9350613be4818560208601613b84565b613bed81613bae565b840191505092915050565b60006020820190508181036000830152613c128184613bbf565b905092915050565b6000819050919050565b613c2d81613c1a565b8114613c3857600080fd5b50565b600081359050613c4a81613c24565b92915050565b600060208284031215613c6657613c656139c1565b5b6000613c7484828501613c3b565b91505092915050565b613c8681613aa6565b82525050565b6000602082019050613ca16000830184613c7d565b92915050565b60008060408385031215613cbe57613cbd6139c1565b5b6000613ccc85828601613acf565b9250506020613cdd85828601613c3b565b9150509250929050565b6000613cf282613a86565b9050919050565b613d0281613ce7565b82525050565b6000602082019050613d1d6000830184613cf9565b92915050565b613d2c81613c1a565b82525050565b6000602082019050613d476000830184613d23565b92915050565b6000819050919050565b6000613d72613d6d613d6884613a86565b613d4d565b613a86565b9050919050565b6000613d8482613d57565b9050919050565b6000613d9682613d79565b9050919050565b613da681613d8b565b82525050565b6000602082019050613dc16000830184613d9d565b92915050565b600080600060608486031215613de057613ddf6139c1565b5b6000613dee86828701613acf565b9350506020613dff86828701613acf565b9250506040613e1086828701613c3b565b9150509250925092565b60008060408385031215613e3157613e306139c1565b5b6000613e3f85828601613c3b565b9250506020613e5085828601613c3b565b9150509250929050565b6000604082019050613e6f6000830185613c7d565b613e7c6020830184613d23565b9392505050565b6000613e8e82613d79565b9050919050565b613e9e81613e83565b82525050565b6000602082019050613eb96000830184613e95565b92915050565b613ec881613ce7565b8114613ed357600080fd5b50565b600081359050613ee581613ebf565b92915050565b600060208284031215613f0157613f006139c1565b5b6000613f0f84828501613ed6565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613f5a82613bae565b810181811067ffffffffffffffff82111715613f7957613f78613f22565b5b80604052505050565b6000613f8c6139b7565b9050613f988282613f51565b919050565b600067ffffffffffffffff821115613fb857613fb7613f22565b5b613fc182613bae565b9050602081019050919050565b82818337600083830152505050565b6000613ff0613feb84613f9d565b613f82565b90508281526020810184848401111561400c5761400b613f1d565b5b614017848285613fce565b509392505050565b600082601f83011261403457614033613f18565b5b8135614044848260208601613fdd565b91505092915050565b600060208284031215614063576140626139c1565b5b600082013567ffffffffffffffff811115614081576140806139c6565b5b61408d8482850161401f565b91505092915050565b6000602082840312156140ac576140ab6139c1565b5b60006140ba84828501613acf565b91505092915050565b6140cc81613a50565b81146140d757600080fd5b50565b6000813590506140e9816140c3565b92915050565b60008060408385031215614106576141056139c1565b5b600061411485828601613acf565b9250506020614125858286016140da565b9150509250929050565b600067ffffffffffffffff82111561414a57614149613f22565b5b61415382613bae565b9050602081019050919050565b600061417361416e8461412f565b613f82565b90508281526020810184848401111561418f5761418e613f1d565b5b61419a848285613fce565b509392505050565b600082601f8301126141b7576141b6613f18565b5b81356141c7848260208601614160565b91505092915050565b600080600080608085870312156141ea576141e96139c1565b5b60006141f887828801613acf565b945050602061420987828801613acf565b935050604061421a87828801613c3b565b925050606085013567ffffffffffffffff81111561423b5761423a6139c6565b5b614247878288016141a2565b91505092959194509250565b6000806000806080858703121561426d5761426c6139c1565b5b600061427b87828801613c3b565b945050602061428c87828801613c3b565b935050604061429d87828801613c3b565b92505060606142ae87828801613c3b565b91505092959194509250565b600080604083850312156142d1576142d06139c1565b5b60006142df85828601613acf565b92505060206142f085828601613acf565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061434157607f821691505b602082108103614354576143536142fa565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006143b6602183613b73565b91506143c18261435a565b604082019050919050565b600060208201905081810360008301526143e5816143a9565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000614448603d83613b73565b9150614453826143ec565b604082019050919050565b600060208201905081810360008301526144778161443b565b9050919050565b60008151905061448d81613c24565b92915050565b6000602082840312156144a9576144a86139c1565b5b60006144b78482850161447e565b91505092915050565b60006144cb82613d79565b9050919050565b6144db816144c0565b82525050565b60006040820190506144f660008301856144d2565b6145036020830184613d23565b9392505050565b600081519050614519816140c3565b92915050565b600060208284031215614535576145346139c1565b5b60006145438482850161450a565b91505092915050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b60006145a8602d83613b73565b91506145b38261454c565b604082019050919050565b600060208201905081810360008301526145d78161459b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061461882613c1a565b915061462383613c1a565b925082820261463181613c1a565b91508282048414831517614648576146476145de565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061468982613c1a565b915061469483613c1a565b9250826146a4576146a361464f565b5b828204905092915050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b600061470b602b83613b73565b9150614716826146af565b604082019050919050565b6000602082019050818103600083015261473a816146fe565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b600061479d602c83613b73565b91506147a882614741565b604082019050919050565b600060208201905081810360008301526147cc81614790565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026148647fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614827565b61486e8683614827565b95508019841693508086168417925050509392505050565b60006148a161489c61489784613c1a565b613d4d565b613c1a565b9050919050565b6000819050919050565b6148bb83614886565b6148cf6148c7826148a8565b848454614834565b825550505050565b600090565b6148e46148d7565b6148ef8184846148b2565b505050565b5b81811015614913576149086000826148dc565b6001810190506148f5565b5050565b601f8211156149585761492981614802565b61493284614817565b81016020851015614941578190505b61495561494d85614817565b8301826148f4565b50505b505050565b600082821c905092915050565b600061497b6000198460080261495d565b1980831691505092915050565b6000614994838361496a565b9150826002028217905092915050565b6149ad82613b68565b67ffffffffffffffff8111156149c6576149c5613f22565b5b6149d08254614329565b6149db828285614917565b600060209050601f831160018114614a0e57600084156149fc578287015190505b614a068582614988565b865550614a6e565b601f198416614a1c86614802565b60005b82811015614a4457848901518255600182019150602085019450602081019050614a1f565b86831015614a615784890151614a5d601f89168261496a565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000614aac601883613b73565b9150614ab782614a76565b602082019050919050565b60006020820190508181036000830152614adb81614a9f565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000614b3e602983613b73565b9150614b4982614ae2565b604082019050919050565b60006020820190508181036000830152614b6d81614b31565b9050919050565b7f53616c6520686173206e6f742073746172746564207965742062650000000000600082015250565b6000614baa601b83613b73565b9150614bb582614b74565b602082019050919050565b60006020820190508181036000830152614bd981614b9d565b9050919050565b6000614beb82613c1a565b9150614bf683613c1a565b9250828201905080821115614c0e57614c0d6145de565b5b92915050565b7f45786365656473204d41585f535550504c590000000000000000000000000000600082015250565b6000614c4a601283613b73565b9150614c5582614c14565b602082019050919050565b60006020820190508181036000830152614c7981614c3d565b9050919050565b7f4d757374206d696e74206174206c65617374206f6e6520746f6b656e00000000600082015250565b6000614cb6601c83613b73565b9150614cc182614c80565b602082019050919050565b60006020820190508181036000830152614ce581614ca9565b9050919050565b7f496e636f727265637420616d6f756e74206f662043524f2073656e7400000000600082015250565b6000614d22601c83613b73565b9150614d2d82614cec565b602082019050919050565b60006020820190508181036000830152614d5181614d15565b9050919050565b7f53686f756c64206e6f742073656e642043524f207768656e206d696e74696e6760008201527f207769746820424f4f0000000000000000000000000000000000000000000000602082015250565b6000614db4602983613b73565b9150614dbf82614d58565b604082019050919050565b60006020820190508181036000830152614de381614da7565b9050919050565b6000606082019050614dff6000830186613c7d565b614e0c6020830185613c7d565b614e196040830184613d23565b949350505050565b7f4661696c656420746f207472616e7366657220424f4f20746f6b656e73000000600082015250565b6000614e57601d83613b73565b9150614e6282614e21565b602082019050919050565b60006020820190508181036000830152614e8681614e4a565b9050919050565b6000614e9882613c1a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614eca57614ec96145de565b5b600182019050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000614f31602f83613b73565b9150614f3c82614ed5565b604082019050919050565b60006020820190508181036000830152614f6081614f24565b9050919050565b600081905092915050565b6000614f7d82613b68565b614f878185614f67565b9350614f97818560208601613b84565b80840191505092915050565b60008154614fb081614329565b614fba8186614f67565b94506001821660008114614fd55760018114614fea5761501d565b60ff198316865281151582028601935061501d565b614ff385614802565b60005b8381101561501557815481890152600182019150602081019050614ff6565b838801955050505b50505092915050565b60006150328286614f72565b915061503e8285614f72565b915061504a8284614fa3565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006150b3602683613b73565b91506150be82615057565b604082019050919050565b600060208201905081810360008301526150e2816150a6565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061511f602083613b73565b915061512a826150e9565b602082019050919050565b6000602082019050818103600083015261514e81615112565b9050919050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b60006151b1602a83613b73565b91506151bc82615155565b604082019050919050565b600060208201905081810360008301526151e0816151a4565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b600061521d601983613b73565b9150615228826151e7565b602082019050919050565b6000602082019050818103600083015261524c81615210565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b60006152af602583613b73565b91506152ba82615253565b604082019050919050565b600060208201905081810360008301526152de816152a2565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000615341602483613b73565b915061534c826152e5565b604082019050919050565b6000602082019050818103600083015261537081615334565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b60006153ad601f83613b73565b91506153b882615377565b602082019050919050565b600060208201905081810360008301526153dc816153a0565b9050919050565b6000819050919050565b6153fe6153f982613c1a565b6153e3565b82525050565b600061541082856153ed565b60208201915061542082846153ed565b6020820191508190509392505050565b600061543b82613c1a565b915061544683613c1a565b9250826154565761545561464f565b5b828206905092915050565b600061546d82866153ed565b60208201915061547d82856153ed565b60208201915061548d82846153ed565b602082019150819050949350505050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006154d4601983613b73565b91506154df8261549e565b602082019050919050565b60006020820190508181036000830152615503816154c7565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000615566603283613b73565b91506155718261550a565b604082019050919050565b6000602082019050818103600083015261559581615559565b9050919050565b7f455243373231456e756d657261626c653a20636f6e736563757469766520747260008201527f616e7366657273206e6f7420737570706f727465640000000000000000000000602082015250565b60006155f8603583613b73565b91506156038261559c565b604082019050919050565b60006020820190508181036000830152615627816155eb565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006156558261562e565b61565f8185615639565b935061566f818560208601613b84565b61567881613bae565b840191505092915050565b60006080820190506156986000830187613c7d565b6156a56020830186613c7d565b6156b26040830185613d23565b81810360608301526156c4818461564a565b905095945050505050565b6000815190506156de816139f7565b92915050565b6000602082840312156156fa576156f96139c1565b5b6000615708848285016156cf565b91505092915050565b600061571c82613c1a565b915061572783613c1a565b925082820390508181111561573f5761573e6145de565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b60006157aa602083613b73565b91506157b582615774565b602082019050919050565b600060208201905081810360008301526157d98161579d565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000615816601c83613b73565b9150615821826157e0565b602082019050919050565b6000602082019050818103600083015261584581615809565b905091905056fea264697066735822122015b9b9d7a4be659ae8715075e9ddc4622e1d9583f545a60198f981ecb067ac5064736f6c63430008110033697066733a2f2f516d515a38426e437a627871394c4d6f336343333932536478513938316654415369436e686454487139375550502f
Deployed ByteCode Sourcemap
73737:7916:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;80575:213;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;80400:167;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51428:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52940:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52458:416;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74075:106;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68361:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74602:75;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;79141:175;;;;;;;;;;;;;:::i;:::-;;53640:335;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39599:442;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;74684:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68029:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73821:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75295:89;;;;;;;;;;;;;:::i;:::-;;75960:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;78565:568;;;;;;;;;;;;;:::i;:::-;;54046:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74293:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68551:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73962:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;78455:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74188:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51138:223;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50869:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23800:103;;;;;;;;;;;;;:::i;:::-;;73998:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23152:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74494:99;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73923:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51597:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73869:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76440:1246;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53183:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54302:322;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76308:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76088:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;80796:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;80842:649;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75777:175;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74391:96;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75392:377;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;81499:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76188:112;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74037:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53409:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74786:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24058:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;80575:213;80715:4;80744:36;80768:11;80744:23;:36::i;:::-;80737:43;;80575:213;;;:::o;80400:167::-;23038:13;:11;:13::i;:::-;80517:42:::1;80536:8;80546:12;80517:18;:42::i;:::-;80400:167:::0;;:::o;51428:100::-;51482:13;51515:5;51508:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51428:100;:::o;52940:171::-;53016:7;53036:23;53051:7;53036:14;:23::i;:::-;53079:15;:24;53095:7;53079:24;;;;;;;;;;;;;;;;;;;;;53072:31;;52940:171;;;:::o;52458:416::-;52539:13;52555:23;52570:7;52555:14;:23::i;:::-;52539:39;;52603:5;52597:11;;:2;:11;;;52589:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;52697:5;52681:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;52706:37;52723:5;52730:12;:10;:12::i;:::-;52706:16;:37::i;:::-;52681:62;52659:173;;;;;;;;;;;;:::i;:::-;;;;;;;;;52845:21;52854:2;52858:7;52845:8;:21::i;:::-;52528:346;52458:416;;:::o;74075:106::-;;;;;;;;;;;;;:::o;68361:113::-;68422:7;68449:10;:17;;;;68442:24;;68361:113;:::o;74602:75::-;;;;;;;;;;;;;:::o;79141:175::-;23038:13;:11;:13::i;:::-;79198:15:::1;79216:8;;;;;;;;;;;:18;;;79243:4;79216:33;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;79198:51;;79260:8;;;;;;;;;;;:17;;;79278:20;;;;;;;;;;;79300:7;79260:48;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;79187:129;79141:175::o:0;53640:335::-;53835:41;53854:12;:10;:12::i;:::-;53868:7;53835:18;:41::i;:::-;53827:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;53939:28;53949:4;53955:2;53959:7;53939:9;:28::i;:::-;53640:335;;;:::o;39599:442::-;39696:7;39705;39725:26;39754:17;:27;39772:8;39754:27;;;;;;;;;;;39725:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39826:1;39798:30;;:7;:16;;;:30;;;39794:92;;39855:19;39845:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39794:92;39898:21;39963:17;:15;:17::i;:::-;39922:58;;39936:7;:23;;;39923:36;;:10;:36;;;;:::i;:::-;39922:58;;;;:::i;:::-;39898:82;;40001:7;:16;;;40019:13;39993:40;;;;;;39599:442;;;;;:::o;74684:95::-;;;;;;;;;;;;;:::o;68029:256::-;68126:7;68162:23;68179:5;68162:16;:23::i;:::-;68154:5;:31;68146:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;68251:12;:19;68264:5;68251:19;;;;;;;;;;;;;;;:26;68271:5;68251:26;;;;;;;;;;;;68244:33;;68029:256;;;;:::o;73821:41::-;73858:4;73821:41;:::o;75295:89::-;23038:13;:11;:13::i;:::-;75364:12:::1;;;;;;;;;;;75363:13;75348:12;;:28;;;;;;;;;;;;;;;;;;75295:89::o:0;75960:120::-;23038:13;:11;:13::i;:::-;76059::::1;76044:12;;:28;;;;;;;;;;;;;;;;;;75960:120:::0;:::o;78565:568::-;23038:13;:11;:13::i;:::-;78613:15:::1;78631:21;78613:39;;78663:24;78707:3;78701:2;78691:7;:12;;;;:::i;:::-;78690:20;;;;:::i;:::-;78663:47;;78721:25;78766:3;78760:2;78750:7;:12;;;;:::i;:::-;78749:20;;;;:::i;:::-;78721:48;;78780:19;78818:3;78813:1;78803:7;:11;;;;:::i;:::-;78802:19;;;;:::i;:::-;78780:41;;78832:26;78877:3;78872:1;78862:7;:11;;;;:::i;:::-;78861:19;;;;:::i;:::-;78832:48;;78893:20;;;;;;;;;;;:29;;:47;78923:16;78893:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;78951:12;;;;;;;;;;;:21;;:40;78973:17;78951:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;79002:5;;;;;;;;;;;:14;;:27;79017:11;79002:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;79040:10;;;;;;;;;;;:19;;:32;79060:11;79040:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;79083:13;;;;;;;;;;;:22;;:42;79106:18;79083:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;78602:531;;;;;78565:568::o:0;54046:185::-;54184:39;54201:4;54207:2;54211:7;54184:39;;;;;;;;;;;;:16;:39::i;:::-;54046:185;;;:::o;74293:91::-;;;;;;;;;;;;;:::o;68551:233::-;68626:7;68662:30;:28;:30::i;:::-;68654:5;:38;68646:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;68759:10;68770:5;68759:17;;;;;;;;:::i;:::-;;;;;;;;;;68752:24;;68551:233;;;:::o;73962:29::-;;;;:::o;78455:102::-;23038:13;:11;:13::i;:::-;78542:7:::1;78526:13;:23;;;;;;:::i;:::-;;78455:102:::0;:::o;74188:98::-;;;;;;;;;;;;;:::o;51138:223::-;51210:7;51230:13;51246:17;51255:7;51246:8;:17::i;:::-;51230:33;;51299:1;51282:19;;:5;:19;;;51274:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;51348:5;51341:12;;;51138:223;;;:::o;50869:207::-;50941:7;50986:1;50969:19;;:5;:19;;;50961:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;51052:9;:16;51062:5;51052:16;;;;;;;;;;;;;;;;51045:23;;50869:207;;;:::o;23800:103::-;23038:13;:11;:13::i;:::-;23865:30:::1;23892:1;23865:18;:30::i;:::-;23800:103::o:0;73998:32::-;;;;:::o;23152:87::-;23198:7;23225:6;;;;;;;;;;;23218:13;;23152:87;:::o;74494:99::-;;;;;;;;;;;;;:::o;73923:32::-;;;;:::o;51597:104::-;51653:13;51686:7;51679:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51597:104;:::o;73869:45::-;73911:3;73869:45;:::o;76440:1246::-;2345:21;:19;:21::i;:::-;76520:12:::1;;;;;;;;;;;76512:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;73858:4;76599:9;76583:13;:11;:13::i;:::-;:25;;;;:::i;:::-;:39;;76575:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;76676:1;76664:9;:13;76656:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;76781:13;76797:32;76818:10;76797:20;:32::i;:::-;76781:48;;76840:20;76863:25;:23;:25::i;:::-;76840:48;;76955:1;76931:26;;:12;:26;;::::0;76927:591:::1;;77035:5;77023:9;:17;;;;:::i;:::-;77010:9;:30;77002:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;76927:591;;;77173:1;77160:9;:14;77134:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;77292:8;;;;;;;;;;;:21;;;77336:10;77377:4;77417:5;77405:9;:17;;;;:::i;:::-;77292:149;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;77266:240;;;;;;;;;;;;:::i;:::-;;;;;;;;;76927:591;77535:9;77530:149;77554:9;77550:1;:13;77530:149;;;77585:18;77606:13;:11;:13::i;:::-;77585:34;;77634:33;77644:10;77656;77634:9;:33::i;:::-;77570:109;77565:3;;;;;:::i;:::-;;;;77530:149;;;;76501:1185;;2389:20:::0;:18;:20::i;:::-;76440:1246;:::o;53183:155::-;53278:52;53297:12;:10;:12::i;:::-;53311:8;53321;53278:18;:52::i;:::-;53183:155;;:::o;54302:322::-;54476:41;54495:12;:10;:12::i;:::-;54509:7;54476:18;:41::i;:::-;54468:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;54578:38;54592:4;54598:2;54602:7;54611:4;54578:13;:38::i;:::-;54302:322;;;;:::o;76308:124::-;23038:13;:11;:13::i;:::-;76410:14:::1;76394:13;;:30;;;;;;;;;;;;;;;;;;76308:124:::0;:::o;76088:92::-;23038:13;:11;:13::i;:::-;76166:6:::1;76158:5;;:14;;;;;;;;;;;;;;;;;;76088:92:::0;:::o;80796:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;80842:649::-;80960:13;81013:16;81021:7;81013;:16::i;:::-;80991:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;81117:28;81148:10;:8;:10::i;:::-;81117:41;;81220:1;81195:14;81189:28;:32;:294;;;;;;;;;;;;;;;;;81313:14;81354:25;81371:7;81354:16;:25::i;:::-;81406:13;81270:172;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;81189:294;81169:314;;;80842:649;;;:::o;75777:175::-;23038:13;:11;:13::i;:::-;75923:21:::1;75900:20;;:44;;;;;;;;;;;;;;;;;;75777:175:::0;:::o;74391:96::-;;;;;;;;;;;;;:::o;75392:377::-;23038:13;:11;:13::i;:::-;75608:18:::1;75588:17;:38;;;;75654:15;75637:14;:32;;;;75700:18;75680:17;:38;;;;75746:15;75729:14;:32;;;;75392:377:::0;;;;:::o;81499:151::-;23038:13;:11;:13::i;:::-;81625:17:::1;81609:13;:33;;;;;;:::i;:::-;;81499:151:::0;:::o;76188:112::-;23038:13;:11;:13::i;:::-;76281:11:::1;76268:10;;:24;;;;;;;;;;;;;;;;;;76188:112:::0;:::o;74037:29::-;;;;:::o;53409:164::-;53506:4;53530:18;:25;53549:5;53530:25;;;;;;;;;;;;;;;:35;53556:8;53530:35;;;;;;;;;;;;;;;;;;;;;;;;;53523:42;;53409:164;;;;:::o;74786:32::-;;;;;;;;;;;;;:::o;24058:201::-;23038:13;:11;:13::i;:::-;24167:1:::1;24147:22;;:8;:22;;::::0;24139:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;24223:28;24242:8;24223:18;:28::i;:::-;24058:201:::0;:::o;39329:215::-;39431:4;39470:26;39455:41;;;:11;:41;;;;:81;;;;39500:36;39524:11;39500:23;:36::i;:::-;39455:81;39448:88;;39329:215;;;:::o;23317:132::-;23392:12;:10;:12::i;:::-;23381:23;;:7;:5;:7::i;:::-;:23;;;23373:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;23317:132::o;40691:332::-;40810:17;:15;:17::i;:::-;40794:33;;:12;:33;;;;40786:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;40913:1;40893:22;;:8;:22;;;40885:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;40980:35;;;;;;;;40992:8;40980:35;;;;;;41002:12;40980:35;;;;;40958:19;:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40691:332;;:::o;62759:135::-;62841:16;62849:7;62841;:16::i;:::-;62833:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;62759:135;:::o;21703:98::-;21756:7;21783:10;21776:17;;21703:98;:::o;62038:174::-;62140:2;62113:15;:24;62129:7;62113:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;62196:7;62192:2;62158:46;;62167:23;62182:7;62167:14;:23::i;:::-;62158:46;;;;;;;;;;;;62038:174;;:::o;56657:264::-;56750:4;56767:13;56783:23;56798:7;56783:14;:23::i;:::-;56767:39;;56836:5;56825:16;;:7;:16;;;:52;;;;56845:32;56862:5;56869:7;56845:16;:32::i;:::-;56825:52;:87;;;;56905:7;56881:31;;:20;56893:7;56881:11;:20::i;:::-;:31;;;56825:87;56817:96;;;56657:264;;;;:::o;60656:1263::-;60815:4;60788:31;;:23;60803:7;60788:14;:23::i;:::-;:31;;;60780:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;60894:1;60880:16;;:2;:16;;;60872:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;60950:42;60971:4;60977:2;60981:7;60990:1;60950:20;:42::i;:::-;61122:4;61095:31;;:23;61110:7;61095:14;:23::i;:::-;:31;;;61087:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;61240:15;:24;61256:7;61240:24;;;;;;;;;;;;61233:31;;;;;;;;;;;61735:1;61716:9;:15;61726:4;61716:15;;;;;;;;;;;;;;;;:20;;;;;;;;;;;61768:1;61751:9;:13;61761:2;61751:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;61810:2;61791:7;:16;61799:7;61791:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;61849:7;61845:2;61830:27;;61839:4;61830:27;;;;;;;;;;;;61870:41;61890:4;61896:2;61900:7;61909:1;61870:19;:41::i;:::-;60656:1263;;;:::o;40323:97::-;40381:6;40407:5;40400:12;;40323:97;:::o;55932:117::-;55998:7;56025;:16;56033:7;56025:16;;;;;;;;;;;;;;;;;;;;;56018:23;;55932:117;;;:::o;24419:191::-;24493:16;24512:6;;;;;;;;;;;24493:25;;24538:8;24529:6;;:17;;;;;;;;;;;;;;;;;;24593:8;24562:40;;24583:8;24562:40;;;;;;;;;;;;24482:128;24419:191;:::o;2425:293::-;1827:1;2559:7;;:19;2551:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1827:1;2692:7;:18;;;;2425:293::o;79324:602::-;79418:7;79443:15;79497:1;79461:17;;;;;;;;;;;:27;;;79489:4;79461:33;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:37;79443:55;;73911:3;79529:13;:11;:13::i;:::-;:31;:142;;;;73911:3;79595:1;:19;;;;:::i;:::-;79578:13;:11;:13::i;:::-;:36;;:92;;;;;73911:3;79651:1;:19;;;;:::i;:::-;79635:13;:11;:13::i;:::-;:35;79578:92;79529:142;79511:408;;;79739:10;:47;;79772:14;;79739:47;;;79752:17;;79739:47;79732:54;;;;;79511:408;79860:10;:47;;79893:14;;79860:47;;;79873:17;;79860:47;79853:54;;;79324:602;;;;:::o;79934:458::-;79992:7;73911:3;80030:13;:11;:13::i;:::-;:31;:142;;;;73911:3;80096:1;:19;;;;:::i;:::-;80079:13;:11;:13::i;:::-;:36;;:92;;;;;73911:3;80152:1;:19;;;;:::i;:::-;80136:13;:11;:13::i;:::-;:35;80079:92;80030:142;80012:373;;;80248:1;80233:17;;;;80012:373;80364:8;;;;;;;;;;;80349:24;;79934:458;;:::o;77694:639::-;77740:7;77760:16;73858:4;77828:16;77846:15;77811:51;;;;;;;;;:::i;:::-;;;;;;;;;;;;;77801:62;;;;;;77779:95;;:108;;;;:::i;:::-;77760:127;;77898:398;77905:21;77924:1;77913:8;:12;;;;:::i;:::-;77905:7;:21::i;:::-;77898:398;;;73858:4;78084:16;78131:15;78177:8;78037:175;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;78001:234;;;;;;77971:283;;:313;;;;:::i;:::-;77943:341;;77898:398;;;78324:1;78313:8;:12;;;;:::i;:::-;78306:19;;;77694:639;:::o;57263:110::-;57339:26;57349:2;57353:7;57339:26;;;;;;;;;;;;:9;:26::i;:::-;57263:110;;:::o;2726:213::-;1783:1;2909:7;:22;;;;2726:213::o;62355:315::-;62510:8;62501:17;;:5;:17;;;62493:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;62597:8;62559:18;:25;62578:5;62559:25;;;;;;;;;;;;;;;:35;62585:8;62559:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;62643:8;62621:41;;62636:5;62621:41;;;62653:8;62621:41;;;;;;:::i;:::-;;;;;;;;62355:315;;;:::o;55505:313::-;55661:28;55671:4;55677:2;55681:7;55661:9;:28::i;:::-;55708:47;55731:4;55737:2;55741:7;55750:4;55708:22;:47::i;:::-;55700:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;55505:313;;;;:::o;56362:128::-;56427:4;56480:1;56451:31;;:17;56460:7;56451:8;:17::i;:::-;:31;;;;56444:38;;56362:128;;;:::o;78341:106::-;78393:13;78426;78419:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;78341:106;:::o;19130:716::-;19186:13;19237:14;19274:1;19254:17;19265:5;19254:10;:17::i;:::-;:21;19237:38;;19290:20;19324:6;19313:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19290:41;;19346:11;19475:6;19471:2;19467:15;19459:6;19455:28;19448:35;;19512:288;19519:4;19512:288;;;19544:5;;;;;;;;19686:8;19681:2;19674:5;19670:14;19665:30;19660:3;19652:44;19742:2;19733:11;;;;;;:::i;:::-;;;;;19776:1;19767:5;:10;19512:288;19763:21;19512:288;19821:6;19814:13;;;;;19130:716;;;:::o;67721:224::-;67823:4;67862:35;67847:50;;;:11;:50;;;;:90;;;;67901:36;67925:11;67901:23;:36::i;:::-;67847:90;67840:97;;67721:224;;;:::o;68858:915::-;69035:61;69062:4;69068:2;69072:12;69086:9;69035:26;:61::i;:::-;69125:1;69113:9;:13;69109:222;;;69256:63;;;;;;;;;;:::i;:::-;;;;;;;;69109:222;69343:15;69361:12;69343:30;;69406:1;69390:18;;:4;:18;;;69386:187;;69425:40;69457:7;69425:31;:40::i;:::-;69386:187;;;69495:2;69487:10;;:4;:10;;;69483:90;;69514:47;69547:4;69553:7;69514:32;:47::i;:::-;69483:90;69386:187;69601:1;69587:16;;:2;:16;;;69583:183;;69620:45;69657:7;69620:36;:45::i;:::-;69583:183;;;69693:4;69687:10;;:2;:10;;;69683:83;;69714:40;69742:2;69746:7;69714:27;:40::i;:::-;69683:83;69583:183;69024:749;68858:915;;;;:::o;65924:158::-;;;;;:::o;57600:319::-;57729:18;57735:2;57739:7;57729:5;:18::i;:::-;57780:53;57811:1;57815:2;57819:7;57828:4;57780:22;:53::i;:::-;57758:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;57600:319;;;:::o;63458:853::-;63612:4;63633:15;:2;:13;;;:15::i;:::-;63629:675;;;63685:2;63669:36;;;63706:12;:10;:12::i;:::-;63720:4;63726:7;63735:4;63669:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;63665:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63927:1;63910:6;:13;:18;63906:328;;63953:60;;;;;;;;;;:::i;:::-;;;;;;;;63906:328;64184:6;64178:13;64169:6;64165:2;64161:15;64154:38;63665:584;63801:41;;;63791:51;;;:6;:51;;;;63784:58;;;;;63629:675;64288:4;64281:11;;63458:853;;;;;;;:::o;15996:922::-;16049:7;16069:14;16086:1;16069:18;;16136:6;16127:5;:15;16123:102;;16172:6;16163:15;;;;;;:::i;:::-;;;;;16207:2;16197:12;;;;16123:102;16252:6;16243:5;:15;16239:102;;16288:6;16279:15;;;;;;:::i;:::-;;;;;16323:2;16313:12;;;;16239:102;16368:6;16359:5;:15;16355:102;;16404:6;16395:15;;;;;;:::i;:::-;;;;;16439:2;16429:12;;;;16355:102;16484:5;16475;:14;16471:99;;16519:5;16510:14;;;;;;:::i;:::-;;;;;16553:1;16543:11;;;;16471:99;16597:5;16588;:14;16584:99;;16632:5;16623:14;;;;;;:::i;:::-;;;;;16666:1;16656:11;;;;16584:99;16710:5;16701;:14;16697:99;;16745:5;16736:14;;;;;;:::i;:::-;;;;;16779:1;16769:11;;;;16697:99;16823:5;16814;:14;16810:66;;16859:1;16849:11;;;;16810:66;16904:6;16897:13;;;15996:922;;;:::o;50500:305::-;50602:4;50654:25;50639:40;;;:11;:40;;;;:105;;;;50711:33;50696:48;;;:11;:48;;;;50639:105;:158;;;;50761:36;50785:11;50761:23;:36::i;:::-;50639:158;50619:178;;50500:305;;;:::o;65043:159::-;;;;;:::o;70496:164::-;70600:10;:17;;;;70573:15;:24;70589:7;70573:24;;;;;;;;;;;:44;;;;70628:10;70644:7;70628:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70496:164;:::o;71287:988::-;71553:22;71603:1;71578:22;71595:4;71578:16;:22::i;:::-;:26;;;;:::i;:::-;71553:51;;71615:18;71636:17;:26;71654:7;71636:26;;;;;;;;;;;;71615:47;;71783:14;71769:10;:28;71765:328;;71814:19;71836:12;:18;71849:4;71836:18;;;;;;;;;;;;;;;:34;71855:14;71836:34;;;;;;;;;;;;71814:56;;71920:11;71887:12;:18;71900:4;71887:18;;;;;;;;;;;;;;;:30;71906:10;71887:30;;;;;;;;;;;:44;;;;72037:10;72004:17;:30;72022:11;72004:30;;;;;;;;;;;:43;;;;71799:294;71765:328;72189:17;:26;72207:7;72189:26;;;;;;;;;;;72182:33;;;72233:12;:18;72246:4;72233:18;;;;;;;;;;;;;;;:34;72252:14;72233:34;;;;;;;;;;;72226:41;;;71368:907;;71287:988;;:::o;72570:1079::-;72823:22;72868:1;72848:10;:17;;;;:21;;;;:::i;:::-;72823:46;;72880:18;72901:15;:24;72917:7;72901:24;;;;;;;;;;;;72880:45;;73252:19;73274:10;73285:14;73274:26;;;;;;;;:::i;:::-;;;;;;;;;;73252:48;;73338:11;73313:10;73324;73313:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;73449:10;73418:15;:28;73434:11;73418:28;;;;;;;;;;;:41;;;;73590:15;:24;73606:7;73590:24;;;;;;;;;;;73583:31;;;73625:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;72641:1008;;;72570:1079;:::o;70074:221::-;70159:14;70176:20;70193:2;70176:16;:20::i;:::-;70159:37;;70234:7;70207:12;:16;70220:2;70207:16;;;;;;;;;;;;;;;:24;70224:6;70207:24;;;;;;;;;;;:34;;;;70281:6;70252:17;:26;70270:7;70252:26;;;;;;;;;;;:35;;;;70148:147;70074:221;;:::o;58255:942::-;58349:1;58335:16;;:2;:16;;;58327:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;58408:16;58416:7;58408;:16::i;:::-;58407:17;58399:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;58470:48;58499:1;58503:2;58507:7;58516:1;58470:20;:48::i;:::-;58617:16;58625:7;58617;:16::i;:::-;58616:17;58608:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;59032:1;59015:9;:13;59025:2;59015:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;59076:2;59057:7;:16;59065:7;59057:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;59121:7;59117:2;59096:33;;59113:1;59096:33;;;;;;;;;;;;59142:47;59170:1;59174:2;59178:7;59187:1;59142:19;:47::i;:::-;58255:942;;:::o;25850:326::-;25910:4;26167:1;26145:7;:19;;;:23;26138:30;;25850:326;;;:::o;37779:157::-;37864:4;37903:25;37888:40;;;:11;:40;;;;37881:47;;37779:157;;;:::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:126::-;1555:7;1595:42;1588:5;1584:54;1573:65;;1518:126;;;:::o;1650:96::-;1687:7;1716:24;1734:5;1716:24;:::i;:::-;1705:35;;1650:96;;;:::o;1752:122::-;1825:24;1843:5;1825:24;:::i;:::-;1818:5;1815:35;1805:63;;1864:1;1861;1854:12;1805:63;1752:122;:::o;1880:139::-;1926:5;1964:6;1951:20;1942:29;;1980:33;2007:5;1980:33;:::i;:::-;1880:139;;;;:::o;2025:109::-;2061:7;2101:26;2094:5;2090:38;2079:49;;2025:109;;;:::o;2140:120::-;2212:23;2229:5;2212:23;:::i;:::-;2205:5;2202:34;2192:62;;2250:1;2247;2240:12;2192:62;2140:120;:::o;2266:137::-;2311:5;2349:6;2336:20;2327:29;;2365:32;2391:5;2365:32;:::i;:::-;2266:137;;;;:::o;2409:472::-;2476:6;2484;2533:2;2521:9;2512:7;2508:23;2504:32;2501:119;;;2539:79;;:::i;:::-;2501:119;2659:1;2684:53;2729:7;2720:6;2709:9;2705:22;2684:53;:::i;:::-;2674:63;;2630:117;2786:2;2812:52;2856:7;2847:6;2836:9;2832:22;2812:52;:::i;:::-;2802:62;;2757:117;2409:472;;;;;:::o;2887:99::-;2939:6;2973:5;2967:12;2957:22;;2887:99;;;:::o;2992:169::-;3076:11;3110:6;3105:3;3098:19;3150:4;3145:3;3141:14;3126:29;;2992:169;;;;:::o;3167:246::-;3248:1;3258:113;3272:6;3269:1;3266:13;3258:113;;;3357:1;3352:3;3348:11;3342:18;3338:1;3333:3;3329:11;3322:39;3294:2;3291:1;3287:10;3282:15;;3258:113;;;3405:1;3396:6;3391:3;3387:16;3380:27;3229:184;3167:246;;;:::o;3419:102::-;3460:6;3511:2;3507:7;3502:2;3495:5;3491:14;3487:28;3477:38;;3419:102;;;:::o;3527:377::-;3615:3;3643:39;3676:5;3643:39;:::i;:::-;3698:71;3762:6;3757:3;3698:71;:::i;:::-;3691:78;;3778:65;3836:6;3831:3;3824:4;3817:5;3813:16;3778:65;:::i;:::-;3868:29;3890:6;3868:29;:::i;:::-;3863:3;3859:39;3852:46;;3619:285;3527:377;;;;:::o;3910:313::-;4023:4;4061:2;4050:9;4046:18;4038:26;;4110:9;4104:4;4100:20;4096:1;4085:9;4081:17;4074:47;4138:78;4211:4;4202:6;4138:78;:::i;:::-;4130:86;;3910:313;;;;:::o;4229:77::-;4266:7;4295:5;4284:16;;4229:77;;;:::o;4312:122::-;4385:24;4403:5;4385:24;:::i;:::-;4378:5;4375:35;4365:63;;4424:1;4421;4414:12;4365:63;4312:122;:::o;4440:139::-;4486:5;4524:6;4511:20;4502:29;;4540:33;4567:5;4540:33;:::i;:::-;4440:139;;;;:::o;4585:329::-;4644:6;4693:2;4681:9;4672:7;4668:23;4664:32;4661:119;;;4699:79;;:::i;:::-;4661:119;4819:1;4844:53;4889:7;4880:6;4869:9;4865:22;4844:53;:::i;:::-;4834:63;;4790:117;4585:329;;;;:::o;4920:118::-;5007:24;5025:5;5007:24;:::i;:::-;5002:3;4995:37;4920:118;;:::o;5044:222::-;5137:4;5175:2;5164:9;5160:18;5152:26;;5188:71;5256:1;5245:9;5241:17;5232:6;5188:71;:::i;:::-;5044:222;;;;:::o;5272:474::-;5340:6;5348;5397:2;5385:9;5376:7;5372:23;5368:32;5365:119;;;5403:79;;:::i;:::-;5365:119;5523:1;5548:53;5593:7;5584:6;5573:9;5569:22;5548:53;:::i;:::-;5538:63;;5494:117;5650:2;5676:53;5721:7;5712:6;5701:9;5697:22;5676:53;:::i;:::-;5666:63;;5621:118;5272:474;;;;;:::o;5752:104::-;5797:7;5826:24;5844:5;5826:24;:::i;:::-;5815:35;;5752:104;;;:::o;5862:142::-;5965:32;5991:5;5965:32;:::i;:::-;5960:3;5953:45;5862:142;;:::o;6010:254::-;6119:4;6157:2;6146:9;6142:18;6134:26;;6170:87;6254:1;6243:9;6239:17;6230:6;6170:87;:::i;:::-;6010:254;;;;:::o;6270:118::-;6357:24;6375:5;6357:24;:::i;:::-;6352:3;6345:37;6270:118;;:::o;6394:222::-;6487:4;6525:2;6514:9;6510:18;6502:26;;6538:71;6606:1;6595:9;6591:17;6582:6;6538:71;:::i;:::-;6394:222;;;;:::o;6622:60::-;6650:3;6671:5;6664:12;;6622:60;;;:::o;6688:142::-;6738:9;6771:53;6789:34;6798:24;6816:5;6798:24;:::i;:::-;6789:34;:::i;:::-;6771:53;:::i;:::-;6758:66;;6688:142;;;:::o;6836:126::-;6886:9;6919:37;6950:5;6919:37;:::i;:::-;6906:50;;6836:126;;;:::o;6968:140::-;7032:9;7065:37;7096:5;7065:37;:::i;:::-;7052:50;;6968:140;;;:::o;7114:159::-;7215:51;7260:5;7215:51;:::i;:::-;7210:3;7203:64;7114:159;;:::o;7279:250::-;7386:4;7424:2;7413:9;7409:18;7401:26;;7437:85;7519:1;7508:9;7504:17;7495:6;7437:85;:::i;:::-;7279:250;;;;:::o;7535:619::-;7612:6;7620;7628;7677:2;7665:9;7656:7;7652:23;7648:32;7645:119;;;7683:79;;:::i;:::-;7645:119;7803:1;7828:53;7873:7;7864:6;7853:9;7849:22;7828:53;:::i;:::-;7818:63;;7774:117;7930:2;7956:53;8001:7;7992:6;7981:9;7977:22;7956:53;:::i;:::-;7946:63;;7901:118;8058:2;8084:53;8129:7;8120:6;8109:9;8105:22;8084:53;:::i;:::-;8074:63;;8029:118;7535:619;;;;;:::o;8160:474::-;8228:6;8236;8285:2;8273:9;8264:7;8260:23;8256:32;8253:119;;;8291:79;;:::i;:::-;8253:119;8411:1;8436:53;8481:7;8472:6;8461:9;8457:22;8436:53;:::i;:::-;8426:63;;8382:117;8538:2;8564:53;8609:7;8600:6;8589:9;8585:22;8564:53;:::i;:::-;8554:63;;8509:118;8160:474;;;;;:::o;8640:332::-;8761:4;8799:2;8788:9;8784:18;8776:26;;8812:71;8880:1;8869:9;8865:17;8856:6;8812:71;:::i;:::-;8893:72;8961:2;8950:9;8946:18;8937:6;8893:72;:::i;:::-;8640:332;;;;;:::o;8978:142::-;9044:9;9077:37;9108:5;9077:37;:::i;:::-;9064:50;;8978:142;;;:::o;9126:163::-;9229:53;9276:5;9229:53;:::i;:::-;9224:3;9217:66;9126:163;;:::o;9295:254::-;9404:4;9442:2;9431:9;9427:18;9419:26;;9455:87;9539:1;9528:9;9524:17;9515:6;9455:87;:::i;:::-;9295:254;;;;:::o;9555:138::-;9636:32;9662:5;9636:32;:::i;:::-;9629:5;9626:43;9616:71;;9683:1;9680;9673:12;9616:71;9555:138;:::o;9699:155::-;9753:5;9791:6;9778:20;9769:29;;9807:41;9842:5;9807:41;:::i;:::-;9699:155;;;;:::o;9860:345::-;9927:6;9976:2;9964:9;9955:7;9951:23;9947:32;9944:119;;;9982:79;;:::i;:::-;9944:119;10102:1;10127:61;10180:7;10171:6;10160:9;10156:22;10127:61;:::i;:::-;10117:71;;10073:125;9860:345;;;;:::o;10211:117::-;10320:1;10317;10310:12;10334:117;10443:1;10440;10433:12;10457:180;10505:77;10502:1;10495:88;10602:4;10599:1;10592:15;10626:4;10623:1;10616:15;10643:281;10726:27;10748:4;10726:27;:::i;:::-;10718:6;10714:40;10856:6;10844:10;10841:22;10820:18;10808:10;10805:34;10802:62;10799:88;;;10867:18;;:::i;:::-;10799:88;10907:10;10903:2;10896:22;10686:238;10643:281;;:::o;10930:129::-;10964:6;10991:20;;:::i;:::-;10981:30;;11020:33;11048:4;11040:6;11020:33;:::i;:::-;10930:129;;;:::o;11065:308::-;11127:4;11217:18;11209:6;11206:30;11203:56;;;11239:18;;:::i;:::-;11203:56;11277:29;11299:6;11277:29;:::i;:::-;11269:37;;11361:4;11355;11351:15;11343:23;;11065:308;;;:::o;11379:146::-;11476:6;11471:3;11466;11453:30;11517:1;11508:6;11503:3;11499:16;11492:27;11379:146;;;:::o;11531:425::-;11609:5;11634:66;11650:49;11692:6;11650:49;:::i;:::-;11634:66;:::i;:::-;11625:75;;11723:6;11716:5;11709:21;11761:4;11754:5;11750:16;11799:3;11790:6;11785:3;11781:16;11778:25;11775:112;;;11806:79;;:::i;:::-;11775:112;11896:54;11943:6;11938:3;11933;11896:54;:::i;:::-;11615:341;11531:425;;;;;:::o;11976:340::-;12032:5;12081:3;12074:4;12066:6;12062:17;12058:27;12048:122;;12089:79;;:::i;:::-;12048:122;12206:6;12193:20;12231:79;12306:3;12298:6;12291:4;12283:6;12279:17;12231:79;:::i;:::-;12222:88;;12038:278;11976:340;;;;:::o;12322:509::-;12391:6;12440:2;12428:9;12419:7;12415:23;12411:32;12408:119;;;12446:79;;:::i;:::-;12408:119;12594:1;12583:9;12579:17;12566:31;12624:18;12616:6;12613:30;12610:117;;;12646:79;;:::i;:::-;12610:117;12751:63;12806:7;12797:6;12786:9;12782:22;12751:63;:::i;:::-;12741:73;;12537:287;12322:509;;;;:::o;12837:329::-;12896:6;12945:2;12933:9;12924:7;12920:23;12916:32;12913:119;;;12951:79;;:::i;:::-;12913:119;13071:1;13096:53;13141:7;13132:6;13121:9;13117:22;13096:53;:::i;:::-;13086:63;;13042:117;12837:329;;;;:::o;13172:116::-;13242:21;13257:5;13242:21;:::i;:::-;13235:5;13232:32;13222:60;;13278:1;13275;13268:12;13222:60;13172:116;:::o;13294:133::-;13337:5;13375:6;13362:20;13353:29;;13391:30;13415:5;13391:30;:::i;:::-;13294:133;;;;:::o;13433:468::-;13498:6;13506;13555:2;13543:9;13534:7;13530:23;13526:32;13523:119;;;13561:79;;:::i;:::-;13523:119;13681:1;13706:53;13751:7;13742:6;13731:9;13727:22;13706:53;:::i;:::-;13696:63;;13652:117;13808:2;13834:50;13876:7;13867:6;13856:9;13852:22;13834:50;:::i;:::-;13824:60;;13779:115;13433:468;;;;;:::o;13907:307::-;13968:4;14058:18;14050:6;14047:30;14044:56;;;14080:18;;:::i;:::-;14044:56;14118:29;14140:6;14118:29;:::i;:::-;14110:37;;14202:4;14196;14192:15;14184:23;;13907:307;;;:::o;14220:423::-;14297:5;14322:65;14338:48;14379:6;14338:48;:::i;:::-;14322:65;:::i;:::-;14313:74;;14410:6;14403:5;14396:21;14448:4;14441:5;14437:16;14486:3;14477:6;14472:3;14468:16;14465:25;14462:112;;;14493:79;;:::i;:::-;14462:112;14583:54;14630:6;14625:3;14620;14583:54;:::i;:::-;14303:340;14220:423;;;;;:::o;14662:338::-;14717:5;14766:3;14759:4;14751:6;14747:17;14743:27;14733:122;;14774:79;;:::i;:::-;14733:122;14891:6;14878:20;14916:78;14990:3;14982:6;14975:4;14967:6;14963:17;14916:78;:::i;:::-;14907:87;;14723:277;14662:338;;;;:::o;15006:943::-;15101:6;15109;15117;15125;15174:3;15162:9;15153:7;15149:23;15145:33;15142:120;;;15181:79;;:::i;:::-;15142:120;15301:1;15326:53;15371:7;15362:6;15351:9;15347:22;15326:53;:::i;:::-;15316:63;;15272:117;15428:2;15454:53;15499:7;15490:6;15479:9;15475:22;15454:53;:::i;:::-;15444:63;;15399:118;15556:2;15582:53;15627:7;15618:6;15607:9;15603:22;15582:53;:::i;:::-;15572:63;;15527:118;15712:2;15701:9;15697:18;15684:32;15743:18;15735:6;15732:30;15729:117;;;15765:79;;:::i;:::-;15729:117;15870:62;15924:7;15915:6;15904:9;15900:22;15870:62;:::i;:::-;15860:72;;15655:287;15006:943;;;;;;;:::o;15955:765::-;16041:6;16049;16057;16065;16114:3;16102:9;16093:7;16089:23;16085:33;16082:120;;;16121:79;;:::i;:::-;16082:120;16241:1;16266:53;16311:7;16302:6;16291:9;16287:22;16266:53;:::i;:::-;16256:63;;16212:117;16368:2;16394:53;16439:7;16430:6;16419:9;16415:22;16394:53;:::i;:::-;16384:63;;16339:118;16496:2;16522:53;16567:7;16558:6;16547:9;16543:22;16522:53;:::i;:::-;16512:63;;16467:118;16624:2;16650:53;16695:7;16686:6;16675:9;16671:22;16650:53;:::i;:::-;16640:63;;16595:118;15955:765;;;;;;;:::o;16726:474::-;16794:6;16802;16851:2;16839:9;16830:7;16826:23;16822:32;16819:119;;;16857:79;;:::i;:::-;16819:119;16977:1;17002:53;17047:7;17038:6;17027:9;17023:22;17002:53;:::i;:::-;16992:63;;16948:117;17104:2;17130:53;17175:7;17166:6;17155:9;17151:22;17130:53;:::i;:::-;17120:63;;17075:118;16726:474;;;;;:::o;17206:180::-;17254:77;17251:1;17244:88;17351:4;17348:1;17341:15;17375:4;17372:1;17365:15;17392:320;17436:6;17473:1;17467:4;17463:12;17453:22;;17520:1;17514:4;17510:12;17541:18;17531:81;;17597:4;17589:6;17585:17;17575:27;;17531:81;17659:2;17651:6;17648:14;17628:18;17625:38;17622:84;;17678:18;;:::i;:::-;17622:84;17443:269;17392:320;;;:::o;17718:220::-;17858:34;17854:1;17846:6;17842:14;17835:58;17927:3;17922:2;17914:6;17910:15;17903:28;17718:220;:::o;17944:366::-;18086:3;18107:67;18171:2;18166:3;18107:67;:::i;:::-;18100:74;;18183:93;18272:3;18183:93;:::i;:::-;18301:2;18296:3;18292:12;18285:19;;17944:366;;;:::o;18316:419::-;18482:4;18520:2;18509:9;18505:18;18497:26;;18569:9;18563:4;18559:20;18555:1;18544:9;18540:17;18533:47;18597:131;18723:4;18597:131;:::i;:::-;18589:139;;18316:419;;;:::o;18741:248::-;18881:34;18877:1;18869:6;18865:14;18858:58;18950:31;18945:2;18937:6;18933:15;18926:56;18741:248;:::o;18995:366::-;19137:3;19158:67;19222:2;19217:3;19158:67;:::i;:::-;19151:74;;19234:93;19323:3;19234:93;:::i;:::-;19352:2;19347:3;19343:12;19336:19;;18995:366;;;:::o;19367:419::-;19533:4;19571:2;19560:9;19556:18;19548:26;;19620:9;19614:4;19610:20;19606:1;19595:9;19591:17;19584:47;19648:131;19774:4;19648:131;:::i;:::-;19640:139;;19367:419;;;:::o;19792:143::-;19849:5;19880:6;19874:13;19865:22;;19896:33;19923:5;19896:33;:::i;:::-;19792:143;;;;:::o;19941:351::-;20011:6;20060:2;20048:9;20039:7;20035:23;20031:32;20028:119;;;20066:79;;:::i;:::-;20028:119;20186:1;20211:64;20267:7;20258:6;20247:9;20243:22;20211:64;:::i;:::-;20201:74;;20157:128;19941:351;;;;:::o;20298:134::-;20356:9;20389:37;20420:5;20389:37;:::i;:::-;20376:50;;20298:134;;;:::o;20438:147::-;20533:45;20572:5;20533:45;:::i;:::-;20528:3;20521:58;20438:147;;:::o;20591:348::-;20720:4;20758:2;20747:9;20743:18;20735:26;;20771:79;20847:1;20836:9;20832:17;20823:6;20771:79;:::i;:::-;20860:72;20928:2;20917:9;20913:18;20904:6;20860:72;:::i;:::-;20591:348;;;;;:::o;20945:137::-;20999:5;21030:6;21024:13;21015:22;;21046:30;21070:5;21046:30;:::i;:::-;20945:137;;;;:::o;21088:345::-;21155:6;21204:2;21192:9;21183:7;21179:23;21175:32;21172:119;;;21210:79;;:::i;:::-;21172:119;21330:1;21355:61;21408:7;21399:6;21388:9;21384:22;21355:61;:::i;:::-;21345:71;;21301:125;21088:345;;;;:::o;21439:232::-;21579:34;21575:1;21567:6;21563:14;21556:58;21648:15;21643:2;21635:6;21631:15;21624:40;21439:232;:::o;21677:366::-;21819:3;21840:67;21904:2;21899:3;21840:67;:::i;:::-;21833:74;;21916:93;22005:3;21916:93;:::i;:::-;22034:2;22029:3;22025:12;22018:19;;21677:366;;;:::o;22049:419::-;22215:4;22253:2;22242:9;22238:18;22230:26;;22302:9;22296:4;22292:20;22288:1;22277:9;22273:17;22266:47;22330:131;22456:4;22330:131;:::i;:::-;22322:139;;22049:419;;;:::o;22474:180::-;22522:77;22519:1;22512:88;22619:4;22616:1;22609:15;22643:4;22640:1;22633:15;22660:410;22700:7;22723:20;22741:1;22723:20;:::i;:::-;22718:25;;22757:20;22775:1;22757:20;:::i;:::-;22752:25;;22812:1;22809;22805:9;22834:30;22852:11;22834:30;:::i;:::-;22823:41;;23013:1;23004:7;23000:15;22997:1;22994:22;22974:1;22967:9;22947:83;22924:139;;23043:18;;:::i;:::-;22924:139;22708:362;22660:410;;;;:::o;23076:180::-;23124:77;23121:1;23114:88;23221:4;23218:1;23211:15;23245:4;23242:1;23235:15;23262:185;23302:1;23319:20;23337:1;23319:20;:::i;:::-;23314:25;;23353:20;23371:1;23353:20;:::i;:::-;23348:25;;23392:1;23382:35;;23397:18;;:::i;:::-;23382:35;23439:1;23436;23432:9;23427:14;;23262:185;;;;:::o;23453:230::-;23593:34;23589:1;23581:6;23577:14;23570:58;23662:13;23657:2;23649:6;23645:15;23638:38;23453:230;:::o;23689:366::-;23831:3;23852:67;23916:2;23911:3;23852:67;:::i;:::-;23845:74;;23928:93;24017:3;23928:93;:::i;:::-;24046:2;24041:3;24037:12;24030:19;;23689:366;;;:::o;24061:419::-;24227:4;24265:2;24254:9;24250:18;24242:26;;24314:9;24308:4;24304:20;24300:1;24289:9;24285:17;24278:47;24342:131;24468:4;24342:131;:::i;:::-;24334:139;;24061:419;;;:::o;24486:231::-;24626:34;24622:1;24614:6;24610:14;24603:58;24695:14;24690:2;24682:6;24678:15;24671:39;24486:231;:::o;24723:366::-;24865:3;24886:67;24950:2;24945:3;24886:67;:::i;:::-;24879:74;;24962:93;25051:3;24962:93;:::i;:::-;25080:2;25075:3;25071:12;25064:19;;24723:366;;;:::o;25095:419::-;25261:4;25299:2;25288:9;25284:18;25276:26;;25348:9;25342:4;25338:20;25334:1;25323:9;25319:17;25312:47;25376:131;25502:4;25376:131;:::i;:::-;25368:139;;25095:419;;;:::o;25520:180::-;25568:77;25565:1;25558:88;25665:4;25662:1;25655:15;25689:4;25686:1;25679:15;25706:141;25755:4;25778:3;25770:11;;25801:3;25798:1;25791:14;25835:4;25832:1;25822:18;25814:26;;25706:141;;;:::o;25853:93::-;25890:6;25937:2;25932;25925:5;25921:14;25917:23;25907:33;;25853:93;;;:::o;25952:107::-;25996:8;26046:5;26040:4;26036:16;26015:37;;25952:107;;;;:::o;26065:393::-;26134:6;26184:1;26172:10;26168:18;26207:97;26237:66;26226:9;26207:97;:::i;:::-;26325:39;26355:8;26344:9;26325:39;:::i;:::-;26313:51;;26397:4;26393:9;26386:5;26382:21;26373:30;;26446:4;26436:8;26432:19;26425:5;26422:30;26412:40;;26141:317;;26065:393;;;;;:::o;26464:142::-;26514:9;26547:53;26565:34;26574:24;26592:5;26574:24;:::i;:::-;26565:34;:::i;:::-;26547:53;:::i;:::-;26534:66;;26464:142;;;:::o;26612:75::-;26655:3;26676:5;26669:12;;26612:75;;;:::o;26693:269::-;26803:39;26834:7;26803:39;:::i;:::-;26864:91;26913:41;26937:16;26913:41;:::i;:::-;26905:6;26898:4;26892:11;26864:91;:::i;:::-;26858:4;26851:105;26769:193;26693:269;;;:::o;26968:73::-;27013:3;26968:73;:::o;27047:189::-;27124:32;;:::i;:::-;27165:65;27223:6;27215;27209:4;27165:65;:::i;:::-;27100:136;27047:189;;:::o;27242:186::-;27302:120;27319:3;27312:5;27309:14;27302:120;;;27373:39;27410:1;27403:5;27373:39;:::i;:::-;27346:1;27339:5;27335:13;27326:22;;27302:120;;;27242:186;;:::o;27434:543::-;27535:2;27530:3;27527:11;27524:446;;;27569:38;27601:5;27569:38;:::i;:::-;27653:29;27671:10;27653:29;:::i;:::-;27643:8;27639:44;27836:2;27824:10;27821:18;27818:49;;;27857:8;27842:23;;27818:49;27880:80;27936:22;27954:3;27936:22;:::i;:::-;27926:8;27922:37;27909:11;27880:80;:::i;:::-;27539:431;;27524:446;27434:543;;;:::o;27983:117::-;28037:8;28087:5;28081:4;28077:16;28056:37;;27983:117;;;;:::o;28106:169::-;28150:6;28183:51;28231:1;28227:6;28219:5;28216:1;28212:13;28183:51;:::i;:::-;28179:56;28264:4;28258;28254:15;28244:25;;28157:118;28106:169;;;;:::o;28280:295::-;28356:4;28502:29;28527:3;28521:4;28502:29;:::i;:::-;28494:37;;28564:3;28561:1;28557:11;28551:4;28548:21;28540:29;;28280:295;;;;:::o;28580:1395::-;28697:37;28730:3;28697:37;:::i;:::-;28799:18;28791:6;28788:30;28785:56;;;28821:18;;:::i;:::-;28785:56;28865:38;28897:4;28891:11;28865:38;:::i;:::-;28950:67;29010:6;29002;28996:4;28950:67;:::i;:::-;29044:1;29068:4;29055:17;;29100:2;29092:6;29089:14;29117:1;29112:618;;;;29774:1;29791:6;29788:77;;;29840:9;29835:3;29831:19;29825:26;29816:35;;29788:77;29891:67;29951:6;29944:5;29891:67;:::i;:::-;29885:4;29878:81;29747:222;29082:887;;29112:618;29164:4;29160:9;29152:6;29148:22;29198:37;29230:4;29198:37;:::i;:::-;29257:1;29271:208;29285:7;29282:1;29279:14;29271:208;;;29364:9;29359:3;29355:19;29349:26;29341:6;29334:42;29415:1;29407:6;29403:14;29393:24;;29462:2;29451:9;29447:18;29434:31;;29308:4;29305:1;29301:12;29296:17;;29271:208;;;29507:6;29498:7;29495:19;29492:179;;;29565:9;29560:3;29556:19;29550:26;29608:48;29650:4;29642:6;29638:17;29627:9;29608:48;:::i;:::-;29600:6;29593:64;29515:156;29492:179;29717:1;29713;29705:6;29701:14;29697:22;29691:4;29684:36;29119:611;;;29082:887;;28672:1303;;;28580:1395;;:::o;29981:174::-;30121:26;30117:1;30109:6;30105:14;30098:50;29981:174;:::o;30161:366::-;30303:3;30324:67;30388:2;30383:3;30324:67;:::i;:::-;30317:74;;30400:93;30489:3;30400:93;:::i;:::-;30518:2;30513:3;30509:12;30502:19;;30161:366;;;:::o;30533:419::-;30699:4;30737:2;30726:9;30722:18;30714:26;;30786:9;30780:4;30776:20;30772:1;30761:9;30757:17;30750:47;30814:131;30940:4;30814:131;:::i;:::-;30806:139;;30533:419;;;:::o;30958:228::-;31098:34;31094:1;31086:6;31082:14;31075:58;31167:11;31162:2;31154:6;31150:15;31143:36;30958:228;:::o;31192:366::-;31334:3;31355:67;31419:2;31414:3;31355:67;:::i;:::-;31348:74;;31431:93;31520:3;31431:93;:::i;:::-;31549:2;31544:3;31540:12;31533:19;;31192:366;;;:::o;31564:419::-;31730:4;31768:2;31757:9;31753:18;31745:26;;31817:9;31811:4;31807:20;31803:1;31792:9;31788:17;31781:47;31845:131;31971:4;31845:131;:::i;:::-;31837:139;;31564:419;;;:::o;31989:177::-;32129:29;32125:1;32117:6;32113:14;32106:53;31989:177;:::o;32172:366::-;32314:3;32335:67;32399:2;32394:3;32335:67;:::i;:::-;32328:74;;32411:93;32500:3;32411:93;:::i;:::-;32529:2;32524:3;32520:12;32513:19;;32172:366;;;:::o;32544:419::-;32710:4;32748:2;32737:9;32733:18;32725:26;;32797:9;32791:4;32787:20;32783:1;32772:9;32768:17;32761:47;32825:131;32951:4;32825:131;:::i;:::-;32817:139;;32544:419;;;:::o;32969:191::-;33009:3;33028:20;33046:1;33028:20;:::i;:::-;33023:25;;33062:20;33080:1;33062:20;:::i;:::-;33057:25;;33105:1;33102;33098:9;33091:16;;33126:3;33123:1;33120:10;33117:36;;;33133:18;;:::i;:::-;33117:36;32969:191;;;;:::o;33166:168::-;33306:20;33302:1;33294:6;33290:14;33283:44;33166:168;:::o;33340:366::-;33482:3;33503:67;33567:2;33562:3;33503:67;:::i;:::-;33496:74;;33579:93;33668:3;33579:93;:::i;:::-;33697:2;33692:3;33688:12;33681:19;;33340:366;;;:::o;33712:419::-;33878:4;33916:2;33905:9;33901:18;33893:26;;33965:9;33959:4;33955:20;33951:1;33940:9;33936:17;33929:47;33993:131;34119:4;33993:131;:::i;:::-;33985:139;;33712:419;;;:::o;34137:178::-;34277:30;34273:1;34265:6;34261:14;34254:54;34137:178;:::o;34321:366::-;34463:3;34484:67;34548:2;34543:3;34484:67;:::i;:::-;34477:74;;34560:93;34649:3;34560:93;:::i;:::-;34678:2;34673:3;34669:12;34662:19;;34321:366;;;:::o;34693:419::-;34859:4;34897:2;34886:9;34882:18;34874:26;;34946:9;34940:4;34936:20;34932:1;34921:9;34917:17;34910:47;34974:131;35100:4;34974:131;:::i;:::-;34966:139;;34693:419;;;:::o;35118:178::-;35258:30;35254:1;35246:6;35242:14;35235:54;35118:178;:::o;35302:366::-;35444:3;35465:67;35529:2;35524:3;35465:67;:::i;:::-;35458:74;;35541:93;35630:3;35541:93;:::i;:::-;35659:2;35654:3;35650:12;35643:19;;35302:366;;;:::o;35674:419::-;35840:4;35878:2;35867:9;35863:18;35855:26;;35927:9;35921:4;35917:20;35913:1;35902:9;35898:17;35891:47;35955:131;36081:4;35955:131;:::i;:::-;35947:139;;35674:419;;;:::o;36099:228::-;36239:34;36235:1;36227:6;36223:14;36216:58;36308:11;36303:2;36295:6;36291:15;36284:36;36099:228;:::o;36333:366::-;36475:3;36496:67;36560:2;36555:3;36496:67;:::i;:::-;36489:74;;36572:93;36661:3;36572:93;:::i;:::-;36690:2;36685:3;36681:12;36674:19;;36333:366;;;:::o;36705:419::-;36871:4;36909:2;36898:9;36894:18;36886:26;;36958:9;36952:4;36948:20;36944:1;36933:9;36929:17;36922:47;36986:131;37112:4;36986:131;:::i;:::-;36978:139;;36705:419;;;:::o;37130:442::-;37279:4;37317:2;37306:9;37302:18;37294:26;;37330:71;37398:1;37387:9;37383:17;37374:6;37330:71;:::i;:::-;37411:72;37479:2;37468:9;37464:18;37455:6;37411:72;:::i;:::-;37493;37561:2;37550:9;37546:18;37537:6;37493:72;:::i;:::-;37130:442;;;;;;:::o;37578:179::-;37718:31;37714:1;37706:6;37702:14;37695:55;37578:179;:::o;37763:366::-;37905:3;37926:67;37990:2;37985:3;37926:67;:::i;:::-;37919:74;;38002:93;38091:3;38002:93;:::i;:::-;38120:2;38115:3;38111:12;38104:19;;37763:366;;;:::o;38135:419::-;38301:4;38339:2;38328:9;38324:18;38316:26;;38388:9;38382:4;38378:20;38374:1;38363:9;38359:17;38352:47;38416:131;38542:4;38416:131;:::i;:::-;38408:139;;38135:419;;;:::o;38560:233::-;38599:3;38622:24;38640:5;38622:24;:::i;:::-;38613:33;;38668:66;38661:5;38658:77;38655:103;;38738:18;;:::i;:::-;38655:103;38785:1;38778:5;38774:13;38767:20;;38560:233;;;:::o;38799:234::-;38939:34;38935:1;38927:6;38923:14;38916:58;39008:17;39003:2;38995:6;38991:15;38984:42;38799:234;:::o;39039:366::-;39181:3;39202:67;39266:2;39261:3;39202:67;:::i;:::-;39195:74;;39278:93;39367:3;39278:93;:::i;:::-;39396:2;39391:3;39387:12;39380:19;;39039:366;;;:::o;39411:419::-;39577:4;39615:2;39604:9;39600:18;39592:26;;39664:9;39658:4;39654:20;39650:1;39639:9;39635:17;39628:47;39692:131;39818:4;39692:131;:::i;:::-;39684:139;;39411:419;;;:::o;39836:148::-;39938:11;39975:3;39960:18;;39836:148;;;;:::o;39990:390::-;40096:3;40124:39;40157:5;40124:39;:::i;:::-;40179:89;40261:6;40256:3;40179:89;:::i;:::-;40172:96;;40277:65;40335:6;40330:3;40323:4;40316:5;40312:16;40277:65;:::i;:::-;40367:6;40362:3;40358:16;40351:23;;40100:280;39990:390;;;;:::o;40410:874::-;40513:3;40550:5;40544:12;40579:36;40605:9;40579:36;:::i;:::-;40631:89;40713:6;40708:3;40631:89;:::i;:::-;40624:96;;40751:1;40740:9;40736:17;40767:1;40762:166;;;;40942:1;40937:341;;;;40729:549;;40762:166;40846:4;40842:9;40831;40827:25;40822:3;40815:38;40908:6;40901:14;40894:22;40886:6;40882:35;40877:3;40873:45;40866:52;;40762:166;;40937:341;41004:38;41036:5;41004:38;:::i;:::-;41064:1;41078:154;41092:6;41089:1;41086:13;41078:154;;;41166:7;41160:14;41156:1;41151:3;41147:11;41140:35;41216:1;41207:7;41203:15;41192:26;;41114:4;41111:1;41107:12;41102:17;;41078:154;;;41261:6;41256:3;41252:16;41245:23;;40944:334;;40729:549;;40517:767;;40410:874;;;;:::o;41290:589::-;41515:3;41537:95;41628:3;41619:6;41537:95;:::i;:::-;41530:102;;41649:95;41740:3;41731:6;41649:95;:::i;:::-;41642:102;;41761:92;41849:3;41840:6;41761:92;:::i;:::-;41754:99;;41870:3;41863:10;;41290:589;;;;;;:::o;41885:225::-;42025:34;42021:1;42013:6;42009:14;42002:58;42094:8;42089:2;42081:6;42077:15;42070:33;41885:225;:::o;42116:366::-;42258:3;42279:67;42343:2;42338:3;42279:67;:::i;:::-;42272:74;;42355:93;42444:3;42355:93;:::i;:::-;42473:2;42468:3;42464:12;42457:19;;42116:366;;;:::o;42488:419::-;42654:4;42692:2;42681:9;42677:18;42669:26;;42741:9;42735:4;42731:20;42727:1;42716:9;42712:17;42705:47;42769:131;42895:4;42769:131;:::i;:::-;42761:139;;42488:419;;;:::o;42913:182::-;43053:34;43049:1;43041:6;43037:14;43030:58;42913:182;:::o;43101:366::-;43243:3;43264:67;43328:2;43323:3;43264:67;:::i;:::-;43257:74;;43340:93;43429:3;43340:93;:::i;:::-;43458:2;43453:3;43449:12;43442:19;;43101:366;;;:::o;43473:419::-;43639:4;43677:2;43666:9;43662:18;43654:26;;43726:9;43720:4;43716:20;43712:1;43701:9;43697:17;43690:47;43754:131;43880:4;43754:131;:::i;:::-;43746:139;;43473:419;;;:::o;43898:229::-;44038:34;44034:1;44026:6;44022:14;44015:58;44107:12;44102:2;44094:6;44090:15;44083:37;43898:229;:::o;44133:366::-;44275:3;44296:67;44360:2;44355:3;44296:67;:::i;:::-;44289:74;;44372:93;44461:3;44372:93;:::i;:::-;44490:2;44485:3;44481:12;44474:19;;44133:366;;;:::o;44505:419::-;44671:4;44709:2;44698:9;44694:18;44686:26;;44758:9;44752:4;44748:20;44744:1;44733:9;44729:17;44722:47;44786:131;44912:4;44786:131;:::i;:::-;44778:139;;44505:419;;;:::o;44930:175::-;45070:27;45066:1;45058:6;45054:14;45047:51;44930:175;:::o;45111:366::-;45253:3;45274:67;45338:2;45333:3;45274:67;:::i;:::-;45267:74;;45350:93;45439:3;45350:93;:::i;:::-;45468:2;45463:3;45459:12;45452:19;;45111:366;;;:::o;45483:419::-;45649:4;45687:2;45676:9;45672:18;45664:26;;45736:9;45730:4;45726:20;45722:1;45711:9;45707:17;45700:47;45764:131;45890:4;45764:131;:::i;:::-;45756:139;;45483:419;;;:::o;45908:224::-;46048:34;46044:1;46036:6;46032:14;46025:58;46117:7;46112:2;46104:6;46100:15;46093:32;45908:224;:::o;46138:366::-;46280:3;46301:67;46365:2;46360:3;46301:67;:::i;:::-;46294:74;;46377:93;46466:3;46377:93;:::i;:::-;46495:2;46490:3;46486:12;46479:19;;46138:366;;;:::o;46510:419::-;46676:4;46714:2;46703:9;46699:18;46691:26;;46763:9;46757:4;46753:20;46749:1;46738:9;46734:17;46727:47;46791:131;46917:4;46791:131;:::i;:::-;46783:139;;46510:419;;;:::o;46935:223::-;47075:34;47071:1;47063:6;47059:14;47052:58;47144:6;47139:2;47131:6;47127:15;47120:31;46935:223;:::o;47164:366::-;47306:3;47327:67;47391:2;47386:3;47327:67;:::i;:::-;47320:74;;47403:93;47492:3;47403:93;:::i;:::-;47521:2;47516:3;47512:12;47505:19;;47164:366;;;:::o;47536:419::-;47702:4;47740:2;47729:9;47725:18;47717:26;;47789:9;47783:4;47779:20;47775:1;47764:9;47760:17;47753:47;47817:131;47943:4;47817:131;:::i;:::-;47809:139;;47536:419;;;:::o;47961:181::-;48101:33;48097:1;48089:6;48085:14;48078:57;47961:181;:::o;48148:366::-;48290:3;48311:67;48375:2;48370:3;48311:67;:::i;:::-;48304:74;;48387:93;48476:3;48387:93;:::i;:::-;48505:2;48500:3;48496:12;48489:19;;48148:366;;;:::o;48520:419::-;48686:4;48724:2;48713:9;48709:18;48701:26;;48773:9;48767:4;48763:20;48759:1;48748:9;48744:17;48737:47;48801:131;48927:4;48801:131;:::i;:::-;48793:139;;48520:419;;;:::o;48945:79::-;48984:7;49013:5;49002:16;;48945:79;;;:::o;49030:157::-;49135:45;49155:24;49173:5;49155:24;:::i;:::-;49135:45;:::i;:::-;49130:3;49123:58;49030:157;;:::o;49193:397::-;49333:3;49348:75;49419:3;49410:6;49348:75;:::i;:::-;49448:2;49443:3;49439:12;49432:19;;49461:75;49532:3;49523:6;49461:75;:::i;:::-;49561:2;49556:3;49552:12;49545:19;;49581:3;49574:10;;49193:397;;;;;:::o;49596:176::-;49628:1;49645:20;49663:1;49645:20;:::i;:::-;49640:25;;49679:20;49697:1;49679:20;:::i;:::-;49674:25;;49718:1;49708:35;;49723:18;;:::i;:::-;49708:35;49764:1;49761;49757:9;49752:14;;49596:176;;;;:::o;49778:538::-;49946:3;49961:75;50032:3;50023:6;49961:75;:::i;:::-;50061:2;50056:3;50052:12;50045:19;;50074:75;50145:3;50136:6;50074:75;:::i;:::-;50174:2;50169:3;50165:12;50158:19;;50187:75;50258:3;50249:6;50187:75;:::i;:::-;50287:2;50282:3;50278:12;50271:19;;50307:3;50300:10;;49778:538;;;;;;:::o;50322:175::-;50462:27;50458:1;50450:6;50446:14;50439:51;50322:175;:::o;50503:366::-;50645:3;50666:67;50730:2;50725:3;50666:67;:::i;:::-;50659:74;;50742:93;50831:3;50742:93;:::i;:::-;50860:2;50855:3;50851:12;50844:19;;50503:366;;;:::o;50875:419::-;51041:4;51079:2;51068:9;51064:18;51056:26;;51128:9;51122:4;51118:20;51114:1;51103:9;51099:17;51092:47;51156:131;51282:4;51156:131;:::i;:::-;51148:139;;50875:419;;;:::o;51300:237::-;51440:34;51436:1;51428:6;51424:14;51417:58;51509:20;51504:2;51496:6;51492:15;51485:45;51300:237;:::o;51543:366::-;51685:3;51706:67;51770:2;51765:3;51706:67;:::i;:::-;51699:74;;51782:93;51871:3;51782:93;:::i;:::-;51900:2;51895:3;51891:12;51884:19;;51543:366;;;:::o;51915:419::-;52081:4;52119:2;52108:9;52104:18;52096:26;;52168:9;52162:4;52158:20;52154:1;52143:9;52139:17;52132:47;52196:131;52322:4;52196:131;:::i;:::-;52188:139;;51915:419;;;:::o;52340:240::-;52480:34;52476:1;52468:6;52464:14;52457:58;52549:23;52544:2;52536:6;52532:15;52525:48;52340:240;:::o;52586:366::-;52728:3;52749:67;52813:2;52808:3;52749:67;:::i;:::-;52742:74;;52825:93;52914:3;52825:93;:::i;:::-;52943:2;52938:3;52934:12;52927:19;;52586:366;;;:::o;52958:419::-;53124:4;53162:2;53151:9;53147:18;53139:26;;53211:9;53205:4;53201:20;53197:1;53186:9;53182:17;53175:47;53239:131;53365:4;53239:131;:::i;:::-;53231:139;;52958:419;;;:::o;53383:98::-;53434:6;53468:5;53462:12;53452:22;;53383:98;;;:::o;53487:168::-;53570:11;53604:6;53599:3;53592:19;53644:4;53639:3;53635:14;53620:29;;53487:168;;;;:::o;53661:373::-;53747:3;53775:38;53807:5;53775:38;:::i;:::-;53829:70;53892:6;53887:3;53829:70;:::i;:::-;53822:77;;53908:65;53966:6;53961:3;53954:4;53947:5;53943:16;53908:65;:::i;:::-;53998:29;54020:6;53998:29;:::i;:::-;53993:3;53989:39;53982:46;;53751:283;53661:373;;;;:::o;54040:640::-;54235:4;54273:3;54262:9;54258:19;54250:27;;54287:71;54355:1;54344:9;54340:17;54331:6;54287:71;:::i;:::-;54368:72;54436:2;54425:9;54421:18;54412:6;54368:72;:::i;:::-;54450;54518:2;54507:9;54503:18;54494:6;54450:72;:::i;:::-;54569:9;54563:4;54559:20;54554:2;54543:9;54539:18;54532:48;54597:76;54668:4;54659:6;54597:76;:::i;:::-;54589:84;;54040:640;;;;;;;:::o;54686:141::-;54742:5;54773:6;54767:13;54758:22;;54789:32;54815:5;54789:32;:::i;:::-;54686:141;;;;:::o;54833:349::-;54902:6;54951:2;54939:9;54930:7;54926:23;54922:32;54919:119;;;54957:79;;:::i;:::-;54919:119;55077:1;55102:63;55157:7;55148:6;55137:9;55133:22;55102:63;:::i;:::-;55092:73;;55048:127;54833:349;;;;:::o;55188:194::-;55228:4;55248:20;55266:1;55248:20;:::i;:::-;55243:25;;55282:20;55300:1;55282:20;:::i;:::-;55277:25;;55326:1;55323;55319:9;55311:17;;55350:1;55344:4;55341:11;55338:37;;;55355:18;;:::i;:::-;55338:37;55188:194;;;;:::o;55388:180::-;55436:77;55433:1;55426:88;55533:4;55530:1;55523:15;55557:4;55554:1;55547:15;55574:182;55714:34;55710:1;55702:6;55698:14;55691:58;55574:182;:::o;55762:366::-;55904:3;55925:67;55989:2;55984:3;55925:67;:::i;:::-;55918:74;;56001:93;56090:3;56001:93;:::i;:::-;56119:2;56114:3;56110:12;56103:19;;55762:366;;;:::o;56134:419::-;56300:4;56338:2;56327:9;56323:18;56315:26;;56387:9;56381:4;56377:20;56373:1;56362:9;56358:17;56351:47;56415:131;56541:4;56415:131;:::i;:::-;56407:139;;56134:419;;;:::o;56559:178::-;56699:30;56695:1;56687:6;56683:14;56676:54;56559:178;:::o;56743:366::-;56885:3;56906:67;56970:2;56965:3;56906:67;:::i;:::-;56899:74;;56982:93;57071:3;56982:93;:::i;:::-;57100:2;57095:3;57091:12;57084:19;;56743:366;;;:::o;57115:419::-;57281:4;57319:2;57308:9;57304:18;57296:26;;57368:9;57362:4;57358:20;57354:1;57343:9;57339:17;57332:47;57396:131;57522:4;57396:131;:::i;:::-;57388:139;;57115:419;;;:::o
Swarm Source
ipfs://15b9b9d7a4be659ae8715075e9ddc4622e1d9583f545a60198f981ecb067ac50
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.