Token Ghostly Lands
Overview CRC721
Total Supply:
339 GHL
Holders:
37 addresses
Transfers:
-
Contract:
[ Download CSV Export ]
[ Download CSV Export ]
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Source Code Verified (Exact Match)
Contract Name:
GhostlyLands
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-05-26 */ // 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 = "https://ipfs.filebase.io/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 = 1 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 must be active to mint"); 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 CRO value 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) ) { // BOO minting phase return isOGHolder ? ogHoldersPriceBoo : publicPriceBoo; } else { // CRO minting phase return isOGHolder ? ogHoldersPriceCro : publicPriceCro; } } function _getCurrentPaymentToken() internal view returns (address) { if ( totalSupply() < TOKENS_PER_TYPE || (totalSupply() >= 2 * TOKENS_PER_TYPE && totalSupply() < 3 * TOKENS_PER_TYPE) ) { // BOO minting phase return address(booToken); } else { // CRO minting phase return address(0); // Representing native currency } } 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; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"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
6080604052734d1d39e722a26d485de95c9bada1e004690e7931601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550734995a7787816e2898c171d1064615ee7e4c3dd22601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550732b98dbf6e4af55fad3f509152a867849b358677f601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550734995a7787816e2898c171d1064615ee7e4c3dd22601560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073881420a347b81fb691b348a9b412c39e695dd6ae601660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550733484d2216174ad804808de2d25d807bf21535b46601760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073e0160145ec09f98fb3dbc03b2b5da08d16871e3f601860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000601860146101000a81548160ff0219169083151502179055506040518060800160405280604d815260200162006505604d9139601990816200029c9190620009ff565b506040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250601b9081620002e39190620009ff565b50348015620002f157600080fd5b506040518060400160405280600d81526020017f47686f73746c79204c616e6473000000000000000000000000000000000000008152506040518060400160405280600381526020017f47484c000000000000000000000000000000000000000000000000000000000081525081600090816200036f9190620009ff565b508060019081620003819190620009ff565b505050620003a4620003986200042960201b60201c565b6200043160201b60201c565b6001600b8190555069010f0cf064dd59200000600e819055506901969368974c05b00000600f81905550680ad78ebc5ac6200000601081905550670de0b6b3a764000060118190555062000423601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166103e8620004f760201b60201c565b62000c73565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620005076200051d60201b60201c565b620005198282620005ae60201b60201c565b5050565b6200052d6200042960201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620005536200075160201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620005ac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005a39062000b47565b60405180910390fd5b565b620005be6200077b60201b60201c565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff1611156200061f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620006169062000bdf565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000691576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620006889062000c51565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600c60008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000612710905090565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200080757607f821691505b6020821081036200081d576200081c620007bf565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620008877fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000848565b62000893868362000848565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620008e0620008da620008d484620008ab565b620008b5565b620008ab565b9050919050565b6000819050919050565b620008fc83620008bf565b620009146200090b82620008e7565b84845462000855565b825550505050565b600090565b6200092b6200091c565b62000938818484620008f1565b505050565b5b8181101562000960576200095460008262000921565b6001810190506200093e565b5050565b601f821115620009af57620009798162000823565b620009848462000838565b8101602085101562000994578190505b620009ac620009a38562000838565b8301826200093d565b50505b505050565b600082821c905092915050565b6000620009d460001984600802620009b4565b1980831691505092915050565b6000620009ef8383620009c1565b9150826002028217905092915050565b62000a0a8262000785565b67ffffffffffffffff81111562000a265762000a2562000790565b5b62000a328254620007ee565b62000a3f82828562000964565b600060209050601f83116001811462000a77576000841562000a62578287015190505b62000a6e8582620009e1565b86555062000ade565b601f19841662000a878662000823565b60005b8281101562000ab15784890151825560018201915060208501945060208101905062000a8a565b8683101562000ad1578489015162000acd601f891682620009c1565b8355505b6001600288020188555050505b505050505050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600062000b2f60208362000ae6565b915062000b3c8262000af7565b602082019050919050565b6000602082019050818103600083015262000b628162000b20565b9050919050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b600062000bc7602a8362000ae6565b915062000bd48262000b69565b604082019050919050565b6000602082019050818103600083015262000bfa8162000bb8565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b600062000c3960198362000ae6565b915062000c468262000c01565b602082019050919050565b6000602082019050818103600083015262000c6c8162000c2a565b9050919050565b6158828062000c836000396000f3fe6080604052600436106102935760003560e01c806370a082311161015a578063c52a851d116100c1578063da3ef23f1161007a578063da3ef23f146109c0578063df176b43146109e9578063e4c8233714610a12578063e985e9c514610a3d578063eb8d244414610a7a578063f2fde38b14610aa557610293565b8063c52a851d146108b2578063c6682862146108db578063c87b56dd14610906578063cbeb4ac114610943578063d58f2f271461096c578063d8e868541461099757610293565b806395d89b411161011357806395d89b41146107c55780639fdb0267146107f0578063a0712d681461081b578063a22cb46514610837578063b88d4fde14610860578063be9413c61461088957610293565b806370a08231146106c5578063715018a61461070257806388f0036f146107195780638da5cb5b146107445780638de48c0b1461076f57806392368a7a1461079a57610293565b80632f745c59116101fe578063449cb046116101b7578063449cb046146105a15780634f6ccce7146105cc5780634fe270351461060957806355f804b3146106345780636158874f1461065d5780636352211e1461068857610293565b80632f745c59146104b957806332cb6b0c146104f657806334918dfd1461052157806337060732146105385780633ccfd60b1461056157806342842e0e1461057857610293565b806318160ddd1161025057806318160ddd146103ba5780631f8f10e8146103e557806322f08cb11461041057806323b872dd146104275780632a55205a146104505780632f3178211461048e57610293565b806301ffc9a71461029857806304634d8d146102d557806306fdde03146102fe578063081812fc14610329578063095ea7b3146103665780631114c9a91461038f575b600080fd5b3480156102a457600080fd5b506102bf60048036038101906102ba9190613a23565b610ace565b6040516102cc9190613a6b565b60405180910390f35b3480156102e157600080fd5b506102fc60048036038101906102f79190613b28565b610ae0565b005b34801561030a57600080fd5b50610313610af6565b6040516103209190613bf8565b60405180910390f35b34801561033557600080fd5b50610350600480360381019061034b9190613c50565b610b88565b60405161035d9190613c8c565b60405180910390f35b34801561037257600080fd5b5061038d60048036038101906103889190613ca7565b610bce565b005b34801561039b57600080fd5b506103a4610ce5565b6040516103b19190613d08565b60405180910390f35b3480156103c657600080fd5b506103cf610d0b565b6040516103dc9190613d32565b60405180910390f35b3480156103f157600080fd5b506103fa610d18565b6040516104079190613dac565b60405180910390f35b34801561041c57600080fd5b50610425610d3e565b005b34801561043357600080fd5b5061044e60048036038101906104499190613dc7565b610eac565b005b34801561045c57600080fd5b5061047760048036038101906104729190613e1a565b610f0c565b604051610485929190613e5a565b60405180910390f35b34801561049a57600080fd5b506104a36110f6565b6040516104b09190613ea4565b60405180910390f35b3480156104c557600080fd5b506104e060048036038101906104db9190613ca7565b61111c565b6040516104ed9190613d32565b60405180910390f35b34801561050257600080fd5b5061050b6111c1565b6040516105189190613d32565b60405180910390f35b34801561052d57600080fd5b506105366111c7565b005b34801561054457600080fd5b5061055f600480360381019061055a9190613eeb565b6111fb565b005b34801561056d57600080fd5b50610576611247565b005b34801561058457600080fd5b5061059f600480360381019061059a9190613dc7565b6114dc565b005b3480156105ad57600080fd5b506105b66114fc565b6040516105c39190613d08565b60405180910390f35b3480156105d857600080fd5b506105f360048036038101906105ee9190613c50565b611522565b6040516106009190613d32565b60405180910390f35b34801561061557600080fd5b5061061e611593565b60405161062b9190613d32565b60405180910390f35b34801561064057600080fd5b5061065b6004803603810190610656919061404d565b611599565b005b34801561066957600080fd5b506106726115b4565b60405161067f9190613d08565b60405180910390f35b34801561069457600080fd5b506106af60048036038101906106aa9190613c50565b6115da565b6040516106bc9190613c8c565b60405180910390f35b3480156106d157600080fd5b506106ec60048036038101906106e79190614096565b611660565b6040516106f99190613d32565b60405180910390f35b34801561070e57600080fd5b50610717611717565b005b34801561072557600080fd5b5061072e61172b565b60405161073b9190613d32565b60405180910390f35b34801561075057600080fd5b50610759611731565b6040516107669190613c8c565b60405180910390f35b34801561077b57600080fd5b5061078461175b565b6040516107919190613d08565b60405180910390f35b3480156107a657600080fd5b506107af611781565b6040516107bc9190613d32565b60405180910390f35b3480156107d157600080fd5b506107da611787565b6040516107e79190613bf8565b60405180910390f35b3480156107fc57600080fd5b50610805611819565b6040516108129190613d32565b60405180910390f35b61083560048036038101906108309190613c50565b61181f565b005b34801561084357600080fd5b5061085e600480360381019061085991906140ef565b611b22565b005b34801561086c57600080fd5b50610887600480360381019061088291906141d0565b611b38565b005b34801561089557600080fd5b506108b060048036038101906108ab9190613eeb565b611b9a565b005b3480156108be57600080fd5b506108d960048036038101906108d49190613eeb565b611be6565b005b3480156108e757600080fd5b506108f0611c32565b6040516108fd9190613bf8565b60405180910390f35b34801561091257600080fd5b5061092d60048036038101906109289190613c50565b611cc0565b60405161093a9190613bf8565b60405180910390f35b34801561094f57600080fd5b5061096a60048036038101906109659190613eeb565b611d6a565b005b34801561097857600080fd5b50610981611db6565b60405161098e9190613d08565b60405180910390f35b3480156109a357600080fd5b506109be60048036038101906109b99190614253565b611ddc565b005b3480156109cc57600080fd5b506109e760048036038101906109e2919061404d565b611e06565b005b3480156109f557600080fd5b50610a106004803603810190610a0b9190613eeb565b611e21565b005b348015610a1e57600080fd5b50610a27611e6d565b604051610a349190613d32565b60405180910390f35b348015610a4957600080fd5b50610a646004803603810190610a5f91906142ba565b611e73565b604051610a719190613a6b565b60405180910390f35b348015610a8657600080fd5b50610a8f611f07565b604051610a9c9190613a6b565b60405180910390f35b348015610ab157600080fd5b50610acc6004803603810190610ac79190614096565b611f1a565b005b6000610ad982611f9d565b9050919050565b610ae8612017565b610af28282612095565b5050565b606060008054610b0590614329565b80601f0160208091040260200160405190810160405280929190818152602001828054610b3190614329565b8015610b7e5780601f10610b5357610100808354040283529160200191610b7e565b820191906000526020600020905b815481529060010190602001808311610b6157829003601f168201915b5050505050905090565b6000610b938261222a565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610bd9826115da565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610c49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c40906143cc565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c68612275565b73ffffffffffffffffffffffffffffffffffffffff161480610c975750610c9681610c91612275565b611e73565b5b610cd6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ccd9061445e565b60405180910390fd5b610ce0838361227d565b505050565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600880549050905090565b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610d46612017565b6000601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610da39190613c8c565b602060405180830381865afa158015610dc0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610de49190614493565b9050601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b8152600401610e659291906144e1565b6020604051808303816000875af1158015610e84573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ea8919061451f565b5050565b610ebd610eb7612275565b82612336565b610efc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef3906145be565b60405180910390fd5b610f078383836123cb565b505050565b6000806000600d60008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16036110a157600c6040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b60006110ab6126c4565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff16866110d7919061460d565b6110e1919061467e565b90508160000151819350935050509250929050565b601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600061112783611660565b8210611168576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115f90614721565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6104bc81565b6111cf612017565b601860149054906101000a900460ff1615601860146101000a81548160ff021916908315150217905550565b611203612017565b80601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61124f612017565b600047905060006064603c83611265919061460d565b61126f919061467e565b905060006064601484611282919061460d565b61128c919061467e565b90506000606460088561129f919061460d565b6112a9919061467e565b9050600060646004866112bc919061460d565b6112c6919061467e565b9050601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc859081150290604051600060405180830381858888f19350505050158015611330573d6000803e3d6000fd5b50601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f19350505050158015611399573d6000803e3d6000fd5b50601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015611402573d6000803e3d6000fd5b50601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f1935050505015801561146b573d6000803e3d6000fd5b50601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156114d4573d6000803e3d6000fd5b505050505050565b6114f783838360405180602001604052806000815250611b38565b505050565b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600061152c610d0b565b821061156d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611564906147b3565b60405180910390fd5b60088281548110611581576115806147d3565b5b90600052602060002001549050919050565b600f5481565b6115a1612017565b80601990816115b091906149a4565b5050565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806115e6836126ce565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611657576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164e90614ac2565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036116d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c790614b54565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61171f612017565b611729600061270b565b565b60105481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600e5481565b60606001805461179690614329565b80601f01602080910402602001604051908101604052809291908181526020018280546117c290614329565b801561180f5780601f106117e45761010080835404028352916020019161180f565b820191906000526020600020905b8154815290600101906020018083116117f257829003601f168201915b5050505050905090565b61012f81565b6118276127d1565b601860149054906101000a900460ff16611876576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186d90614bc0565b60405180910390fd5b6104bc81611882610d0b565b61188c9190614be0565b11156118cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c490614c60565b60405180910390fd5b60008111611910576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190790614ccc565b60405180910390fd5b600061191b33612820565b90506000611927612948565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036119af578183611969919061460d565b34146119aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a190614d38565b60405180910390fd5b611adf565b600034146119f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e990614dca565b60405180910390fd5b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd33308587611a3e919061460d565b6040518463ffffffff1660e01b8152600401611a5c93929190614dea565b6020604051808303816000875af1158015611a7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a9f919061451f565b611ade576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad590614e6d565b60405180910390fd5b5b60005b83811015611b14576000611af46129cd565b9050611b003382612a7b565b508080611b0c90614e8d565b915050611ae2565b505050611b1f612a99565b50565b611b34611b2d612275565b8383612aa3565b5050565b611b49611b43612275565b83612336565b611b88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7f906145be565b60405180910390fd5b611b9484848484612c0f565b50505050565b611ba2612017565b80601660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611bee612017565b80601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b601b8054611c3f90614329565b80601f0160208091040260200160405190810160405280929190818152602001828054611c6b90614329565b8015611cb85780601f10611c8d57610100808354040283529160200191611cb8565b820191906000526020600020905b815481529060010190602001808311611c9b57829003601f168201915b505050505081565b6060611ccb82612c6b565b611d0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0190614f47565b60405180910390fd5b6000611d14612cac565b90506000815111611d345760405180602001604052806000815250611d62565b80611d3e84612d3e565b601b604051602001611d5293929190615026565b6040516020818303038152906040525b915050919050565b611d72612017565b80601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611de4612017565b83600e8190555082600f81905550816010819055508060118190555050505050565b611e0e612017565b80601b9081611e1d91906149a4565b5050565b611e29612017565b80601560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60115481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b601860149054906101000a900460ff1681565b611f22612017565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611f91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f88906150c9565b60405180910390fd5b611f9a8161270b565b50565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612010575061200f82612e0c565b5b9050919050565b61201f612275565b73ffffffffffffffffffffffffffffffffffffffff1661203d611731565b73ffffffffffffffffffffffffffffffffffffffff1614612093576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208a90615135565b60405180910390fd5b565b61209d6126c4565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff1611156120fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f2906151c7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361216a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216190615233565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600c60008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b61223381612c6b565b612272576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226990614ac2565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166122f0836115da565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080612342836115da565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061238457506123838185611e73565b5b806123c257508373ffffffffffffffffffffffffffffffffffffffff166123aa84610b88565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166123eb826115da565b73ffffffffffffffffffffffffffffffffffffffff1614612441576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612438906152c5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036124b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124a790615357565b60405180910390fd5b6124bd8383836001612e86565b8273ffffffffffffffffffffffffffffffffffffffff166124dd826115da565b73ffffffffffffffffffffffffffffffffffffffff1614612533576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161252a906152c5565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46126bf8383836001612fe4565b505050565b6000612710905090565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6002600b5403612816576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161280d906153c3565b60405180910390fd5b6002600b81905550565b6000806000601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231856040518263ffffffff1660e01b81526004016128809190613c8c565b602060405180830381865afa15801561289d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128c19190614493565b11905061012f6128cf610d0b565b1080612910575061012f60026128e5919061460d565b6128ed610d0b565b1015801561290f575061012f6003612905919061460d565b61290d610d0b565b105b5b1561292e578061292257600f54612926565b600e545b915050612943565b8061293b5760115461293f565b6010545b9150505b919050565b600061012f612955610d0b565b1080612996575061012f600261296b919061460d565b612973610d0b565b10158015612995575061012f600361298b919061460d565b612993610d0b565b105b5b156129c557601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506129ca565b600090505b90565b6000806104bc44426040516020016129e6929190615404565b6040516020818303038152906040528051906020012060001c612a099190615430565b90505b612a21600182612a1c9190614be0565b612c6b565b15612a68576104bc444283604051602001612a3e93929190615461565b6040516020818303038152906040528051906020012060001c612a619190615430565b9050612a0c565b600181612a759190614be0565b91505090565b612a95828260405180602001604052806000815250612fea565b5050565b6001600b81905550565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612b11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b08906154ea565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612c029190613a6b565b60405180910390a3505050565b612c1a8484846123cb565b612c2684848484613045565b612c65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c5c9061557c565b60405180910390fd5b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff16612c8d836126ce565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b606060198054612cbb90614329565b80601f0160208091040260200160405190810160405280929190818152602001828054612ce790614329565b8015612d345780601f10612d0957610100808354040283529160200191612d34565b820191906000526020600020905b815481529060010190602001808311612d1757829003601f168201915b5050505050905090565b606060006001612d4d846131cc565b01905060008167ffffffffffffffff811115612d6c57612d6b613f22565b5b6040519080825280601f01601f191660200182016040528015612d9e5781602001600182028036833780820191505090505b509050600082602001820190505b600115612e01578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581612df557612df461464f565b5b04945060008503612dac575b819350505050919050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612e7f5750612e7e8261331f565b5b9050919050565b612e9284848484613401565b6001811115612ed6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ecd9061560e565b60405180910390fd5b6000829050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612f1d57612f1881613407565b612f5c565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614612f5b57612f5a8582613450565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612f9e57612f99816135bd565b612fdd565b8473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614612fdc57612fdb848261368e565b5b5b5050505050565b50505050565b612ff4838361370d565b6130016000848484613045565b613040576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130379061557c565b60405180910390fd5b505050565b60006130668473ffffffffffffffffffffffffffffffffffffffff1661392a565b156131bf578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261308f612275565b8786866040518563ffffffff1660e01b81526004016130b19493929190615683565b6020604051808303816000875af19250505080156130ed57506040513d601f19601f820116820180604052508101906130ea91906156e4565b60015b61316f573d806000811461311d576040519150601f19603f3d011682016040523d82523d6000602084013e613122565b606091505b506000815103613167576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161315e9061557c565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506131c4565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000831061322a577a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083816132205761321f61464f565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310613267576d04ee2d6d415b85acef8100000000838161325d5761325c61464f565b5b0492506020810190505b662386f26fc10000831061329657662386f26fc10000838161328c5761328b61464f565b5b0492506010810190505b6305f5e10083106132bf576305f5e10083816132b5576132b461464f565b5b0492506008810190505b61271083106132e45761271083816132da576132d961464f565b5b0492506004810190505b6064831061330757606483816132fd576132fc61464f565b5b0492506002810190505b600a8310613316576001810190505b80915050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806133ea57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806133fa57506133f98261394d565b5b9050919050565b50505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161345d84611660565b6134679190615711565b905060006007600084815260200190815260200160002054905081811461354c576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506135d19190615711565b9050600060096000848152602001908152602001600020549050600060088381548110613601576136006147d3565b5b906000526020600020015490508060088381548110613623576136226147d3565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061367257613671615745565b5b6001900381819060005260206000200160009055905550505050565b600061369983611660565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361377c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613773906157c0565b60405180910390fd5b61378581612c6b565b156137c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137bc9061582c565b60405180910390fd5b6137d3600083836001612e86565b6137dc81612c6b565b1561381c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138139061582c565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613926600083836001612fe4565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613a00816139cb565b8114613a0b57600080fd5b50565b600081359050613a1d816139f7565b92915050565b600060208284031215613a3957613a386139c1565b5b6000613a4784828501613a0e565b91505092915050565b60008115159050919050565b613a6581613a50565b82525050565b6000602082019050613a806000830184613a5c565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613ab182613a86565b9050919050565b613ac181613aa6565b8114613acc57600080fd5b50565b600081359050613ade81613ab8565b92915050565b60006bffffffffffffffffffffffff82169050919050565b613b0581613ae4565b8114613b1057600080fd5b50565b600081359050613b2281613afc565b92915050565b60008060408385031215613b3f57613b3e6139c1565b5b6000613b4d85828601613acf565b9250506020613b5e85828601613b13565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613ba2578082015181840152602081019050613b87565b60008484015250505050565b6000601f19601f8301169050919050565b6000613bca82613b68565b613bd48185613b73565b9350613be4818560208601613b84565b613bed81613bae565b840191505092915050565b60006020820190508181036000830152613c128184613bbf565b905092915050565b6000819050919050565b613c2d81613c1a565b8114613c3857600080fd5b50565b600081359050613c4a81613c24565b92915050565b600060208284031215613c6657613c656139c1565b5b6000613c7484828501613c3b565b91505092915050565b613c8681613aa6565b82525050565b6000602082019050613ca16000830184613c7d565b92915050565b60008060408385031215613cbe57613cbd6139c1565b5b6000613ccc85828601613acf565b9250506020613cdd85828601613c3b565b9150509250929050565b6000613cf282613a86565b9050919050565b613d0281613ce7565b82525050565b6000602082019050613d1d6000830184613cf9565b92915050565b613d2c81613c1a565b82525050565b6000602082019050613d476000830184613d23565b92915050565b6000819050919050565b6000613d72613d6d613d6884613a86565b613d4d565b613a86565b9050919050565b6000613d8482613d57565b9050919050565b6000613d9682613d79565b9050919050565b613da681613d8b565b82525050565b6000602082019050613dc16000830184613d9d565b92915050565b600080600060608486031215613de057613ddf6139c1565b5b6000613dee86828701613acf565b9350506020613dff86828701613acf565b9250506040613e1086828701613c3b565b9150509250925092565b60008060408385031215613e3157613e306139c1565b5b6000613e3f85828601613c3b565b9250506020613e5085828601613c3b565b9150509250929050565b6000604082019050613e6f6000830185613c7d565b613e7c6020830184613d23565b9392505050565b6000613e8e82613d79565b9050919050565b613e9e81613e83565b82525050565b6000602082019050613eb96000830184613e95565b92915050565b613ec881613ce7565b8114613ed357600080fd5b50565b600081359050613ee581613ebf565b92915050565b600060208284031215613f0157613f006139c1565b5b6000613f0f84828501613ed6565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613f5a82613bae565b810181811067ffffffffffffffff82111715613f7957613f78613f22565b5b80604052505050565b6000613f8c6139b7565b9050613f988282613f51565b919050565b600067ffffffffffffffff821115613fb857613fb7613f22565b5b613fc182613bae565b9050602081019050919050565b82818337600083830152505050565b6000613ff0613feb84613f9d565b613f82565b90508281526020810184848401111561400c5761400b613f1d565b5b614017848285613fce565b509392505050565b600082601f83011261403457614033613f18565b5b8135614044848260208601613fdd565b91505092915050565b600060208284031215614063576140626139c1565b5b600082013567ffffffffffffffff811115614081576140806139c6565b5b61408d8482850161401f565b91505092915050565b6000602082840312156140ac576140ab6139c1565b5b60006140ba84828501613acf565b91505092915050565b6140cc81613a50565b81146140d757600080fd5b50565b6000813590506140e9816140c3565b92915050565b60008060408385031215614106576141056139c1565b5b600061411485828601613acf565b9250506020614125858286016140da565b9150509250929050565b600067ffffffffffffffff82111561414a57614149613f22565b5b61415382613bae565b9050602081019050919050565b600061417361416e8461412f565b613f82565b90508281526020810184848401111561418f5761418e613f1d565b5b61419a848285613fce565b509392505050565b600082601f8301126141b7576141b6613f18565b5b81356141c7848260208601614160565b91505092915050565b600080600080608085870312156141ea576141e96139c1565b5b60006141f887828801613acf565b945050602061420987828801613acf565b935050604061421a87828801613c3b565b925050606085013567ffffffffffffffff81111561423b5761423a6139c6565b5b614247878288016141a2565b91505092959194509250565b6000806000806080858703121561426d5761426c6139c1565b5b600061427b87828801613c3b565b945050602061428c87828801613c3b565b935050604061429d87828801613c3b565b92505060606142ae87828801613c3b565b91505092959194509250565b600080604083850312156142d1576142d06139c1565b5b60006142df85828601613acf565b92505060206142f085828601613acf565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061434157607f821691505b602082108103614354576143536142fa565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006143b6602183613b73565b91506143c18261435a565b604082019050919050565b600060208201905081810360008301526143e5816143a9565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000614448603d83613b73565b9150614453826143ec565b604082019050919050565b600060208201905081810360008301526144778161443b565b9050919050565b60008151905061448d81613c24565b92915050565b6000602082840312156144a9576144a86139c1565b5b60006144b78482850161447e565b91505092915050565b60006144cb82613d79565b9050919050565b6144db816144c0565b82525050565b60006040820190506144f660008301856144d2565b6145036020830184613d23565b9392505050565b600081519050614519816140c3565b92915050565b600060208284031215614535576145346139c1565b5b60006145438482850161450a565b91505092915050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b60006145a8602d83613b73565b91506145b38261454c565b604082019050919050565b600060208201905081810360008301526145d78161459b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061461882613c1a565b915061462383613c1a565b925082820261463181613c1a565b91508282048414831517614648576146476145de565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061468982613c1a565b915061469483613c1a565b9250826146a4576146a361464f565b5b828204905092915050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b600061470b602b83613b73565b9150614716826146af565b604082019050919050565b6000602082019050818103600083015261473a816146fe565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b600061479d602c83613b73565b91506147a882614741565b604082019050919050565b600060208201905081810360008301526147cc81614790565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026148647fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614827565b61486e8683614827565b95508019841693508086168417925050509392505050565b60006148a161489c61489784613c1a565b613d4d565b613c1a565b9050919050565b6000819050919050565b6148bb83614886565b6148cf6148c7826148a8565b848454614834565b825550505050565b600090565b6148e46148d7565b6148ef8184846148b2565b505050565b5b81811015614913576149086000826148dc565b6001810190506148f5565b5050565b601f8211156149585761492981614802565b61493284614817565b81016020851015614941578190505b61495561494d85614817565b8301826148f4565b50505b505050565b600082821c905092915050565b600061497b6000198460080261495d565b1980831691505092915050565b6000614994838361496a565b9150826002028217905092915050565b6149ad82613b68565b67ffffffffffffffff8111156149c6576149c5613f22565b5b6149d08254614329565b6149db828285614917565b600060209050601f831160018114614a0e57600084156149fc578287015190505b614a068582614988565b865550614a6e565b601f198416614a1c86614802565b60005b82811015614a4457848901518255600182019150602085019450602081019050614a1f565b86831015614a615784890151614a5d601f89168261496a565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000614aac601883613b73565b9150614ab782614a76565b602082019050919050565b60006020820190508181036000830152614adb81614a9f565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000614b3e602983613b73565b9150614b4982614ae2565b604082019050919050565b60006020820190508181036000830152614b6d81614b31565b9050919050565b7f53616c65206d7573742062652061637469766520746f206d696e740000000000600082015250565b6000614baa601b83613b73565b9150614bb582614b74565b602082019050919050565b60006020820190508181036000830152614bd981614b9d565b9050919050565b6000614beb82613c1a565b9150614bf683613c1a565b9250828201905080821115614c0e57614c0d6145de565b5b92915050565b7f45786365656473204d41585f535550504c590000000000000000000000000000600082015250565b6000614c4a601283613b73565b9150614c5582614c14565b602082019050919050565b60006020820190508181036000830152614c7981614c3d565b9050919050565b7f4d757374206d696e74206174206c65617374206f6e6520746f6b656e00000000600082015250565b6000614cb6601c83613b73565b9150614cc182614c80565b602082019050919050565b60006020820190508181036000830152614ce581614ca9565b9050919050565b7f496e636f72726563742043524f2076616c75652073656e740000000000000000600082015250565b6000614d22601883613b73565b9150614d2d82614cec565b602082019050919050565b60006020820190508181036000830152614d5181614d15565b9050919050565b7f53686f756c64206e6f742073656e642043524f207768656e206d696e74696e6760008201527f207769746820424f4f0000000000000000000000000000000000000000000000602082015250565b6000614db4602983613b73565b9150614dbf82614d58565b604082019050919050565b60006020820190508181036000830152614de381614da7565b9050919050565b6000606082019050614dff6000830186613c7d565b614e0c6020830185613c7d565b614e196040830184613d23565b949350505050565b7f4661696c656420746f207472616e7366657220424f4f20746f6b656e73000000600082015250565b6000614e57601d83613b73565b9150614e6282614e21565b602082019050919050565b60006020820190508181036000830152614e8681614e4a565b9050919050565b6000614e9882613c1a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614eca57614ec96145de565b5b600182019050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000614f31602f83613b73565b9150614f3c82614ed5565b604082019050919050565b60006020820190508181036000830152614f6081614f24565b9050919050565b600081905092915050565b6000614f7d82613b68565b614f878185614f67565b9350614f97818560208601613b84565b80840191505092915050565b60008154614fb081614329565b614fba8186614f67565b94506001821660008114614fd55760018114614fea5761501d565b60ff198316865281151582028601935061501d565b614ff385614802565b60005b8381101561501557815481890152600182019150602081019050614ff6565b838801955050505b50505092915050565b60006150328286614f72565b915061503e8285614f72565b915061504a8284614fa3565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006150b3602683613b73565b91506150be82615057565b604082019050919050565b600060208201905081810360008301526150e2816150a6565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061511f602083613b73565b915061512a826150e9565b602082019050919050565b6000602082019050818103600083015261514e81615112565b9050919050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b60006151b1602a83613b73565b91506151bc82615155565b604082019050919050565b600060208201905081810360008301526151e0816151a4565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b600061521d601983613b73565b9150615228826151e7565b602082019050919050565b6000602082019050818103600083015261524c81615210565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b60006152af602583613b73565b91506152ba82615253565b604082019050919050565b600060208201905081810360008301526152de816152a2565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000615341602483613b73565b915061534c826152e5565b604082019050919050565b6000602082019050818103600083015261537081615334565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b60006153ad601f83613b73565b91506153b882615377565b602082019050919050565b600060208201905081810360008301526153dc816153a0565b9050919050565b6000819050919050565b6153fe6153f982613c1a565b6153e3565b82525050565b600061541082856153ed565b60208201915061542082846153ed565b6020820191508190509392505050565b600061543b82613c1a565b915061544683613c1a565b9250826154565761545561464f565b5b828206905092915050565b600061546d82866153ed565b60208201915061547d82856153ed565b60208201915061548d82846153ed565b602082019150819050949350505050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006154d4601983613b73565b91506154df8261549e565b602082019050919050565b60006020820190508181036000830152615503816154c7565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000615566603283613b73565b91506155718261550a565b604082019050919050565b6000602082019050818103600083015261559581615559565b9050919050565b7f455243373231456e756d657261626c653a20636f6e736563757469766520747260008201527f616e7366657273206e6f7420737570706f727465640000000000000000000000602082015250565b60006155f8603583613b73565b91506156038261559c565b604082019050919050565b60006020820190508181036000830152615627816155eb565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006156558261562e565b61565f8185615639565b935061566f818560208601613b84565b61567881613bae565b840191505092915050565b60006080820190506156986000830187613c7d565b6156a56020830186613c7d565b6156b26040830185613d23565b81810360608301526156c4818461564a565b905095945050505050565b6000815190506156de816139f7565b92915050565b6000602082840312156156fa576156f96139c1565b5b6000615708848285016156cf565b91505092915050565b600061571c82613c1a565b915061572783613c1a565b925082820390508181111561573f5761573e6145de565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b60006157aa602083613b73565b91506157b582615774565b602082019050919050565b600060208201905081810360008301526157d98161579d565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000615816601c83613b73565b9150615821826157e0565b602082019050919050565b6000602082019050818103600083015261584581615809565b905091905056fea2646970667358221220bd9641bb339eefb85d23f57bf483c156ae53b20f96e66ad62d8ec900d7be859f64736f6c6343000811003368747470733a2f2f697066732e66696c65626173652e696f2f697066732f516d515a38426e437a627871394c4d6f336343333932536478513938316654415369436e686454487139375550502f
Deployed ByteCode Sourcemap
73737:7933:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;80592:213;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;80417: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;:::-;;;;;;;;79158:175;;;;;;;;;;;;;:::i;:::-;;53640:335;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39599:442;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;74684:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68029:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73821:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75316:89;;;;;;;;;;;;;:::i;:::-;;75981:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;78582:568;;;;;;;;;;;;;:::i;:::-;;54046:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74293:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68551:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73962:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;78472: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;:::-;;;;;;;;76461:1242;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53183:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54302:322;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76329:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76109:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;80813:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;80859:649;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75798:175;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74391:96;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75413:377;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;81516:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76209:112;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74037:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53409:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74786:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24058:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;80592:213;80732:4;80761:36;80785:11;80761:23;:36::i;:::-;80754:43;;80592:213;;;:::o;80417:167::-;23038:13;:11;:13::i;:::-;80534:42:::1;80553:8;80563:12;80534:18;:42::i;:::-;80417: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;79158:175::-;23038:13;:11;:13::i;:::-;79215:15:::1;79233:8;;;;;;;;;;;:18;;;79260:4;79233:33;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;79215:51;;79277:8;;;;;;;;;;;:17;;;79295:20;;;;;;;;;;;79317:7;79277:48;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;79204:129;79158: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;75316:89::-;23038:13;:11;:13::i;:::-;75385:12:::1;;;;;;;;;;;75384:13;75369:12;;:28;;;;;;;;;;;;;;;;;;75316:89::o:0;75981:120::-;23038:13;:11;:13::i;:::-;76080::::1;76065:12;;:28;;;;;;;;;;;;;;;;;;75981:120:::0;:::o;78582:568::-;23038:13;:11;:13::i;:::-;78630:15:::1;78648:21;78630:39;;78680:24;78724:3;78718:2;78708:7;:12;;;;:::i;:::-;78707:20;;;;:::i;:::-;78680:47;;78738:25;78783:3;78777:2;78767:7;:12;;;;:::i;:::-;78766:20;;;;:::i;:::-;78738:48;;78797:19;78835:3;78830:1;78820:7;:11;;;;:::i;:::-;78819:19;;;;:::i;:::-;78797:41;;78849:26;78894:3;78889:1;78879:7;:11;;;;:::i;:::-;78878:19;;;;:::i;:::-;78849:48;;78910:20;;;;;;;;;;;:29;;:47;78940:16;78910:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;78968:12;;;;;;;;;;;:21;;:40;78990:17;78968:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;79019:5;;;;;;;;;;;:14;;:27;79034:11;79019:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;79057:10;;;;;;;;;;;:19;;:32;79077:11;79057:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;79100:13;;;;;;;;;;;:22;;:42;79123:18;79100:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;78619:531;;;;;78582: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;78472:102::-;23038:13;:11;:13::i;:::-;78559:7:::1;78543:13;:23;;;;;;:::i;:::-;;78472: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;76461:1242::-;2345:21;:19;:21::i;:::-;76541:12:::1;;;;;;;;;;;76533:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;73858:4;76620:9;76604:13;:11;:13::i;:::-;:25;;;;:::i;:::-;:39;;76596:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;76697:1;76685:9;:13;76677:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;76802:13;76818:32;76839:10;76818:20;:32::i;:::-;76802:48;;76861:20;76884:25;:23;:25::i;:::-;76861:48;;76976:1;76952:26;;:12;:26;;::::0;76948:587:::1;;77056:5;77044:9;:17;;;;:::i;:::-;77031:9;:30;77023:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;76948:587;;;77190:1;77177:9;:14;77151:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;77309:8;;;;;;;;;;;:21;;;77353:10;77394:4;77434:5;77422:9;:17;;;;:::i;:::-;77309:149;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;77283:240;;;;;;;;;;;;:::i;:::-;;;;;;;;;76948:587;77552:9;77547:149;77571:9;77567:1;:13;77547:149;;;77602:18;77623:13;:11;:13::i;:::-;77602:34;;77651:33;77661:10;77673;77651:9;:33::i;:::-;77587:109;77582:3;;;;;:::i;:::-;;;;77547:149;;;;76522:1181;;2389:20:::0;:18;:20::i;:::-;76461:1242;:::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;76329:124::-;23038:13;:11;:13::i;:::-;76431:14:::1;76415:13;;:30;;;;;;;;;;;;;;;;;;76329:124:::0;:::o;76109:92::-;23038:13;:11;:13::i;:::-;76187:6:::1;76179:5;;:14;;;;;;;;;;;;;;;;;;76109:92:::0;:::o;80813:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;80859:649::-;80977:13;81030:16;81038:7;81030;:16::i;:::-;81008:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;81134:28;81165:10;:8;:10::i;:::-;81134:41;;81237:1;81212:14;81206:28;:32;:294;;;;;;;;;;;;;;;;;81330:14;81371:25;81388:7;81371:16;:25::i;:::-;81423:13;81287:172;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;81206:294;81186:314;;;80859:649;;;:::o;75798:175::-;23038:13;:11;:13::i;:::-;75944:21:::1;75921:20;;:44;;;;;;;;;;;;;;;;;;75798:175:::0;:::o;74391:96::-;;;;;;;;;;;;;:::o;75413:377::-;23038:13;:11;:13::i;:::-;75629:18:::1;75609:17;:38;;;;75675:15;75658:14;:32;;;;75721:18;75701:17;:38;;;;75767:15;75750:14;:32;;;;75413:377:::0;;;;:::o;81516:151::-;23038:13;:11;:13::i;:::-;81642:17:::1;81626:13;:33;;;;;;:::i;:::-;;81516:151:::0;:::o;76209:112::-;23038:13;:11;:13::i;:::-;76302:11:::1;76289:10;;:24;;;;;;;;;;;;;;;;;;76209: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;79341:602::-;79435:7;79460:15;79514:1;79478:17;;;;;;;;;;;:27;;;79506:4;79478:33;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:37;79460:55;;73911:3;79546:13;:11;:13::i;:::-;:31;:142;;;;73911:3;79612:1;:19;;;;:::i;:::-;79595:13;:11;:13::i;:::-;:36;;:92;;;;;73911:3;79668:1;:19;;;;:::i;:::-;79652:13;:11;:13::i;:::-;:35;79595:92;79546:142;79528:408;;;79756:10;:47;;79789:14;;79756:47;;;79769:17;;79756:47;79749:54;;;;;79528:408;79877:10;:47;;79910:14;;79877:47;;;79890:17;;79877:47;79870:54;;;79341:602;;;;:::o;79951:458::-;80009:7;73911:3;80047:13;:11;:13::i;:::-;:31;:142;;;;73911:3;80113:1;:19;;;;:::i;:::-;80096:13;:11;:13::i;:::-;:36;;:92;;;;;73911:3;80169:1;:19;;;;:::i;:::-;80153:13;:11;:13::i;:::-;:35;80096:92;80047:142;80029:373;;;80265:8;;;;;;;;;;;80250:24;;;;80029:373;80356:1;80341:17;;79951:458;;:::o;77711:639::-;77757:7;77777:16;73858:4;77845:16;77863:15;77828:51;;;;;;;;;:::i;:::-;;;;;;;;;;;;;77818:62;;;;;;77796:95;;:108;;;;:::i;:::-;77777:127;;77915:398;77922:21;77941:1;77930:8;:12;;;;:::i;:::-;77922:7;:21::i;:::-;77915:398;;;73858:4;78101:16;78148:15;78194:8;78054:175;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;78018:234;;;;;;77988:283;;:313;;;;:::i;:::-;77960:341;;77915:398;;;78341:1;78330:8;:12;;;;:::i;:::-;78323:19;;;77711: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;78358:106::-;78410:13;78443;78436:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;78358: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:174::-;35258:26;35254:1;35246:6;35242:14;35235:50;35118:174;:::o;35298:366::-;35440:3;35461:67;35525:2;35520:3;35461:67;:::i;:::-;35454:74;;35537:93;35626:3;35537:93;:::i;:::-;35655:2;35650:3;35646:12;35639:19;;35298:366;;;:::o;35670:419::-;35836:4;35874:2;35863:9;35859:18;35851:26;;35923:9;35917:4;35913:20;35909:1;35898:9;35894:17;35887:47;35951:131;36077:4;35951:131;:::i;:::-;35943:139;;35670:419;;;:::o;36095:228::-;36235:34;36231:1;36223:6;36219:14;36212:58;36304:11;36299:2;36291:6;36287:15;36280:36;36095:228;:::o;36329:366::-;36471:3;36492:67;36556:2;36551:3;36492:67;:::i;:::-;36485:74;;36568:93;36657:3;36568:93;:::i;:::-;36686:2;36681:3;36677:12;36670:19;;36329:366;;;:::o;36701:419::-;36867:4;36905:2;36894:9;36890:18;36882:26;;36954:9;36948:4;36944:20;36940:1;36929:9;36925:17;36918:47;36982:131;37108:4;36982:131;:::i;:::-;36974:139;;36701:419;;;:::o;37126:442::-;37275:4;37313:2;37302:9;37298:18;37290:26;;37326:71;37394:1;37383:9;37379:17;37370:6;37326:71;:::i;:::-;37407:72;37475:2;37464:9;37460:18;37451:6;37407:72;:::i;:::-;37489;37557:2;37546:9;37542:18;37533:6;37489:72;:::i;:::-;37126:442;;;;;;:::o;37574:179::-;37714:31;37710:1;37702:6;37698:14;37691:55;37574:179;:::o;37759:366::-;37901:3;37922:67;37986:2;37981:3;37922:67;:::i;:::-;37915:74;;37998:93;38087:3;37998:93;:::i;:::-;38116:2;38111:3;38107:12;38100:19;;37759:366;;;:::o;38131:419::-;38297:4;38335:2;38324:9;38320:18;38312:26;;38384:9;38378:4;38374:20;38370:1;38359:9;38355:17;38348:47;38412:131;38538:4;38412:131;:::i;:::-;38404:139;;38131:419;;;:::o;38556:233::-;38595:3;38618:24;38636:5;38618:24;:::i;:::-;38609:33;;38664:66;38657:5;38654:77;38651:103;;38734:18;;:::i;:::-;38651:103;38781:1;38774:5;38770:13;38763:20;;38556:233;;;:::o;38795:234::-;38935:34;38931:1;38923:6;38919:14;38912:58;39004:17;38999:2;38991:6;38987:15;38980:42;38795:234;:::o;39035:366::-;39177:3;39198:67;39262:2;39257:3;39198:67;:::i;:::-;39191:74;;39274:93;39363:3;39274:93;:::i;:::-;39392:2;39387:3;39383:12;39376:19;;39035:366;;;:::o;39407:419::-;39573:4;39611:2;39600:9;39596:18;39588:26;;39660:9;39654:4;39650:20;39646:1;39635:9;39631:17;39624:47;39688:131;39814:4;39688:131;:::i;:::-;39680:139;;39407:419;;;:::o;39832:148::-;39934:11;39971:3;39956:18;;39832:148;;;;:::o;39986:390::-;40092:3;40120:39;40153:5;40120:39;:::i;:::-;40175:89;40257:6;40252:3;40175:89;:::i;:::-;40168:96;;40273:65;40331:6;40326:3;40319:4;40312:5;40308:16;40273:65;:::i;:::-;40363:6;40358:3;40354:16;40347:23;;40096:280;39986:390;;;;:::o;40406:874::-;40509:3;40546:5;40540:12;40575:36;40601:9;40575:36;:::i;:::-;40627:89;40709:6;40704:3;40627:89;:::i;:::-;40620:96;;40747:1;40736:9;40732:17;40763:1;40758:166;;;;40938:1;40933:341;;;;40725:549;;40758:166;40842:4;40838:9;40827;40823:25;40818:3;40811:38;40904:6;40897:14;40890:22;40882:6;40878:35;40873:3;40869:45;40862:52;;40758:166;;40933:341;41000:38;41032:5;41000:38;:::i;:::-;41060:1;41074:154;41088:6;41085:1;41082:13;41074:154;;;41162:7;41156:14;41152:1;41147:3;41143:11;41136:35;41212:1;41203:7;41199:15;41188:26;;41110:4;41107:1;41103:12;41098:17;;41074:154;;;41257:6;41252:3;41248:16;41241:23;;40940:334;;40725:549;;40513:767;;40406:874;;;;:::o;41286:589::-;41511:3;41533:95;41624:3;41615:6;41533:95;:::i;:::-;41526:102;;41645:95;41736:3;41727:6;41645:95;:::i;:::-;41638:102;;41757:92;41845:3;41836:6;41757:92;:::i;:::-;41750:99;;41866:3;41859:10;;41286:589;;;;;;:::o;41881:225::-;42021:34;42017:1;42009:6;42005:14;41998:58;42090:8;42085:2;42077:6;42073:15;42066:33;41881:225;:::o;42112:366::-;42254:3;42275:67;42339:2;42334:3;42275:67;:::i;:::-;42268:74;;42351:93;42440:3;42351:93;:::i;:::-;42469:2;42464:3;42460:12;42453:19;;42112:366;;;:::o;42484:419::-;42650:4;42688:2;42677:9;42673:18;42665:26;;42737:9;42731:4;42727:20;42723:1;42712:9;42708:17;42701:47;42765:131;42891:4;42765:131;:::i;:::-;42757:139;;42484:419;;;:::o;42909:182::-;43049:34;43045:1;43037:6;43033:14;43026:58;42909:182;:::o;43097:366::-;43239:3;43260:67;43324:2;43319:3;43260:67;:::i;:::-;43253:74;;43336:93;43425:3;43336:93;:::i;:::-;43454:2;43449:3;43445:12;43438:19;;43097:366;;;:::o;43469:419::-;43635:4;43673:2;43662:9;43658:18;43650:26;;43722:9;43716:4;43712:20;43708:1;43697:9;43693:17;43686:47;43750:131;43876:4;43750:131;:::i;:::-;43742:139;;43469:419;;;:::o;43894:229::-;44034:34;44030:1;44022:6;44018:14;44011:58;44103:12;44098:2;44090:6;44086:15;44079:37;43894:229;:::o;44129:366::-;44271:3;44292:67;44356:2;44351:3;44292:67;:::i;:::-;44285:74;;44368:93;44457:3;44368:93;:::i;:::-;44486:2;44481:3;44477:12;44470:19;;44129:366;;;:::o;44501:419::-;44667:4;44705:2;44694:9;44690:18;44682:26;;44754:9;44748:4;44744:20;44740:1;44729:9;44725:17;44718:47;44782:131;44908:4;44782:131;:::i;:::-;44774:139;;44501:419;;;:::o;44926:175::-;45066:27;45062:1;45054:6;45050:14;45043:51;44926:175;:::o;45107:366::-;45249:3;45270:67;45334:2;45329:3;45270:67;:::i;:::-;45263:74;;45346:93;45435:3;45346:93;:::i;:::-;45464:2;45459:3;45455:12;45448:19;;45107:366;;;:::o;45479:419::-;45645:4;45683:2;45672:9;45668:18;45660:26;;45732:9;45726:4;45722:20;45718:1;45707:9;45703:17;45696:47;45760:131;45886:4;45760:131;:::i;:::-;45752:139;;45479:419;;;:::o;45904:224::-;46044:34;46040:1;46032:6;46028:14;46021:58;46113:7;46108:2;46100:6;46096:15;46089:32;45904:224;:::o;46134:366::-;46276:3;46297:67;46361:2;46356:3;46297:67;:::i;:::-;46290:74;;46373:93;46462:3;46373:93;:::i;:::-;46491:2;46486:3;46482:12;46475:19;;46134:366;;;:::o;46506:419::-;46672:4;46710:2;46699:9;46695:18;46687:26;;46759:9;46753:4;46749:20;46745:1;46734:9;46730:17;46723:47;46787:131;46913:4;46787:131;:::i;:::-;46779:139;;46506:419;;;:::o;46931:223::-;47071:34;47067:1;47059:6;47055:14;47048:58;47140:6;47135:2;47127:6;47123:15;47116:31;46931:223;:::o;47160:366::-;47302:3;47323:67;47387:2;47382:3;47323:67;:::i;:::-;47316:74;;47399:93;47488:3;47399:93;:::i;:::-;47517:2;47512:3;47508:12;47501:19;;47160:366;;;:::o;47532:419::-;47698:4;47736:2;47725:9;47721:18;47713:26;;47785:9;47779:4;47775:20;47771:1;47760:9;47756:17;47749:47;47813:131;47939:4;47813:131;:::i;:::-;47805:139;;47532:419;;;:::o;47957:181::-;48097:33;48093:1;48085:6;48081:14;48074:57;47957:181;:::o;48144:366::-;48286:3;48307:67;48371:2;48366:3;48307:67;:::i;:::-;48300:74;;48383:93;48472:3;48383:93;:::i;:::-;48501:2;48496:3;48492:12;48485:19;;48144:366;;;:::o;48516:419::-;48682:4;48720:2;48709:9;48705:18;48697:26;;48769:9;48763:4;48759:20;48755:1;48744:9;48740:17;48733:47;48797:131;48923:4;48797:131;:::i;:::-;48789:139;;48516:419;;;:::o;48941:79::-;48980:7;49009:5;48998:16;;48941:79;;;:::o;49026:157::-;49131:45;49151:24;49169:5;49151:24;:::i;:::-;49131:45;:::i;:::-;49126:3;49119:58;49026:157;;:::o;49189:397::-;49329:3;49344:75;49415:3;49406:6;49344:75;:::i;:::-;49444:2;49439:3;49435:12;49428:19;;49457:75;49528:3;49519:6;49457:75;:::i;:::-;49557:2;49552:3;49548:12;49541:19;;49577:3;49570:10;;49189:397;;;;;:::o;49592:176::-;49624:1;49641:20;49659:1;49641:20;:::i;:::-;49636:25;;49675:20;49693:1;49675:20;:::i;:::-;49670:25;;49714:1;49704:35;;49719:18;;:::i;:::-;49704:35;49760:1;49757;49753:9;49748:14;;49592:176;;;;:::o;49774:538::-;49942:3;49957:75;50028:3;50019:6;49957:75;:::i;:::-;50057:2;50052:3;50048:12;50041:19;;50070:75;50141:3;50132:6;50070:75;:::i;:::-;50170:2;50165:3;50161:12;50154:19;;50183:75;50254:3;50245:6;50183:75;:::i;:::-;50283:2;50278:3;50274:12;50267:19;;50303:3;50296:10;;49774:538;;;;;;:::o;50318:175::-;50458:27;50454:1;50446:6;50442:14;50435:51;50318:175;:::o;50499:366::-;50641:3;50662:67;50726:2;50721:3;50662:67;:::i;:::-;50655:74;;50738:93;50827:3;50738:93;:::i;:::-;50856:2;50851:3;50847:12;50840:19;;50499:366;;;:::o;50871:419::-;51037:4;51075:2;51064:9;51060:18;51052:26;;51124:9;51118:4;51114:20;51110:1;51099:9;51095:17;51088:47;51152:131;51278:4;51152:131;:::i;:::-;51144:139;;50871:419;;;:::o;51296:237::-;51436:34;51432:1;51424:6;51420:14;51413:58;51505:20;51500:2;51492:6;51488:15;51481:45;51296:237;:::o;51539:366::-;51681:3;51702:67;51766:2;51761:3;51702:67;:::i;:::-;51695:74;;51778:93;51867:3;51778:93;:::i;:::-;51896:2;51891:3;51887:12;51880:19;;51539:366;;;:::o;51911:419::-;52077:4;52115:2;52104:9;52100:18;52092:26;;52164:9;52158:4;52154:20;52150:1;52139:9;52135:17;52128:47;52192:131;52318:4;52192:131;:::i;:::-;52184:139;;51911:419;;;:::o;52336:240::-;52476:34;52472:1;52464:6;52460:14;52453:58;52545:23;52540:2;52532:6;52528:15;52521:48;52336:240;:::o;52582:366::-;52724:3;52745:67;52809:2;52804:3;52745:67;:::i;:::-;52738:74;;52821:93;52910:3;52821:93;:::i;:::-;52939:2;52934:3;52930:12;52923:19;;52582:366;;;:::o;52954:419::-;53120:4;53158:2;53147:9;53143:18;53135:26;;53207:9;53201:4;53197:20;53193:1;53182:9;53178:17;53171:47;53235:131;53361:4;53235:131;:::i;:::-;53227:139;;52954:419;;;:::o;53379:98::-;53430:6;53464:5;53458:12;53448:22;;53379:98;;;:::o;53483:168::-;53566:11;53600:6;53595:3;53588:19;53640:4;53635:3;53631:14;53616:29;;53483:168;;;;:::o;53657:373::-;53743:3;53771:38;53803:5;53771:38;:::i;:::-;53825:70;53888:6;53883:3;53825:70;:::i;:::-;53818:77;;53904:65;53962:6;53957:3;53950:4;53943:5;53939:16;53904:65;:::i;:::-;53994:29;54016:6;53994:29;:::i;:::-;53989:3;53985:39;53978:46;;53747:283;53657:373;;;;:::o;54036:640::-;54231:4;54269:3;54258:9;54254:19;54246:27;;54283:71;54351:1;54340:9;54336:17;54327:6;54283:71;:::i;:::-;54364:72;54432:2;54421:9;54417:18;54408:6;54364:72;:::i;:::-;54446;54514:2;54503:9;54499:18;54490:6;54446:72;:::i;:::-;54565:9;54559:4;54555:20;54550:2;54539:9;54535:18;54528:48;54593:76;54664:4;54655:6;54593:76;:::i;:::-;54585:84;;54036:640;;;;;;;:::o;54682:141::-;54738:5;54769:6;54763:13;54754:22;;54785:32;54811:5;54785:32;:::i;:::-;54682:141;;;;:::o;54829:349::-;54898:6;54947:2;54935:9;54926:7;54922:23;54918:32;54915:119;;;54953:79;;:::i;:::-;54915:119;55073:1;55098:63;55153:7;55144:6;55133:9;55129:22;55098:63;:::i;:::-;55088:73;;55044:127;54829:349;;;;:::o;55184:194::-;55224:4;55244:20;55262:1;55244:20;:::i;:::-;55239:25;;55278:20;55296:1;55278:20;:::i;:::-;55273:25;;55322:1;55319;55315:9;55307:17;;55346:1;55340:4;55337:11;55334:37;;;55351:18;;:::i;:::-;55334:37;55184:194;;;;:::o;55384:180::-;55432:77;55429:1;55422:88;55529:4;55526:1;55519:15;55553:4;55550:1;55543:15;55570:182;55710:34;55706:1;55698:6;55694:14;55687:58;55570:182;:::o;55758:366::-;55900:3;55921:67;55985:2;55980:3;55921:67;:::i;:::-;55914:74;;55997:93;56086:3;55997:93;:::i;:::-;56115:2;56110:3;56106:12;56099:19;;55758:366;;;:::o;56130:419::-;56296:4;56334:2;56323:9;56319:18;56311:26;;56383:9;56377:4;56373:20;56369:1;56358:9;56354:17;56347:47;56411:131;56537:4;56411:131;:::i;:::-;56403:139;;56130:419;;;:::o;56555:178::-;56695:30;56691:1;56683:6;56679:14;56672:54;56555:178;:::o;56739:366::-;56881:3;56902:67;56966:2;56961:3;56902:67;:::i;:::-;56895:74;;56978:93;57067:3;56978:93;:::i;:::-;57096:2;57091:3;57087:12;57080:19;;56739:366;;;:::o;57111:419::-;57277:4;57315:2;57304:9;57300:18;57292:26;;57364:9;57358:4;57354:20;57350:1;57339:9;57335:17;57328:47;57392:131;57518:4;57392:131;:::i;:::-;57384:139;;57111:419;;;:::o
Swarm Source
ipfs://bd9641bb339eefb85d23f57bf483c156ae53b20f96e66ad62d8ec900d7be859f