Overview
TokenID
623
Total Transfers
-
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Generic
Compiler Version
v0.8.19+commit.7dd6d404
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-04-27 */ // File: operator-filter-registry/src/lib/Constants.sol pragma solidity ^0.8.13; address constant CANONICAL_OPERATOR_FILTER_REGISTRY_ADDRESS = 0x000000000000AAeB6D7670E522A718067333cd4E; address constant CANONICAL_CORI_SUBSCRIPTION = 0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6; // File: operator-filter-registry/src/IOperatorFilterRegistry.sol pragma solidity ^0.8.13; interface IOperatorFilterRegistry { /** * @notice Returns true if operator is not filtered for a given token, either by address or codeHash. Also returns * true if supplied registrant address is not registered. */ function isOperatorAllowed(address registrant, address operator) external view returns (bool); /** * @notice Registers an address with the registry. May be called by address itself or by EIP-173 owner. */ function register(address registrant) external; /** * @notice Registers an address with the registry and "subscribes" to another address's filtered operators and codeHashes. */ function registerAndSubscribe(address registrant, address subscription) external; /** * @notice Registers an address with the registry and copies the filtered operators and codeHashes from another * address without subscribing. */ function registerAndCopyEntries(address registrant, address registrantToCopy) external; /** * @notice Unregisters an address with the registry and removes its subscription. May be called by address itself or by EIP-173 owner. * Note that this does not remove any filtered addresses or codeHashes. * Also note that any subscriptions to this registrant will still be active and follow the existing filtered addresses and codehashes. */ function unregister(address addr) external; /** * @notice Update an operator address for a registered address - when filtered is true, the operator is filtered. */ function updateOperator(address registrant, address operator, bool filtered) external; /** * @notice Update multiple operators for a registered address - when filtered is true, the operators will be filtered. Reverts on duplicates. */ function updateOperators(address registrant, address[] calldata operators, bool filtered) external; /** * @notice Update a codeHash for a registered address - when filtered is true, the codeHash is filtered. */ function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external; /** * @notice Update multiple codeHashes for a registered address - when filtered is true, the codeHashes will be filtered. Reverts on duplicates. */ function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external; /** * @notice Subscribe an address to another registrant's filtered operators and codeHashes. Will remove previous * subscription if present. * Note that accounts with subscriptions may go on to subscribe to other accounts - in this case, * subscriptions will not be forwarded. Instead the former subscription's existing entries will still be * used. */ function subscribe(address registrant, address registrantToSubscribe) external; /** * @notice Unsubscribe an address from its current subscribed registrant, and optionally copy its filtered operators and codeHashes. */ function unsubscribe(address registrant, bool copyExistingEntries) external; /** * @notice Get the subscription address of a given registrant, if any. */ function subscriptionOf(address addr) external returns (address registrant); /** * @notice Get the set of addresses subscribed to a given registrant. * Note that order is not guaranteed as updates are made. */ function subscribers(address registrant) external returns (address[] memory); /** * @notice Get the subscriber at a given index in the set of addresses subscribed to a given registrant. * Note that order is not guaranteed as updates are made. */ function subscriberAt(address registrant, uint256 index) external returns (address); /** * @notice Copy filtered operators and codeHashes from a different registrantToCopy to addr. */ function copyEntriesOf(address registrant, address registrantToCopy) external; /** * @notice Returns true if operator is filtered by a given address or its subscription. */ function isOperatorFiltered(address registrant, address operator) external returns (bool); /** * @notice Returns true if the hash of an address's code is filtered by a given address or its subscription. */ function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool); /** * @notice Returns true if a codeHash is filtered by a given address or its subscription. */ function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool); /** * @notice Returns a list of filtered operators for a given address or its subscription. */ function filteredOperators(address addr) external returns (address[] memory); /** * @notice Returns the set of filtered codeHashes for a given address or its subscription. * Note that order is not guaranteed as updates are made. */ function filteredCodeHashes(address addr) external returns (bytes32[] memory); /** * @notice Returns the filtered operator at the given index of the set of filtered operators for a given address or * its subscription. * Note that order is not guaranteed as updates are made. */ function filteredOperatorAt(address registrant, uint256 index) external returns (address); /** * @notice Returns the filtered codeHash at the given index of the list of filtered codeHashes for a given address or * its subscription. * Note that order is not guaranteed as updates are made. */ function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32); /** * @notice Returns true if an address has registered */ function isRegistered(address addr) external returns (bool); /** * @dev Convenience method to compute the code hash of an arbitrary contract */ function codeHashOf(address addr) external returns (bytes32); } // File: operator-filter-registry/src/OperatorFilterer.sol pragma solidity ^0.8.13; /** * @title OperatorFilterer * @notice Abstract contract whose constructor automatically registers and optionally subscribes to or copies another * registrant's entries in the OperatorFilterRegistry. * @dev This smart contract is meant to be inherited by token contracts so they can use the following: * - `onlyAllowedOperator` modifier for `transferFrom` and `safeTransferFrom` methods. * - `onlyAllowedOperatorApproval` modifier for `approve` and `setApprovalForAll` methods. * Please note that if your token contract does not provide an owner with EIP-173, it must provide * administration methods on the contract itself to interact with the registry otherwise the subscription * will be locked to the options set during construction. */ abstract contract OperatorFilterer { /// @dev Emitted when an operator is not allowed. error OperatorNotAllowed(address operator); IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY = IOperatorFilterRegistry(CANONICAL_OPERATOR_FILTER_REGISTRY_ADDRESS); /// @dev The constructor that is called when the contract is being deployed. constructor(address subscriptionOrRegistrantToCopy, bool subscribe) { // If an inheriting token contract is deployed to a network without the registry deployed, the modifier // will not revert, but the contract will need to be registered with the registry once it is deployed in // order for the modifier to filter addresses. if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) { if (subscribe) { OPERATOR_FILTER_REGISTRY.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy); } else { if (subscriptionOrRegistrantToCopy != address(0)) { OPERATOR_FILTER_REGISTRY.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy); } else { OPERATOR_FILTER_REGISTRY.register(address(this)); } } } } /** * @dev A helper function to check if an operator is allowed. */ modifier onlyAllowedOperator(address from) virtual { // Allow spending tokens from addresses with balance // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred // from an EOA. if (from != msg.sender) { _checkFilterOperator(msg.sender); } _; } /** * @dev A helper function to check if an operator approval is allowed. */ modifier onlyAllowedOperatorApproval(address operator) virtual { _checkFilterOperator(operator); _; } /** * @dev A helper function to check if an operator is allowed. */ function _checkFilterOperator(address operator) internal view virtual { // Check registry code length to facilitate testing in environments without a deployed registry. if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) { // under normal circumstances, this function will revert rather than return false, but inheriting contracts // may specify their own OperatorFilterRegistry implementations, which may behave differently if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) { revert OperatorNotAllowed(operator); } } } } // File: @openzeppelin/contracts/utils/Counters.sol // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } // 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/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: address zero is not a valid owner"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _ownerOf(tokenId); require(owner != address(0), "ERC721: invalid token ID"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { _requireMinted(tokenId); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not token owner or approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { _requireMinted(tokenId); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved"); _safeTransfer(from, to, tokenId, data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist */ function _ownerOf(uint256 tokenId) internal view virtual returns (address) { return _owners[tokenId]; } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _ownerOf(tokenId) != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { address owner = ERC721.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId, 1); // Check that tokenId was not minted by `_beforeTokenTransfer` hook require(!_exists(tokenId), "ERC721: token already minted"); unchecked { // Will not overflow unless all 2**256 token ids are minted to the same owner. // Given that tokens are minted one by one, it is impossible in practice that // this ever happens. Might change if we allow batch minting. // The ERC fails to describe this case. _balances[to] += 1; } _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId, 1); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * This is an internal function that does not check if the sender is authorized to operate on the token. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId, 1); // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook owner = ERC721.ownerOf(tokenId); // Clear approvals delete _tokenApprovals[tokenId]; unchecked { // Cannot overflow, as that would require more tokens to be burned/transferred // out than the owner initially received through minting and transferring in. _balances[owner] -= 1; } delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId, 1); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId, 1); // Check that tokenId was not transferred by `_beforeTokenTransfer` hook require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); // Clear approvals from the previous owner delete _tokenApprovals[tokenId]; unchecked { // `_balances[from]` cannot overflow for the same reason as described in `_burn`: // `from`'s balance is the number of token held, which is at least one before the current // transfer. // `_balances[to]` could overflow in the conditions described in `_mint`. That would require // all 2**256 token ids to be minted, which in practice is impossible. _balances[from] -= 1; _balances[to] += 1; } _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId, 1); } /** * @dev Approve `to` to operate on `tokenId` * * Emits an {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits an {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Reverts if the `tokenId` has not been minted yet. */ function _requireMinted(uint256 tokenId) internal view virtual { require(_exists(tokenId), "ERC721: invalid token ID"); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { /// @solidity memory-safe-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting and burning. If {ERC721Consecutive} is * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`. * - When `from` is zero, the tokens will be minted for `to`. * - When `to` is zero, ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * - `batchSize` is non-zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256, /* firstTokenId */ uint256 batchSize ) internal virtual { if (batchSize > 1) { if (from != address(0)) { _balances[from] -= batchSize; } if (to != address(0)) { _balances[to] += batchSize; } } } /** * @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`. * - When `from` is zero, the tokens were minted for `to`. * - When `to` is zero, ``from``'s tokens were burned. * - `from` and `to` are never both zero. * - `batchSize` is non-zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 firstTokenId, uint256 batchSize ) internal virtual {} } // File: contracts/genesis-royalty.sol pragma solidity ^0.8.4; contract Generic is ERC721, ERC2981, OperatorFilterer, Ownable { using Address for address; using Counters for Counters.Counter; using Strings for uint256; bool public _paused = true; address private _signer; address public _withdrawalAccount; string public _baseUrl; Counters.Counter public _total; Counters.Counter public _reservedTotal; uint256 public _price; uint16 public _mintSupply; uint16 public _mintReserved; uint8 public _mintLimit; uint8 public _mintLimitWhitelist; mapping (address => uint16) private _addressMinted; mapping (address => uint256[]) private _addressBalance; bool public _isWhitelistOnly; uint8 public _phase = 1; struct Coupon { bytes32 r; bytes32 s; uint8 v; } constructor( address signer, address account, string memory baseUrl, uint256 price, uint16 supply, uint16 reserved, uint8 mintLimit, uint8 mintLimitWhitelist, bool isWhitelistOnly ) ERC721('Lendal Pro TSK','LPTTSK') OperatorFilterer(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6, true) { _signer = signer; _withdrawalAccount = account; _baseUrl = baseUrl; _price = price; _mintSupply = supply; _mintReserved = reserved; _mintLimit = mintLimit; _mintLimitWhitelist = mintLimitWhitelist; _isWhitelistOnly = isWhitelistOnly; } function getState() external view returns (string memory) { return string(abi.encodePacked( (_paused ? '1' : '0'), '_', (_isWhitelistOnly ? '1' : '0'), '_', Strings.toString(_total.current()), '_', Strings.toString(_reservedTotal.current()), '_', Strings.toString(_mintSupply), '_', Strings.toString(_mintReserved), '_', Strings.toString(_price), '_', Strings.toString(_mintLimit), '_', Strings.toString(_mintLimitWhitelist), '_', Strings.toString(_phase) )); } //pausing function togglePause(bool pause) external onlyOwner { _paused = pause; } //whitelist function setSigner(address signer) external onlyOwner { _signer = signer; } function toggleWhitelist(bool boolean) external onlyOwner { _isWhitelistOnly = boolean; } function _isVerifiedCoupon(bytes32 digest, Coupon memory coupon) internal view returns (bool) { address signer = ecrecover(digest,coupon.v,coupon.r,coupon.s); require(signer != address(0),'invalid sig'); return signer == _signer; } function _createMessageDigest(address _address) internal pure returns (bytes32) { return keccak256( abi.encodePacked( "\x19Ethereum Signed Message:\n32", keccak256(abi.encodePacked(_address)) ) ); } //set variables function setWithdrawalAccount(address account) external onlyOwner() { require(account != address(0)); require(account != address(this)); _withdrawalAccount = account; } function setPrice(uint256 newPrice) external onlyOwner() { _price = newPrice; } function setSupply(uint16 newLimit) external onlyOwner() { _mintSupply = newLimit; } function setReserve(uint16 newLimit) external onlyOwner() { _mintReserved = newLimit; } function setBaseURL(string memory newUrl) external onlyOwner() { _baseUrl = newUrl; } function setMintLimit(uint8 newLimit) external onlyOwner() { _mintLimit = newLimit; } function setWhitelistMintLimit(uint8 newLimit) external onlyOwner() { _mintLimitWhitelist = newLimit; } function setPhase(uint8 newPhase) external onlyOwner() { _phase = newPhase; } //token function tokenURI(uint256 tokenId) public view override returns (string memory) { //the tokenId must be minted require(_exists(tokenId),'missing token'); return string(abi.encodePacked(_baseUrl,tokenId.toString())); } function baseTokenURI() public view returns (string memory) { return _baseUrl; } //supply function totalSupply() external view returns (uint256) { return _total.current(); } //ownership and transfer function heldBalanceByAddress(address user) public view returns (uint16) { uint16 count = 0; for(uint16 i=0;i<_addressBalance[user].length;) { if(_addressBalance[user][i] > 0) { count++; } unchecked { i++; } } return count; } function heldByAddress(address user) public view returns (uint256[] memory) { return _addressBalance[user]; } function mintedBalanceByAddress(address user) public view returns (uint16) { return _addressMinted[user]; } function _removeTokenIdFromHeldBalance(address user,uint256 tokenId) internal { for(uint256 i=0;i<_addressBalance[user].length;) { if(_addressBalance[user][i] == tokenId) { delete _addressBalance[user][i]; break; } unchecked { i++; } } } //withdraw function withdraw() external payable onlyOwner { require(payable(_withdrawalAccount).send(address(this).balance)); } //minting function mintWL(uint8 mintNum,Coupon memory coupon) external payable { //contract is paused require(!_paused,'paused'); //entire mint supply has been minted require(_total.current() - _reservedTotal.current() + mintNum <= _mintSupply - _mintReserved,'no supply'); //must mint at least one require(mintNum > 0,'mint +1'); //minter did not send enough ETH require(msg.value >= _price * mintNum,'need eth+'); //whitelist is off require(_isWhitelistOnly,'WL is off'); //must be whitelisted require(_isVerifiedCoupon(_createMessageDigest(msg.sender),coupon),'not on WL'); //cannot mint, per address, more than allowed //if _mintLimitWhitelist = 0, user can mint unlimited per address if(_mintLimitWhitelist > 0) { require(mintedBalanceByAddress(msg.sender) + mintNum <= _mintLimitWhitelist,'exceeded max'); } //mint for(uint8 i;i<mintNum;) { _total.increment(); _addressMinted[msg.sender]++; _addressBalance[msg.sender].push(_total.current()); _safeMint(msg.sender,_total.current()); unchecked { i++; } } } function mintPublic(uint8 mintNum) external payable { //contract is paused require(!_paused,'paused'); //entire mint supply has been minted require(_total.current() - _reservedTotal.current() + mintNum <= _mintSupply - _mintReserved,'no supply'); //must mint at least one require(mintNum > 0,'mint +1'); //minter did not send enough ETH require(msg.value >= _price * mintNum,'need eth+'); //whitelist is on require(!_isWhitelistOnly,'WL is on'); //cannot mint, per address, more than allowance //if _mintLimit = 0, user can mint unlimited per address if(_mintLimit > 0) { require(mintedBalanceByAddress(msg.sender) + mintNum <= _mintLimit,'exceeded max'); } //mint for(uint8 i;i<mintNum;) { _total.increment(); _addressMinted[msg.sender]++; _addressBalance[msg.sender].push(_total.current()); _safeMint(msg.sender,_total.current()); unchecked { i++; } } } function mintReserve(address addressTo, uint16 mintNum) external onlyOwner() { require(_reservedTotal.current() + mintNum <= _mintReserved,'no supply'); for(uint16 i;i<mintNum;) { _total.increment(); _reservedTotal.increment(); _addressBalance[addressTo].push(_total.current()); _safeMint(addressTo,_total.current()); unchecked { i++; } } } //royalty overrides function setApprovalForAll(address operator, bool approved) public override onlyAllowedOperatorApproval(operator) { super.setApprovalForAll(operator, approved); } function approve(address operator, uint256 tokenId) public override onlyAllowedOperatorApproval(operator) { super.approve(operator, tokenId); } function transferFrom(address from, address to, uint256 tokenId) public override onlyAllowedOperator(from) { super.transferFrom(from, to, tokenId); } function safeTransferFrom(address from, address to, uint256 tokenId) public override onlyAllowedOperator(from) { super.safeTransferFrom(from, to, tokenId); } function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public override onlyAllowedOperator(from) { super.safeTransferFrom(from, to, tokenId, data); } function _transfer(address from, address to, uint256 tokenId) internal override onlyAllowedOperator(from) { super._transfer(from,to,tokenId); //need to remove this from the address balance array _removeTokenIdFromHeldBalance(from,tokenId); //add token to minted balance _addressBalance[to].push(tokenId); } function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721, ERC2981) returns (bool) { return super.supportsInterface(interfaceId); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"signer","type":"address"},{"internalType":"address","name":"account","type":"address"},{"internalType":"string","name":"baseUrl","type":"string"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint16","name":"supply","type":"uint16"},{"internalType":"uint16","name":"reserved","type":"uint16"},{"internalType":"uint8","name":"mintLimit","type":"uint8"},{"internalType":"uint8","name":"mintLimitWhitelist","type":"uint8"},{"internalType":"bool","name":"isWhitelistOnly","type":"bool"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"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":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_baseUrl","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_isWhitelistOnly","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_mintLimit","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_mintLimitWhitelist","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_mintReserved","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_mintSupply","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_phase","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_reservedTotal","outputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_total","outputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_withdrawalAccount","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","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":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getState","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"heldBalanceByAddress","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"heldByAddress","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"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":"uint8","name":"mintNum","type":"uint8"}],"name":"mintPublic","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"addressTo","type":"address"},{"internalType":"uint16","name":"mintNum","type":"uint16"}],"name":"mintReserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"mintNum","type":"uint8"},{"components":[{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"},{"internalType":"uint8","name":"v","type":"uint8"}],"internalType":"struct Generic.Coupon","name":"coupon","type":"tuple"}],"name":"mintWL","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"mintedBalanceByAddress","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newUrl","type":"string"}],"name":"setBaseURL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"newLimit","type":"uint8"}],"name":"setMintLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"newPhase","type":"uint8"}],"name":"setPhase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"newLimit","type":"uint16"}],"name":"setReserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"signer","type":"address"}],"name":"setSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"newLimit","type":"uint16"}],"name":"setSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"newLimit","type":"uint8"}],"name":"setWhitelistMintLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"setWithdrawalAccount","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":"bool","name":"pause","type":"bool"}],"name":"togglePause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"boolean","type":"bool"}],"name":"toggleWhitelist","outputs":[],"stateMutability":"nonpayable","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":"payable","type":"function"}]
Contract Creation Code
60806040526001600860146101000a81548160ff0219169083151502179055506001601260016101000a81548160ff021916908360ff1602179055503480156200004857600080fd5b50604051620068993803806200689983398181016040528101906200006e91906200081d565b733cc6cdda760b79bafa08df41ecfa224f810dceb660016040518060400160405280600e81526020017f4c656e64616c2050726f2054534b0000000000000000000000000000000000008152506040518060400160405280600681526020017f4c505454534b0000000000000000000000000000000000000000000000000000815250816000908162000102919062000b5c565b50806001908162000114919062000b5c565b50505060006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156200030c578015620001d2576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b81526004016200019892919062000c54565b600060405180830381600087803b158015620001b357600080fd5b505af1158015620001c8573d6000803e3d6000fd5b505050506200030b565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146200028c576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b81526004016200025292919062000c54565b600060405180830381600087803b1580156200026d57600080fd5b505af115801562000282573d6000803e3d6000fd5b505050506200030a565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b8152600401620002d5919062000c81565b600060405180830381600087803b158015620002f057600080fd5b505af115801562000305573d6000803e3d6000fd5b505050505b5b5b50506200032e620003226200046260201b60201c565b6200046a60201b60201c565b88600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555087600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555086600b9081620003c1919062000b5c565b5085600e8190555084600f60006101000a81548161ffff021916908361ffff16021790555083600f60026101000a81548161ffff021916908361ffff16021790555082600f60046101000a81548160ff021916908360ff16021790555081600f60056101000a81548160ff021916908360ff16021790555080601260006101000a81548160ff02191690831515021790555050505050505050505062000c9e565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620005718262000544565b9050919050565b620005838162000564565b81146200058f57600080fd5b50565b600081519050620005a38162000578565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620005fe82620005b3565b810181811067ffffffffffffffff8211171562000620576200061f620005c4565b5b80604052505050565b60006200063562000530565b9050620006438282620005f3565b919050565b600067ffffffffffffffff821115620006665762000665620005c4565b5b6200067182620005b3565b9050602081019050919050565b60005b838110156200069e57808201518184015260208101905062000681565b60008484015250505050565b6000620006c1620006bb8462000648565b62000629565b905082815260208101848484011115620006e057620006df620005ae565b5b620006ed8482856200067e565b509392505050565b600082601f8301126200070d576200070c620005a9565b5b81516200071f848260208601620006aa565b91505092915050565b6000819050919050565b6200073d8162000728565b81146200074957600080fd5b50565b6000815190506200075d8162000732565b92915050565b600061ffff82169050919050565b6200077c8162000763565b81146200078857600080fd5b50565b6000815190506200079c8162000771565b92915050565b600060ff82169050919050565b620007ba81620007a2565b8114620007c657600080fd5b50565b600081519050620007da81620007af565b92915050565b60008115159050919050565b620007f781620007e0565b81146200080357600080fd5b50565b6000815190506200081781620007ec565b92915050565b60008060008060008060008060006101208a8c0312156200084357620008426200053a565b5b6000620008538c828d0162000592565b9950506020620008668c828d0162000592565b98505060408a015167ffffffffffffffff8111156200088a57620008896200053f565b5b620008988c828d01620006f5565b9750506060620008ab8c828d016200074c565b9650506080620008be8c828d016200078b565b95505060a0620008d18c828d016200078b565b94505060c0620008e48c828d01620007c9565b93505060e0620008f78c828d01620007c9565b9250506101006200090b8c828d0162000806565b9150509295985092959850929598565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200096e57607f821691505b60208210810362000984576200098362000926565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620009ee7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620009af565b620009fa8683620009af565b95508019841693508086168417925050509392505050565b6000819050919050565b600062000a3d62000a3762000a318462000728565b62000a12565b62000728565b9050919050565b6000819050919050565b62000a598362000a1c565b62000a7162000a688262000a44565b848454620009bc565b825550505050565b600090565b62000a8862000a79565b62000a9581848462000a4e565b505050565b5b8181101562000abd5762000ab160008262000a7e565b60018101905062000a9b565b5050565b601f82111562000b0c5762000ad6816200098a565b62000ae1846200099f565b8101602085101562000af1578190505b62000b0962000b00856200099f565b83018262000a9a565b50505b505050565b600082821c905092915050565b600062000b316000198460080262000b11565b1980831691505092915050565b600062000b4c838362000b1e565b9150826002028217905092915050565b62000b67826200091b565b67ffffffffffffffff81111562000b835762000b82620005c4565b5b62000b8f825462000955565b62000b9c82828562000ac1565b600060209050601f83116001811462000bd4576000841562000bbf578287015190505b62000bcb858262000b3e565b86555062000c3b565b601f19841662000be4866200098a565b60005b8281101562000c0e5784890151825560018201915060208501945060208101905062000be7565b8683101562000c2e578489015162000c2a601f89168262000b1e565b8355505b6001600288020188555050505b505050505050565b62000c4e8162000564565b82525050565b600060408201905062000c6b600083018562000c43565b62000c7a602083018462000c43565b9392505050565b600060208201905062000c98600083018462000c43565b92915050565b615beb8062000cae6000396000f3fe6080604052600436106102e45760003560e01c80636c19e78311610190578063a22cb465116100dc578063c87b56dd11610095578063e985e9c51161006f578063e985e9c514610afc578063f1cf640914610b39578063f2fde38b14610b64578063f34a39d414610b8d576102e4565b8063c87b56dd14610a69578063d547cfb714610aa6578063dc52610814610ad1576102e4565b8063a22cb4651461095d578063addff6be14610986578063b03b65c4146109c3578063b88d4fde146109ec578063beb08a9214610a15578063c03afb5914610a40576102e4565b806380e3f1ad1161014957806391b7f5ed1161012357806391b7f5ed146108b357806395d89b41146108dc5780639730105914610907578063989411d114610932576102e4565b806380e3f1ad146108365780638da5cb5b1461085f578063915071a81461088a576102e4565b80636c19e783146107475780636ed99fbc1461077057806370a082311461078c578063715018a6146107c9578063763a307a146107e05780637a27da791461080b576102e4565b806323cf7d321161024f57806341f434341161020857806349f2553a116101e257806349f2553a1461069c57806357d159c6146106c55780636352211e146106ee57806367dce1ed1461072b576102e4565b806341f434341461061d57806342842e0e1461064857806348134c0714610671576102e4565b806323cf7d321461051d5780632a55205a146105465780632de94725146105845780633cbc937a146105ad5780633ccfd60b146105ea578063409981de146105f4576102e4565b806316c61ccc116102a157806316c61ccc1461041d57806318160ddd146104485780631865c57d146104735780631b2119b81461049e578063235b6ea1146104c957806323b872dd146104f4576102e4565b806301ffc9a7146102e957806306fdde031461032657806307af4e2714610351578063081812fc1461038e578063095ea7b3146103cb5780630f2ee0b1146103f4575b600080fd5b3480156102f557600080fd5b50610310600480360381019061030b9190613ce1565b610bb8565b60405161031d9190613d29565b60405180910390f35b34801561033257600080fd5b5061033b610bca565b6040516103489190613dd4565b60405180910390f35b34801561035d57600080fd5b5061037860048036038101906103739190613e54565b610c5c565b6040516103859190613e9e565b60405180910390f35b34801561039a57600080fd5b506103b560048036038101906103b09190613eef565b610d42565b6040516103c29190613f2b565b60405180910390f35b3480156103d757600080fd5b506103f260048036038101906103ed9190613f46565b610d88565b005b34801561040057600080fd5b5061041b60048036038101906104169190613fb2565b610da1565b005b34801561042957600080fd5b50610432610dc9565b60405161043f9190613d29565b60405180910390f35b34801561045457600080fd5b5061045d610ddc565b60405161046a9190613fee565b60405180910390f35b34801561047f57600080fd5b50610488610ded565b6040516104959190613dd4565b60405180910390f35b3480156104aa57600080fd5b506104b3610fe2565b6040516104c09190613e9e565b60405180910390f35b3480156104d557600080fd5b506104de610ff6565b6040516104eb9190613fee565b60405180910390f35b34801561050057600080fd5b5061051b60048036038101906105169190614009565b610ffc565b005b34801561052957600080fd5b50610544600480360381019061053f9190614095565b61104b565b005b34801561055257600080fd5b5061056d600480360381019061056891906140c2565b611071565b60405161057b929190614102565b60405180910390f35b34801561059057600080fd5b506105ab60048036038101906105a69190614095565b61125b565b005b3480156105b957600080fd5b506105d460048036038101906105cf9190613e54565b611281565b6040516105e191906141e9565b60405180910390f35b6105f2611318565b005b34801561060057600080fd5b5061061b60048036038101906106169190613fb2565b611382565b005b34801561062957600080fd5b506106326113aa565b60405161063f919061426a565b60405180910390f35b34801561065457600080fd5b5061066f600480360381019061066a9190614009565b6113bc565b005b34801561067d57600080fd5b5061068661140b565b6040516106939190613e9e565b60405180910390f35b3480156106a857600080fd5b506106c360048036038101906106be91906143ba565b61141f565b005b3480156106d157600080fd5b506106ec60048036038101906106e7919061442f565b61143a565b005b3480156106fa57600080fd5b5061071560048036038101906107109190613eef565b61145f565b6040516107229190613f2b565b60405180910390f35b61074560048036038101906107409190614095565b6114e5565b005b34801561075357600080fd5b5061076e60048036038101906107699190613e54565b61186c565b005b61078a600480360381019061078591906144fb565b6118b8565b005b34801561079857600080fd5b506107b360048036038101906107ae9190613e54565b611c90565b6040516107c09190613fee565b60405180910390f35b3480156107d557600080fd5b506107de611d47565b005b3480156107ec57600080fd5b506107f5611d5b565b604051610802919061454a565b60405180910390f35b34801561081757600080fd5b50610820611d6e565b60405161082d9190613fee565b60405180910390f35b34801561084257600080fd5b5061085d6004803603810190610858919061442f565b611d7a565b005b34801561086b57600080fd5b50610874611d9f565b6040516108819190613f2b565b60405180910390f35b34801561089657600080fd5b506108b160048036038101906108ac9190614565565b611dc9565b005b3480156108bf57600080fd5b506108da60048036038101906108d59190613eef565b611efb565b005b3480156108e857600080fd5b506108f1611f0d565b6040516108fe9190613dd4565b60405180910390f35b34801561091357600080fd5b5061091c611f9f565b604051610929919061454a565b60405180910390f35b34801561093e57600080fd5b50610947611fb2565b6040516109549190613d29565b60405180910390f35b34801561096957600080fd5b50610984600480360381019061097f91906145a5565b611fc5565b005b34801561099257600080fd5b506109ad60048036038101906109a89190613e54565b611fde565b6040516109ba9190613e9e565b60405180910390f35b3480156109cf57600080fd5b506109ea60048036038101906109e59190613e54565b612035565b005b3480156109f857600080fd5b50610a136004803603810190610a0e9190614686565b6120f2565b005b348015610a2157600080fd5b50610a2a612143565b604051610a379190613fee565b60405180910390f35b348015610a4c57600080fd5b50610a676004803603810190610a629190614095565b61214f565b005b348015610a7557600080fd5b50610a906004803603810190610a8b9190613eef565b612175565b604051610a9d9190613dd4565b60405180910390f35b348015610ab257600080fd5b50610abb6121f1565b604051610ac89190613dd4565b60405180910390f35b348015610add57600080fd5b50610ae6612283565b604051610af39190613f2b565b60405180910390f35b348015610b0857600080fd5b50610b236004803603810190610b1e9190614709565b6122a9565b604051610b309190613d29565b60405180910390f35b348015610b4557600080fd5b50610b4e61233d565b604051610b5b919061454a565b60405180910390f35b348015610b7057600080fd5b50610b8b6004803603810190610b869190613e54565b612350565b005b348015610b9957600080fd5b50610ba26123d3565b604051610baf9190613dd4565b60405180910390f35b6000610bc382612461565b9050919050565b606060008054610bd990614778565b80601f0160208091040260200160405190810160405280929190818152602001828054610c0590614778565b8015610c525780601f10610c2757610100808354040283529160200191610c52565b820191906000526020600020905b815481529060010190602001808311610c3557829003601f168201915b5050505050905090565b6000806000905060005b601160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490508161ffff161015610d38576000601160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208261ffff1681548110610d0b57610d0a6147a9565b5b90600052602060002001541115610d2b578180610d2790614807565b9250505b8080600101915050610c66565b5080915050919050565b6000610d4d826124db565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b81610d9281612526565b610d9c8383612623565b505050565b610da961273a565b80600f60006101000a81548161ffff021916908361ffff16021790555050565b600860149054906101000a900460ff1681565b6000610de8600c6127b8565b905090565b6060600860149054906101000a900460ff16610e3e576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250610e75565b6040518060400160405280600181526020017f31000000000000000000000000000000000000000000000000000000000000008152505b601260009054906101000a900460ff16610ec4576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250610efb565b6040518060400160405280600181526020017f31000000000000000000000000000000000000000000000000000000000000008152505b610f0d610f08600c6127b8565b6127c6565b610f1f610f1a600d6127b8565b6127c6565b610f3c600f60009054906101000a900461ffff1661ffff166127c6565b610f59600f60029054906101000a900461ffff1661ffff166127c6565b610f64600e546127c6565b610f7f600f60049054906101000a900460ff1660ff166127c6565b610f9a600f60059054906101000a900460ff1660ff166127c6565b610fb5601260019054906101000a900460ff1660ff166127c6565b604051602001610fce9a999897969594939291906148b9565b604051602081830303815290604052905090565b600f60009054906101000a900461ffff1681565b600e5481565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461103a5761103933612526565b5b611045848484612894565b50505050565b61105361273a565b80600f60046101000a81548160ff021916908360ff16021790555050565b6000806000600760008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16036112065760066040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b60006112106128f4565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff168661123c91906149a8565b6112469190614a19565b90508160000151819350935050509250929050565b61126361273a565b80600f60056101000a81548160ff021916908360ff16021790555050565b6060601160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080548060200260200160405190810160405280929190818152602001828054801561130c57602002820191906000526020600020905b8154815260200190600101908083116112f8575b50505050509050919050565b61132061273a565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505061138057600080fd5b565b61138a61273a565b80600f60026101000a81548161ffff021916908361ffff16021790555050565b6daaeb6d7670e522a718067333cd4e81565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146113fa576113f933612526565b5b6114058484846128fe565b50505050565b600f60029054906101000a900461ffff1681565b61142761273a565b80600b90816114369190614bec565b5050565b61144261273a565b80600860146101000a81548160ff02191690831515021790555050565b60008061146b8361291e565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036114dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d390614d0a565b60405180910390fd5b80915050919050565b600860149054906101000a900460ff1615611535576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152c90614d76565b60405180910390fd5b600f60029054906101000a900461ffff16600f60009054906101000a900461ffff166115619190614d96565b61ffff168160ff16611573600d6127b8565b61157d600c6127b8565b6115879190614dcc565b6115919190614e00565b11156115d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c990614e80565b60405180910390fd5b60008160ff1611611618576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160f90614eec565b60405180910390fd5b8060ff16600e5461162991906149a8565b34101561166b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166290614f58565b60405180910390fd5b601260009054906101000a900460ff16156116bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b290614fc4565b60405180910390fd5b6000600f60049054906101000a900460ff1660ff16111561174657600f60049054906101000a900460ff1660ff168160ff166116f633611fde565b6117009190614fe4565b61ffff161115611745576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173c90615066565b60405180910390fd5b5b60005b8160ff168160ff16101561186857611761600c61295b565b601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081819054906101000a900461ffff16809291906117be90614807565b91906101000a81548161ffff021916908361ffff16021790555050601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020611822600c6127b8565b908060018154018082558091505060019003906000526020600020016000909190919091505561185b33611856600c6127b8565b612971565b8080600101915050611749565b5050565b61187461273a565b80600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600860149054906101000a900460ff1615611908576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ff90614d76565b60405180910390fd5b600f60029054906101000a900461ffff16600f60009054906101000a900461ffff166119349190614d96565b61ffff168260ff16611946600d6127b8565b611950600c6127b8565b61195a9190614dcc565b6119649190614e00565b11156119a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199c90614e80565b60405180910390fd5b60008260ff16116119eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e290614eec565b60405180910390fd5b8160ff16600e546119fc91906149a8565b341015611a3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3590614f58565b60405180910390fd5b601260009054906101000a900460ff16611a8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a84906150d2565b60405180910390fd5b611a9f611a993361298f565b826129e5565b611ade576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad59061513e565b60405180910390fd5b6000600f60059054906101000a900460ff1660ff161115611b6957600f60059054906101000a900460ff1660ff168260ff16611b1933611fde565b611b239190614fe4565b61ffff161115611b68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5f90615066565b60405180910390fd5b5b60005b8260ff168160ff161015611c8b57611b84600c61295b565b601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081819054906101000a900461ffff1680929190611be190614807565b91906101000a81548161ffff021916908361ffff16021790555050601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020611c45600c6127b8565b9080600181540180825580915050600190039060005260206000200160009091909190915055611c7e33611c79600c6127b8565b612971565b8080600101915050611b6c565b505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611d00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf7906151d0565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611d4f61273a565b611d596000612b0e565b565b600f60059054906101000a900460ff1681565b600c8060000154905081565b611d8261273a565b80601260006101000a81548160ff02191690831515021790555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611dd161273a565b600f60029054906101000a900461ffff1661ffff168161ffff16611df5600d6127b8565b611dff9190614e00565b1115611e40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3790614e80565b60405180910390fd5b60005b8161ffff168161ffff161015611ef657611e5d600c61295b565b611e67600d61295b565b601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020611eb0600c6127b8565b9080600181540180825580915050600190039060005260206000200160009091909190915055611ee983611ee4600c6127b8565b612971565b8080600101915050611e43565b505050565b611f0361273a565b80600e8190555050565b606060018054611f1c90614778565b80601f0160208091040260200160405190810160405280929190818152602001828054611f4890614778565b8015611f955780601f10611f6a57610100808354040283529160200191611f95565b820191906000526020600020905b815481529060010190602001808311611f7857829003601f168201915b5050505050905090565b601260019054906101000a900460ff1681565b601260009054906101000a900460ff1681565b81611fcf81612526565b611fd98383612bd4565b505050565b6000601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900461ffff169050919050565b61203d61273a565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361207657600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036120ae57600080fd5b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b833373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146121305761212f33612526565b5b61213c85858585612bea565b5050505050565b600d8060000154905081565b61215761273a565b80601260016101000a81548160ff021916908360ff16021790555050565b606061218082612c4c565b6121bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b69061523c565b60405180910390fd5b600b6121ca836127c6565b6040516020016121db9291906152df565b6040516020818303038152906040529050919050565b6060600b805461220090614778565b80601f016020809104026020016040519081016040528092919081815260200182805461222c90614778565b80156122795780601f1061224e57610100808354040283529160200191612279565b820191906000526020600020905b81548152906001019060200180831161225c57829003601f168201915b5050505050905090565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600f60049054906101000a900460ff1681565b61235861273a565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036123c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123be90615375565b60405180910390fd5b6123d081612b0e565b50565b600b80546123e090614778565b80601f016020809104026020016040519081016040528092919081815260200182805461240c90614778565b80156124595780601f1061242e57610100808354040283529160200191612459565b820191906000526020600020905b81548152906001019060200180831161243c57829003601f168201915b505050505081565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806124d457506124d382612c8d565b5b9050919050565b6124e481612c4c565b612523576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161251a90614d0a565b60405180910390fd5b50565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115612620576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b815260040161259d929190615395565b602060405180830381865afa1580156125ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125de91906153d3565b61261f57806040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016126169190613f2b565b60405180910390fd5b5b50565b600061262e8261145f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361269e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161269590615472565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166126bd612d6f565b73ffffffffffffffffffffffffffffffffffffffff1614806126ec57506126eb816126e6612d6f565b6122a9565b5b61272b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161272290615504565b60405180910390fd5b6127358383612d77565b505050565b612742612d6f565b73ffffffffffffffffffffffffffffffffffffffff16612760611d9f565b73ffffffffffffffffffffffffffffffffffffffff16146127b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127ad90615570565b60405180910390fd5b565b600081600001549050919050565b6060600060016127d584612e30565b01905060008167ffffffffffffffff8111156127f4576127f361428f565b5b6040519080825280601f01601f1916602001820160405280156128265781602001600182028036833780820191505090505b509050600082602001820190505b600115612889578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a858161287d5761287c6149ea565b5b04945060008503612834575b819350505050919050565b6128a561289f612d6f565b82612f83565b6128e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128db90615602565b60405180910390fd5b6128ef838383613018565b505050565b6000612710905090565b612919838383604051806020016040528060008152506120f2565b505050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6001816000016000828254019250508190555050565b61298b8282604051806020016040528060008152506130d7565b5050565b6000816040516020016129a2919061566a565b604051602081830303815290604052805190602001206040516020016129c891906156f2565b604051602081830303815290604052805190602001209050919050565b60008060018484604001518560000151866020015160405160008152602001604052604051612a179493929190615727565b6020604051602081039080840390855afa158015612a39573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612ab4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aab906157b8565b60405180910390fd5b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161491505092915050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612be6612bdf612d6f565b8383613132565b5050565b612bfb612bf5612d6f565b83612f83565b612c3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c3190615602565b60405180910390fd5b612c468484848461329e565b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff16612c6e8361291e565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612d5857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612d685750612d67826132fa565b5b9050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612dea8361145f565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612e8e577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381612e8457612e836149ea565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612ecb576d04ee2d6d415b85acef81000000008381612ec157612ec06149ea565b5b0492506020810190505b662386f26fc100008310612efa57662386f26fc100008381612ef057612eef6149ea565b5b0492506010810190505b6305f5e1008310612f23576305f5e1008381612f1957612f186149ea565b5b0492506008810190505b6127108310612f48576127108381612f3e57612f3d6149ea565b5b0492506004810190505b60648310612f6b5760648381612f6157612f606149ea565b5b0492506002810190505b600a8310612f7a576001810190505b80915050919050565b600080612f8f8361145f565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612fd15750612fd081856122a9565b5b8061300f57508373ffffffffffffffffffffffffffffffffffffffff16612ff784610d42565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146130565761305533612526565b5b613061848484613364565b61306b848361365d565b601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082908060018154018082558091505060019003906000526020600020016000909190919091505550505050565b6130e18383613782565b6130ee600084848461399f565b61312d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131249061584a565b60405180910390fd5b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036131a0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613197906158b6565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516132919190613d29565b60405180910390a3505050565b6132a9848484613018565b6132b58484848461399f565b6132f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132eb9061584a565b60405180910390fd5b50505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b8273ffffffffffffffffffffffffffffffffffffffff166133848261145f565b73ffffffffffffffffffffffffffffffffffffffff16146133da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133d190615948565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613449576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613440906159da565b60405180910390fd5b6134568383836001613b26565b8273ffffffffffffffffffffffffffffffffffffffff166134768261145f565b73ffffffffffffffffffffffffffffffffffffffff16146134cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134c390615948565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46136588383836001613c4c565b505050565b60005b601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905081101561377d5781601160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481106136fc576136fb6147a9565b5b90600052602060002001540361377057601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020818154811061375d5761375c6147a9565b5b906000526020600020016000905561377d565b8080600101915050613660565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036137f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137e890615a46565b60405180910390fd5b6137fa81612c4c565b1561383a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161383190615ab2565b60405180910390fd5b613848600083836001613b26565b61385181612c4c565b15613891576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161388890615ab2565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461399b600083836001613c4c565b5050565b60006139c08473ffffffffffffffffffffffffffffffffffffffff16613c52565b15613b19578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026139e9612d6f565b8786866040518563ffffffff1660e01b8152600401613a0b9493929190615b27565b6020604051808303816000875af1925050508015613a4757506040513d601f19601f82011682018060405250810190613a449190615b88565b60015b613ac9573d8060008114613a77576040519150601f19603f3d011682016040523d82523d6000602084013e613a7c565b606091505b506000815103613ac1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ab89061584a565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613b1e565b600190505b949350505050565b6001811115613c4657600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614613bba5780600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613bb29190614dcc565b925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614613c455780600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613c3d9190614e00565b925050819055505b5b50505050565b50505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613cbe81613c89565b8114613cc957600080fd5b50565b600081359050613cdb81613cb5565b92915050565b600060208284031215613cf757613cf6613c7f565b5b6000613d0584828501613ccc565b91505092915050565b60008115159050919050565b613d2381613d0e565b82525050565b6000602082019050613d3e6000830184613d1a565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613d7e578082015181840152602081019050613d63565b60008484015250505050565b6000601f19601f8301169050919050565b6000613da682613d44565b613db08185613d4f565b9350613dc0818560208601613d60565b613dc981613d8a565b840191505092915050565b60006020820190508181036000830152613dee8184613d9b565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613e2182613df6565b9050919050565b613e3181613e16565b8114613e3c57600080fd5b50565b600081359050613e4e81613e28565b92915050565b600060208284031215613e6a57613e69613c7f565b5b6000613e7884828501613e3f565b91505092915050565b600061ffff82169050919050565b613e9881613e81565b82525050565b6000602082019050613eb36000830184613e8f565b92915050565b6000819050919050565b613ecc81613eb9565b8114613ed757600080fd5b50565b600081359050613ee981613ec3565b92915050565b600060208284031215613f0557613f04613c7f565b5b6000613f1384828501613eda565b91505092915050565b613f2581613e16565b82525050565b6000602082019050613f406000830184613f1c565b92915050565b60008060408385031215613f5d57613f5c613c7f565b5b6000613f6b85828601613e3f565b9250506020613f7c85828601613eda565b9150509250929050565b613f8f81613e81565b8114613f9a57600080fd5b50565b600081359050613fac81613f86565b92915050565b600060208284031215613fc857613fc7613c7f565b5b6000613fd684828501613f9d565b91505092915050565b613fe881613eb9565b82525050565b60006020820190506140036000830184613fdf565b92915050565b60008060006060848603121561402257614021613c7f565b5b600061403086828701613e3f565b935050602061404186828701613e3f565b925050604061405286828701613eda565b9150509250925092565b600060ff82169050919050565b6140728161405c565b811461407d57600080fd5b50565b60008135905061408f81614069565b92915050565b6000602082840312156140ab576140aa613c7f565b5b60006140b984828501614080565b91505092915050565b600080604083850312156140d9576140d8613c7f565b5b60006140e785828601613eda565b92505060206140f885828601613eda565b9150509250929050565b60006040820190506141176000830185613f1c565b6141246020830184613fdf565b9392505050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61416081613eb9565b82525050565b60006141728383614157565b60208301905092915050565b6000602082019050919050565b60006141968261412b565b6141a08185614136565b93506141ab83614147565b8060005b838110156141dc5781516141c38882614166565b97506141ce8361417e565b9250506001810190506141af565b5085935050505092915050565b60006020820190508181036000830152614203818461418b565b905092915050565b6000819050919050565b600061423061422b61422684613df6565b61420b565b613df6565b9050919050565b600061424282614215565b9050919050565b600061425482614237565b9050919050565b61426481614249565b82525050565b600060208201905061427f600083018461425b565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6142c782613d8a565b810181811067ffffffffffffffff821117156142e6576142e561428f565b5b80604052505050565b60006142f9613c75565b905061430582826142be565b919050565b600067ffffffffffffffff8211156143255761432461428f565b5b61432e82613d8a565b9050602081019050919050565b82818337600083830152505050565b600061435d6143588461430a565b6142ef565b9050828152602081018484840111156143795761437861428a565b5b61438484828561433b565b509392505050565b600082601f8301126143a1576143a0614285565b5b81356143b184826020860161434a565b91505092915050565b6000602082840312156143d0576143cf613c7f565b5b600082013567ffffffffffffffff8111156143ee576143ed613c84565b5b6143fa8482850161438c565b91505092915050565b61440c81613d0e565b811461441757600080fd5b50565b60008135905061442981614403565b92915050565b60006020828403121561444557614444613c7f565b5b60006144538482850161441a565b91505092915050565b600080fd5b6000819050919050565b61447481614461565b811461447f57600080fd5b50565b6000813590506144918161446b565b92915050565b6000606082840312156144ad576144ac61445c565b5b6144b760606142ef565b905060006144c784828501614482565b60008301525060206144db84828501614482565b60208301525060406144ef84828501614080565b60408301525092915050565b6000806080838503121561451257614511613c7f565b5b600061452085828601614080565b925050602061453185828601614497565b9150509250929050565b6145448161405c565b82525050565b600060208201905061455f600083018461453b565b92915050565b6000806040838503121561457c5761457b613c7f565b5b600061458a85828601613e3f565b925050602061459b85828601613f9d565b9150509250929050565b600080604083850312156145bc576145bb613c7f565b5b60006145ca85828601613e3f565b92505060206145db8582860161441a565b9150509250929050565b600067ffffffffffffffff821115614600576145ff61428f565b5b61460982613d8a565b9050602081019050919050565b6000614629614624846145e5565b6142ef565b9050828152602081018484840111156146455761464461428a565b5b61465084828561433b565b509392505050565b600082601f83011261466d5761466c614285565b5b813561467d848260208601614616565b91505092915050565b600080600080608085870312156146a05761469f613c7f565b5b60006146ae87828801613e3f565b94505060206146bf87828801613e3f565b93505060406146d087828801613eda565b925050606085013567ffffffffffffffff8111156146f1576146f0613c84565b5b6146fd87828801614658565b91505092959194509250565b600080604083850312156147205761471f613c7f565b5b600061472e85828601613e3f565b925050602061473f85828601613e3f565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061479057607f821691505b6020821081036147a3576147a2614749565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061481282613e81565b915061ffff8203614826576148256147d8565b5b600182019050919050565b600081905092915050565b600061484782613d44565b6148518185614831565b9350614861818560208601613d60565b80840191505092915050565b7f5f00000000000000000000000000000000000000000000000000000000000000600082015250565b60006148a3600183614831565b91506148ae8261486d565b600182019050919050565b60006148c5828d61483c565b91506148d082614896565b91506148dc828c61483c565b91506148e782614896565b91506148f3828b61483c565b91506148fe82614896565b915061490a828a61483c565b915061491582614896565b9150614921828961483c565b915061492c82614896565b9150614938828861483c565b915061494382614896565b915061494f828761483c565b915061495a82614896565b9150614966828661483c565b915061497182614896565b915061497d828561483c565b915061498882614896565b9150614994828461483c565b91508190509b9a5050505050505050505050565b60006149b382613eb9565b91506149be83613eb9565b92508282026149cc81613eb9565b915082820484148315176149e3576149e26147d8565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614a2482613eb9565b9150614a2f83613eb9565b925082614a3f57614a3e6149ea565b5b828204905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302614aac7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614a6f565b614ab68683614a6f565b95508019841693508086168417925050509392505050565b6000614ae9614ae4614adf84613eb9565b61420b565b613eb9565b9050919050565b6000819050919050565b614b0383614ace565b614b17614b0f82614af0565b848454614a7c565b825550505050565b600090565b614b2c614b1f565b614b37818484614afa565b505050565b5b81811015614b5b57614b50600082614b24565b600181019050614b3d565b5050565b601f821115614ba057614b7181614a4a565b614b7a84614a5f565b81016020851015614b89578190505b614b9d614b9585614a5f565b830182614b3c565b50505b505050565b600082821c905092915050565b6000614bc360001984600802614ba5565b1980831691505092915050565b6000614bdc8383614bb2565b9150826002028217905092915050565b614bf582613d44565b67ffffffffffffffff811115614c0e57614c0d61428f565b5b614c188254614778565b614c23828285614b5f565b600060209050601f831160018114614c565760008415614c44578287015190505b614c4e8582614bd0565b865550614cb6565b601f198416614c6486614a4a565b60005b82811015614c8c57848901518255600182019150602085019450602081019050614c67565b86831015614ca95784890151614ca5601f891682614bb2565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000614cf4601883613d4f565b9150614cff82614cbe565b602082019050919050565b60006020820190508181036000830152614d2381614ce7565b9050919050565b7f7061757365640000000000000000000000000000000000000000000000000000600082015250565b6000614d60600683613d4f565b9150614d6b82614d2a565b602082019050919050565b60006020820190508181036000830152614d8f81614d53565b9050919050565b6000614da182613e81565b9150614dac83613e81565b9250828203905061ffff811115614dc657614dc56147d8565b5b92915050565b6000614dd782613eb9565b9150614de283613eb9565b9250828203905081811115614dfa57614df96147d8565b5b92915050565b6000614e0b82613eb9565b9150614e1683613eb9565b9250828201905080821115614e2e57614e2d6147d8565b5b92915050565b7f6e6f20737570706c790000000000000000000000000000000000000000000000600082015250565b6000614e6a600983613d4f565b9150614e7582614e34565b602082019050919050565b60006020820190508181036000830152614e9981614e5d565b9050919050565b7f6d696e74202b3100000000000000000000000000000000000000000000000000600082015250565b6000614ed6600783613d4f565b9150614ee182614ea0565b602082019050919050565b60006020820190508181036000830152614f0581614ec9565b9050919050565b7f6e656564206574682b0000000000000000000000000000000000000000000000600082015250565b6000614f42600983613d4f565b9150614f4d82614f0c565b602082019050919050565b60006020820190508181036000830152614f7181614f35565b9050919050565b7f574c206973206f6e000000000000000000000000000000000000000000000000600082015250565b6000614fae600883613d4f565b9150614fb982614f78565b602082019050919050565b60006020820190508181036000830152614fdd81614fa1565b9050919050565b6000614fef82613e81565b9150614ffa83613e81565b9250828201905061ffff811115615014576150136147d8565b5b92915050565b7f6578636565646564206d61780000000000000000000000000000000000000000600082015250565b6000615050600c83613d4f565b915061505b8261501a565b602082019050919050565b6000602082019050818103600083015261507f81615043565b9050919050565b7f574c206973206f66660000000000000000000000000000000000000000000000600082015250565b60006150bc600983613d4f565b91506150c782615086565b602082019050919050565b600060208201905081810360008301526150eb816150af565b9050919050565b7f6e6f74206f6e20574c0000000000000000000000000000000000000000000000600082015250565b6000615128600983613d4f565b9150615133826150f2565b602082019050919050565b600060208201905081810360008301526151578161511b565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b60006151ba602983613d4f565b91506151c58261515e565b604082019050919050565b600060208201905081810360008301526151e9816151ad565b9050919050565b7f6d697373696e6720746f6b656e00000000000000000000000000000000000000600082015250565b6000615226600d83613d4f565b9150615231826151f0565b602082019050919050565b6000602082019050818103600083015261525581615219565b9050919050565b6000815461526981614778565b6152738186614831565b9450600182166000811461528e57600181146152a3576152d6565b60ff19831686528115158202860193506152d6565b6152ac85614a4a565b60005b838110156152ce578154818901526001820191506020810190506152af565b838801955050505b50505092915050565b60006152eb828561525c565b91506152f7828461483c565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061535f602683613d4f565b915061536a82615303565b604082019050919050565b6000602082019050818103600083015261538e81615352565b9050919050565b60006040820190506153aa6000830185613f1c565b6153b76020830184613f1c565b9392505050565b6000815190506153cd81614403565b92915050565b6000602082840312156153e9576153e8613c7f565b5b60006153f7848285016153be565b91505092915050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b600061545c602183613d4f565b915061546782615400565b604082019050919050565b6000602082019050818103600083015261548b8161544f565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b60006154ee603d83613d4f565b91506154f982615492565b604082019050919050565b6000602082019050818103600083015261551d816154e1565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061555a602083613d4f565b915061556582615524565b602082019050919050565b600060208201905081810360008301526155898161554d565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b60006155ec602d83613d4f565b91506155f782615590565b604082019050919050565b6000602082019050818103600083015261561b816155df565b9050919050565b60008160601b9050919050565b600061563a82615622565b9050919050565b600061564c8261562f565b9050919050565b61566461565f82613e16565b615641565b82525050565b60006156768284615653565b60148201915081905092915050565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b60006156bb601c83614831565b91506156c682615685565b601c82019050919050565b6000819050919050565b6156ec6156e782614461565b6156d1565b82525050565b60006156fd826156ae565b915061570982846156db565b60208201915081905092915050565b61572181614461565b82525050565b600060808201905061573c6000830187615718565b615749602083018661453b565b6157566040830185615718565b6157636060830184615718565b95945050505050565b7f696e76616c696420736967000000000000000000000000000000000000000000600082015250565b60006157a2600b83613d4f565b91506157ad8261576c565b602082019050919050565b600060208201905081810360008301526157d181615795565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000615834603283613d4f565b915061583f826157d8565b604082019050919050565b6000602082019050818103600083015261586381615827565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006158a0601983613d4f565b91506158ab8261586a565b602082019050919050565b600060208201905081810360008301526158cf81615893565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000615932602583613d4f565b915061593d826158d6565b604082019050919050565b6000602082019050818103600083015261596181615925565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006159c4602483613d4f565b91506159cf82615968565b604082019050919050565b600060208201905081810360008301526159f3816159b7565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000615a30602083613d4f565b9150615a3b826159fa565b602082019050919050565b60006020820190508181036000830152615a5f81615a23565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000615a9c601c83613d4f565b9150615aa782615a66565b602082019050919050565b60006020820190508181036000830152615acb81615a8f565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000615af982615ad2565b615b038185615add565b9350615b13818560208601613d60565b615b1c81613d8a565b840191505092915050565b6000608082019050615b3c6000830187613f1c565b615b496020830186613f1c565b615b566040830185613fdf565b8181036060830152615b688184615aee565b905095945050505050565b600081519050615b8281613cb5565b92915050565b600060208284031215615b9e57615b9d613c7f565b5b6000615bac84828501615b73565b9150509291505056fea26469706673582212208a82b1b0d63df45dc9598f69875896f0eb8b0e212ddd94b7b56779e6b5e5bcb164736f6c63430008130033000000000000000000000000b92f76122d51dc463178bdf7f8fc94bd683fa54b000000000000000000000000f097022ff2befcbbc50b7c25c6f94a21545248cc000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000006f05b59d3b2000000000000000000000000000000000000000000000000000000000000000008340000000000000000000000000000000000000000000000000000000000000163000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002968747470733a2f2f7072656d696e742e6c656e64616c70726f2e74726164652f6170692f6d6574612f0000000000000000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106102e45760003560e01c80636c19e78311610190578063a22cb465116100dc578063c87b56dd11610095578063e985e9c51161006f578063e985e9c514610afc578063f1cf640914610b39578063f2fde38b14610b64578063f34a39d414610b8d576102e4565b8063c87b56dd14610a69578063d547cfb714610aa6578063dc52610814610ad1576102e4565b8063a22cb4651461095d578063addff6be14610986578063b03b65c4146109c3578063b88d4fde146109ec578063beb08a9214610a15578063c03afb5914610a40576102e4565b806380e3f1ad1161014957806391b7f5ed1161012357806391b7f5ed146108b357806395d89b41146108dc5780639730105914610907578063989411d114610932576102e4565b806380e3f1ad146108365780638da5cb5b1461085f578063915071a81461088a576102e4565b80636c19e783146107475780636ed99fbc1461077057806370a082311461078c578063715018a6146107c9578063763a307a146107e05780637a27da791461080b576102e4565b806323cf7d321161024f57806341f434341161020857806349f2553a116101e257806349f2553a1461069c57806357d159c6146106c55780636352211e146106ee57806367dce1ed1461072b576102e4565b806341f434341461061d57806342842e0e1461064857806348134c0714610671576102e4565b806323cf7d321461051d5780632a55205a146105465780632de94725146105845780633cbc937a146105ad5780633ccfd60b146105ea578063409981de146105f4576102e4565b806316c61ccc116102a157806316c61ccc1461041d57806318160ddd146104485780631865c57d146104735780631b2119b81461049e578063235b6ea1146104c957806323b872dd146104f4576102e4565b806301ffc9a7146102e957806306fdde031461032657806307af4e2714610351578063081812fc1461038e578063095ea7b3146103cb5780630f2ee0b1146103f4575b600080fd5b3480156102f557600080fd5b50610310600480360381019061030b9190613ce1565b610bb8565b60405161031d9190613d29565b60405180910390f35b34801561033257600080fd5b5061033b610bca565b6040516103489190613dd4565b60405180910390f35b34801561035d57600080fd5b5061037860048036038101906103739190613e54565b610c5c565b6040516103859190613e9e565b60405180910390f35b34801561039a57600080fd5b506103b560048036038101906103b09190613eef565b610d42565b6040516103c29190613f2b565b60405180910390f35b3480156103d757600080fd5b506103f260048036038101906103ed9190613f46565b610d88565b005b34801561040057600080fd5b5061041b60048036038101906104169190613fb2565b610da1565b005b34801561042957600080fd5b50610432610dc9565b60405161043f9190613d29565b60405180910390f35b34801561045457600080fd5b5061045d610ddc565b60405161046a9190613fee565b60405180910390f35b34801561047f57600080fd5b50610488610ded565b6040516104959190613dd4565b60405180910390f35b3480156104aa57600080fd5b506104b3610fe2565b6040516104c09190613e9e565b60405180910390f35b3480156104d557600080fd5b506104de610ff6565b6040516104eb9190613fee565b60405180910390f35b34801561050057600080fd5b5061051b60048036038101906105169190614009565b610ffc565b005b34801561052957600080fd5b50610544600480360381019061053f9190614095565b61104b565b005b34801561055257600080fd5b5061056d600480360381019061056891906140c2565b611071565b60405161057b929190614102565b60405180910390f35b34801561059057600080fd5b506105ab60048036038101906105a69190614095565b61125b565b005b3480156105b957600080fd5b506105d460048036038101906105cf9190613e54565b611281565b6040516105e191906141e9565b60405180910390f35b6105f2611318565b005b34801561060057600080fd5b5061061b60048036038101906106169190613fb2565b611382565b005b34801561062957600080fd5b506106326113aa565b60405161063f919061426a565b60405180910390f35b34801561065457600080fd5b5061066f600480360381019061066a9190614009565b6113bc565b005b34801561067d57600080fd5b5061068661140b565b6040516106939190613e9e565b60405180910390f35b3480156106a857600080fd5b506106c360048036038101906106be91906143ba565b61141f565b005b3480156106d157600080fd5b506106ec60048036038101906106e7919061442f565b61143a565b005b3480156106fa57600080fd5b5061071560048036038101906107109190613eef565b61145f565b6040516107229190613f2b565b60405180910390f35b61074560048036038101906107409190614095565b6114e5565b005b34801561075357600080fd5b5061076e60048036038101906107699190613e54565b61186c565b005b61078a600480360381019061078591906144fb565b6118b8565b005b34801561079857600080fd5b506107b360048036038101906107ae9190613e54565b611c90565b6040516107c09190613fee565b60405180910390f35b3480156107d557600080fd5b506107de611d47565b005b3480156107ec57600080fd5b506107f5611d5b565b604051610802919061454a565b60405180910390f35b34801561081757600080fd5b50610820611d6e565b60405161082d9190613fee565b60405180910390f35b34801561084257600080fd5b5061085d6004803603810190610858919061442f565b611d7a565b005b34801561086b57600080fd5b50610874611d9f565b6040516108819190613f2b565b60405180910390f35b34801561089657600080fd5b506108b160048036038101906108ac9190614565565b611dc9565b005b3480156108bf57600080fd5b506108da60048036038101906108d59190613eef565b611efb565b005b3480156108e857600080fd5b506108f1611f0d565b6040516108fe9190613dd4565b60405180910390f35b34801561091357600080fd5b5061091c611f9f565b604051610929919061454a565b60405180910390f35b34801561093e57600080fd5b50610947611fb2565b6040516109549190613d29565b60405180910390f35b34801561096957600080fd5b50610984600480360381019061097f91906145a5565b611fc5565b005b34801561099257600080fd5b506109ad60048036038101906109a89190613e54565b611fde565b6040516109ba9190613e9e565b60405180910390f35b3480156109cf57600080fd5b506109ea60048036038101906109e59190613e54565b612035565b005b3480156109f857600080fd5b50610a136004803603810190610a0e9190614686565b6120f2565b005b348015610a2157600080fd5b50610a2a612143565b604051610a379190613fee565b60405180910390f35b348015610a4c57600080fd5b50610a676004803603810190610a629190614095565b61214f565b005b348015610a7557600080fd5b50610a906004803603810190610a8b9190613eef565b612175565b604051610a9d9190613dd4565b60405180910390f35b348015610ab257600080fd5b50610abb6121f1565b604051610ac89190613dd4565b60405180910390f35b348015610add57600080fd5b50610ae6612283565b604051610af39190613f2b565b60405180910390f35b348015610b0857600080fd5b50610b236004803603810190610b1e9190614709565b6122a9565b604051610b309190613d29565b60405180910390f35b348015610b4557600080fd5b50610b4e61233d565b604051610b5b919061454a565b60405180910390f35b348015610b7057600080fd5b50610b8b6004803603810190610b869190613e54565b612350565b005b348015610b9957600080fd5b50610ba26123d3565b604051610baf9190613dd4565b60405180910390f35b6000610bc382612461565b9050919050565b606060008054610bd990614778565b80601f0160208091040260200160405190810160405280929190818152602001828054610c0590614778565b8015610c525780601f10610c2757610100808354040283529160200191610c52565b820191906000526020600020905b815481529060010190602001808311610c3557829003601f168201915b5050505050905090565b6000806000905060005b601160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490508161ffff161015610d38576000601160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208261ffff1681548110610d0b57610d0a6147a9565b5b90600052602060002001541115610d2b578180610d2790614807565b9250505b8080600101915050610c66565b5080915050919050565b6000610d4d826124db565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b81610d9281612526565b610d9c8383612623565b505050565b610da961273a565b80600f60006101000a81548161ffff021916908361ffff16021790555050565b600860149054906101000a900460ff1681565b6000610de8600c6127b8565b905090565b6060600860149054906101000a900460ff16610e3e576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250610e75565b6040518060400160405280600181526020017f31000000000000000000000000000000000000000000000000000000000000008152505b601260009054906101000a900460ff16610ec4576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250610efb565b6040518060400160405280600181526020017f31000000000000000000000000000000000000000000000000000000000000008152505b610f0d610f08600c6127b8565b6127c6565b610f1f610f1a600d6127b8565b6127c6565b610f3c600f60009054906101000a900461ffff1661ffff166127c6565b610f59600f60029054906101000a900461ffff1661ffff166127c6565b610f64600e546127c6565b610f7f600f60049054906101000a900460ff1660ff166127c6565b610f9a600f60059054906101000a900460ff1660ff166127c6565b610fb5601260019054906101000a900460ff1660ff166127c6565b604051602001610fce9a999897969594939291906148b9565b604051602081830303815290604052905090565b600f60009054906101000a900461ffff1681565b600e5481565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461103a5761103933612526565b5b611045848484612894565b50505050565b61105361273a565b80600f60046101000a81548160ff021916908360ff16021790555050565b6000806000600760008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16036112065760066040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b60006112106128f4565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff168661123c91906149a8565b6112469190614a19565b90508160000151819350935050509250929050565b61126361273a565b80600f60056101000a81548160ff021916908360ff16021790555050565b6060601160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080548060200260200160405190810160405280929190818152602001828054801561130c57602002820191906000526020600020905b8154815260200190600101908083116112f8575b50505050509050919050565b61132061273a565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505061138057600080fd5b565b61138a61273a565b80600f60026101000a81548161ffff021916908361ffff16021790555050565b6daaeb6d7670e522a718067333cd4e81565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146113fa576113f933612526565b5b6114058484846128fe565b50505050565b600f60029054906101000a900461ffff1681565b61142761273a565b80600b90816114369190614bec565b5050565b61144261273a565b80600860146101000a81548160ff02191690831515021790555050565b60008061146b8361291e565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036114dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d390614d0a565b60405180910390fd5b80915050919050565b600860149054906101000a900460ff1615611535576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152c90614d76565b60405180910390fd5b600f60029054906101000a900461ffff16600f60009054906101000a900461ffff166115619190614d96565b61ffff168160ff16611573600d6127b8565b61157d600c6127b8565b6115879190614dcc565b6115919190614e00565b11156115d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c990614e80565b60405180910390fd5b60008160ff1611611618576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160f90614eec565b60405180910390fd5b8060ff16600e5461162991906149a8565b34101561166b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166290614f58565b60405180910390fd5b601260009054906101000a900460ff16156116bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b290614fc4565b60405180910390fd5b6000600f60049054906101000a900460ff1660ff16111561174657600f60049054906101000a900460ff1660ff168160ff166116f633611fde565b6117009190614fe4565b61ffff161115611745576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173c90615066565b60405180910390fd5b5b60005b8160ff168160ff16101561186857611761600c61295b565b601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081819054906101000a900461ffff16809291906117be90614807565b91906101000a81548161ffff021916908361ffff16021790555050601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020611822600c6127b8565b908060018154018082558091505060019003906000526020600020016000909190919091505561185b33611856600c6127b8565b612971565b8080600101915050611749565b5050565b61187461273a565b80600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600860149054906101000a900460ff1615611908576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ff90614d76565b60405180910390fd5b600f60029054906101000a900461ffff16600f60009054906101000a900461ffff166119349190614d96565b61ffff168260ff16611946600d6127b8565b611950600c6127b8565b61195a9190614dcc565b6119649190614e00565b11156119a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199c90614e80565b60405180910390fd5b60008260ff16116119eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e290614eec565b60405180910390fd5b8160ff16600e546119fc91906149a8565b341015611a3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3590614f58565b60405180910390fd5b601260009054906101000a900460ff16611a8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a84906150d2565b60405180910390fd5b611a9f611a993361298f565b826129e5565b611ade576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad59061513e565b60405180910390fd5b6000600f60059054906101000a900460ff1660ff161115611b6957600f60059054906101000a900460ff1660ff168260ff16611b1933611fde565b611b239190614fe4565b61ffff161115611b68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5f90615066565b60405180910390fd5b5b60005b8260ff168160ff161015611c8b57611b84600c61295b565b601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081819054906101000a900461ffff1680929190611be190614807565b91906101000a81548161ffff021916908361ffff16021790555050601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020611c45600c6127b8565b9080600181540180825580915050600190039060005260206000200160009091909190915055611c7e33611c79600c6127b8565b612971565b8080600101915050611b6c565b505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611d00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf7906151d0565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611d4f61273a565b611d596000612b0e565b565b600f60059054906101000a900460ff1681565b600c8060000154905081565b611d8261273a565b80601260006101000a81548160ff02191690831515021790555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611dd161273a565b600f60029054906101000a900461ffff1661ffff168161ffff16611df5600d6127b8565b611dff9190614e00565b1115611e40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3790614e80565b60405180910390fd5b60005b8161ffff168161ffff161015611ef657611e5d600c61295b565b611e67600d61295b565b601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020611eb0600c6127b8565b9080600181540180825580915050600190039060005260206000200160009091909190915055611ee983611ee4600c6127b8565b612971565b8080600101915050611e43565b505050565b611f0361273a565b80600e8190555050565b606060018054611f1c90614778565b80601f0160208091040260200160405190810160405280929190818152602001828054611f4890614778565b8015611f955780601f10611f6a57610100808354040283529160200191611f95565b820191906000526020600020905b815481529060010190602001808311611f7857829003601f168201915b5050505050905090565b601260019054906101000a900460ff1681565b601260009054906101000a900460ff1681565b81611fcf81612526565b611fd98383612bd4565b505050565b6000601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900461ffff169050919050565b61203d61273a565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361207657600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036120ae57600080fd5b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b833373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146121305761212f33612526565b5b61213c85858585612bea565b5050505050565b600d8060000154905081565b61215761273a565b80601260016101000a81548160ff021916908360ff16021790555050565b606061218082612c4c565b6121bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b69061523c565b60405180910390fd5b600b6121ca836127c6565b6040516020016121db9291906152df565b6040516020818303038152906040529050919050565b6060600b805461220090614778565b80601f016020809104026020016040519081016040528092919081815260200182805461222c90614778565b80156122795780601f1061224e57610100808354040283529160200191612279565b820191906000526020600020905b81548152906001019060200180831161225c57829003601f168201915b5050505050905090565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600f60049054906101000a900460ff1681565b61235861273a565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036123c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123be90615375565b60405180910390fd5b6123d081612b0e565b50565b600b80546123e090614778565b80601f016020809104026020016040519081016040528092919081815260200182805461240c90614778565b80156124595780601f1061242e57610100808354040283529160200191612459565b820191906000526020600020905b81548152906001019060200180831161243c57829003601f168201915b505050505081565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806124d457506124d382612c8d565b5b9050919050565b6124e481612c4c565b612523576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161251a90614d0a565b60405180910390fd5b50565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115612620576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b815260040161259d929190615395565b602060405180830381865afa1580156125ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125de91906153d3565b61261f57806040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016126169190613f2b565b60405180910390fd5b5b50565b600061262e8261145f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361269e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161269590615472565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166126bd612d6f565b73ffffffffffffffffffffffffffffffffffffffff1614806126ec57506126eb816126e6612d6f565b6122a9565b5b61272b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161272290615504565b60405180910390fd5b6127358383612d77565b505050565b612742612d6f565b73ffffffffffffffffffffffffffffffffffffffff16612760611d9f565b73ffffffffffffffffffffffffffffffffffffffff16146127b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127ad90615570565b60405180910390fd5b565b600081600001549050919050565b6060600060016127d584612e30565b01905060008167ffffffffffffffff8111156127f4576127f361428f565b5b6040519080825280601f01601f1916602001820160405280156128265781602001600182028036833780820191505090505b509050600082602001820190505b600115612889578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a858161287d5761287c6149ea565b5b04945060008503612834575b819350505050919050565b6128a561289f612d6f565b82612f83565b6128e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128db90615602565b60405180910390fd5b6128ef838383613018565b505050565b6000612710905090565b612919838383604051806020016040528060008152506120f2565b505050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6001816000016000828254019250508190555050565b61298b8282604051806020016040528060008152506130d7565b5050565b6000816040516020016129a2919061566a565b604051602081830303815290604052805190602001206040516020016129c891906156f2565b604051602081830303815290604052805190602001209050919050565b60008060018484604001518560000151866020015160405160008152602001604052604051612a179493929190615727565b6020604051602081039080840390855afa158015612a39573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612ab4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aab906157b8565b60405180910390fd5b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161491505092915050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612be6612bdf612d6f565b8383613132565b5050565b612bfb612bf5612d6f565b83612f83565b612c3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c3190615602565b60405180910390fd5b612c468484848461329e565b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff16612c6e8361291e565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612d5857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612d685750612d67826132fa565b5b9050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612dea8361145f565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612e8e577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381612e8457612e836149ea565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612ecb576d04ee2d6d415b85acef81000000008381612ec157612ec06149ea565b5b0492506020810190505b662386f26fc100008310612efa57662386f26fc100008381612ef057612eef6149ea565b5b0492506010810190505b6305f5e1008310612f23576305f5e1008381612f1957612f186149ea565b5b0492506008810190505b6127108310612f48576127108381612f3e57612f3d6149ea565b5b0492506004810190505b60648310612f6b5760648381612f6157612f606149ea565b5b0492506002810190505b600a8310612f7a576001810190505b80915050919050565b600080612f8f8361145f565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612fd15750612fd081856122a9565b5b8061300f57508373ffffffffffffffffffffffffffffffffffffffff16612ff784610d42565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146130565761305533612526565b5b613061848484613364565b61306b848361365d565b601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082908060018154018082558091505060019003906000526020600020016000909190919091505550505050565b6130e18383613782565b6130ee600084848461399f565b61312d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131249061584a565b60405180910390fd5b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036131a0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613197906158b6565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516132919190613d29565b60405180910390a3505050565b6132a9848484613018565b6132b58484848461399f565b6132f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132eb9061584a565b60405180910390fd5b50505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b8273ffffffffffffffffffffffffffffffffffffffff166133848261145f565b73ffffffffffffffffffffffffffffffffffffffff16146133da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133d190615948565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613449576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613440906159da565b60405180910390fd5b6134568383836001613b26565b8273ffffffffffffffffffffffffffffffffffffffff166134768261145f565b73ffffffffffffffffffffffffffffffffffffffff16146134cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134c390615948565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46136588383836001613c4c565b505050565b60005b601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905081101561377d5781601160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481106136fc576136fb6147a9565b5b90600052602060002001540361377057601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020818154811061375d5761375c6147a9565b5b906000526020600020016000905561377d565b8080600101915050613660565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036137f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137e890615a46565b60405180910390fd5b6137fa81612c4c565b1561383a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161383190615ab2565b60405180910390fd5b613848600083836001613b26565b61385181612c4c565b15613891576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161388890615ab2565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461399b600083836001613c4c565b5050565b60006139c08473ffffffffffffffffffffffffffffffffffffffff16613c52565b15613b19578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026139e9612d6f565b8786866040518563ffffffff1660e01b8152600401613a0b9493929190615b27565b6020604051808303816000875af1925050508015613a4757506040513d601f19601f82011682018060405250810190613a449190615b88565b60015b613ac9573d8060008114613a77576040519150601f19603f3d011682016040523d82523d6000602084013e613a7c565b606091505b506000815103613ac1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ab89061584a565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613b1e565b600190505b949350505050565b6001811115613c4657600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614613bba5780600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613bb29190614dcc565b925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614613c455780600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613c3d9190614e00565b925050819055505b5b50505050565b50505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613cbe81613c89565b8114613cc957600080fd5b50565b600081359050613cdb81613cb5565b92915050565b600060208284031215613cf757613cf6613c7f565b5b6000613d0584828501613ccc565b91505092915050565b60008115159050919050565b613d2381613d0e565b82525050565b6000602082019050613d3e6000830184613d1a565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613d7e578082015181840152602081019050613d63565b60008484015250505050565b6000601f19601f8301169050919050565b6000613da682613d44565b613db08185613d4f565b9350613dc0818560208601613d60565b613dc981613d8a565b840191505092915050565b60006020820190508181036000830152613dee8184613d9b565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613e2182613df6565b9050919050565b613e3181613e16565b8114613e3c57600080fd5b50565b600081359050613e4e81613e28565b92915050565b600060208284031215613e6a57613e69613c7f565b5b6000613e7884828501613e3f565b91505092915050565b600061ffff82169050919050565b613e9881613e81565b82525050565b6000602082019050613eb36000830184613e8f565b92915050565b6000819050919050565b613ecc81613eb9565b8114613ed757600080fd5b50565b600081359050613ee981613ec3565b92915050565b600060208284031215613f0557613f04613c7f565b5b6000613f1384828501613eda565b91505092915050565b613f2581613e16565b82525050565b6000602082019050613f406000830184613f1c565b92915050565b60008060408385031215613f5d57613f5c613c7f565b5b6000613f6b85828601613e3f565b9250506020613f7c85828601613eda565b9150509250929050565b613f8f81613e81565b8114613f9a57600080fd5b50565b600081359050613fac81613f86565b92915050565b600060208284031215613fc857613fc7613c7f565b5b6000613fd684828501613f9d565b91505092915050565b613fe881613eb9565b82525050565b60006020820190506140036000830184613fdf565b92915050565b60008060006060848603121561402257614021613c7f565b5b600061403086828701613e3f565b935050602061404186828701613e3f565b925050604061405286828701613eda565b9150509250925092565b600060ff82169050919050565b6140728161405c565b811461407d57600080fd5b50565b60008135905061408f81614069565b92915050565b6000602082840312156140ab576140aa613c7f565b5b60006140b984828501614080565b91505092915050565b600080604083850312156140d9576140d8613c7f565b5b60006140e785828601613eda565b92505060206140f885828601613eda565b9150509250929050565b60006040820190506141176000830185613f1c565b6141246020830184613fdf565b9392505050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61416081613eb9565b82525050565b60006141728383614157565b60208301905092915050565b6000602082019050919050565b60006141968261412b565b6141a08185614136565b93506141ab83614147565b8060005b838110156141dc5781516141c38882614166565b97506141ce8361417e565b9250506001810190506141af565b5085935050505092915050565b60006020820190508181036000830152614203818461418b565b905092915050565b6000819050919050565b600061423061422b61422684613df6565b61420b565b613df6565b9050919050565b600061424282614215565b9050919050565b600061425482614237565b9050919050565b61426481614249565b82525050565b600060208201905061427f600083018461425b565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6142c782613d8a565b810181811067ffffffffffffffff821117156142e6576142e561428f565b5b80604052505050565b60006142f9613c75565b905061430582826142be565b919050565b600067ffffffffffffffff8211156143255761432461428f565b5b61432e82613d8a565b9050602081019050919050565b82818337600083830152505050565b600061435d6143588461430a565b6142ef565b9050828152602081018484840111156143795761437861428a565b5b61438484828561433b565b509392505050565b600082601f8301126143a1576143a0614285565b5b81356143b184826020860161434a565b91505092915050565b6000602082840312156143d0576143cf613c7f565b5b600082013567ffffffffffffffff8111156143ee576143ed613c84565b5b6143fa8482850161438c565b91505092915050565b61440c81613d0e565b811461441757600080fd5b50565b60008135905061442981614403565b92915050565b60006020828403121561444557614444613c7f565b5b60006144538482850161441a565b91505092915050565b600080fd5b6000819050919050565b61447481614461565b811461447f57600080fd5b50565b6000813590506144918161446b565b92915050565b6000606082840312156144ad576144ac61445c565b5b6144b760606142ef565b905060006144c784828501614482565b60008301525060206144db84828501614482565b60208301525060406144ef84828501614080565b60408301525092915050565b6000806080838503121561451257614511613c7f565b5b600061452085828601614080565b925050602061453185828601614497565b9150509250929050565b6145448161405c565b82525050565b600060208201905061455f600083018461453b565b92915050565b6000806040838503121561457c5761457b613c7f565b5b600061458a85828601613e3f565b925050602061459b85828601613f9d565b9150509250929050565b600080604083850312156145bc576145bb613c7f565b5b60006145ca85828601613e3f565b92505060206145db8582860161441a565b9150509250929050565b600067ffffffffffffffff821115614600576145ff61428f565b5b61460982613d8a565b9050602081019050919050565b6000614629614624846145e5565b6142ef565b9050828152602081018484840111156146455761464461428a565b5b61465084828561433b565b509392505050565b600082601f83011261466d5761466c614285565b5b813561467d848260208601614616565b91505092915050565b600080600080608085870312156146a05761469f613c7f565b5b60006146ae87828801613e3f565b94505060206146bf87828801613e3f565b93505060406146d087828801613eda565b925050606085013567ffffffffffffffff8111156146f1576146f0613c84565b5b6146fd87828801614658565b91505092959194509250565b600080604083850312156147205761471f613c7f565b5b600061472e85828601613e3f565b925050602061473f85828601613e3f565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061479057607f821691505b6020821081036147a3576147a2614749565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061481282613e81565b915061ffff8203614826576148256147d8565b5b600182019050919050565b600081905092915050565b600061484782613d44565b6148518185614831565b9350614861818560208601613d60565b80840191505092915050565b7f5f00000000000000000000000000000000000000000000000000000000000000600082015250565b60006148a3600183614831565b91506148ae8261486d565b600182019050919050565b60006148c5828d61483c565b91506148d082614896565b91506148dc828c61483c565b91506148e782614896565b91506148f3828b61483c565b91506148fe82614896565b915061490a828a61483c565b915061491582614896565b9150614921828961483c565b915061492c82614896565b9150614938828861483c565b915061494382614896565b915061494f828761483c565b915061495a82614896565b9150614966828661483c565b915061497182614896565b915061497d828561483c565b915061498882614896565b9150614994828461483c565b91508190509b9a5050505050505050505050565b60006149b382613eb9565b91506149be83613eb9565b92508282026149cc81613eb9565b915082820484148315176149e3576149e26147d8565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614a2482613eb9565b9150614a2f83613eb9565b925082614a3f57614a3e6149ea565b5b828204905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302614aac7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614a6f565b614ab68683614a6f565b95508019841693508086168417925050509392505050565b6000614ae9614ae4614adf84613eb9565b61420b565b613eb9565b9050919050565b6000819050919050565b614b0383614ace565b614b17614b0f82614af0565b848454614a7c565b825550505050565b600090565b614b2c614b1f565b614b37818484614afa565b505050565b5b81811015614b5b57614b50600082614b24565b600181019050614b3d565b5050565b601f821115614ba057614b7181614a4a565b614b7a84614a5f565b81016020851015614b89578190505b614b9d614b9585614a5f565b830182614b3c565b50505b505050565b600082821c905092915050565b6000614bc360001984600802614ba5565b1980831691505092915050565b6000614bdc8383614bb2565b9150826002028217905092915050565b614bf582613d44565b67ffffffffffffffff811115614c0e57614c0d61428f565b5b614c188254614778565b614c23828285614b5f565b600060209050601f831160018114614c565760008415614c44578287015190505b614c4e8582614bd0565b865550614cb6565b601f198416614c6486614a4a565b60005b82811015614c8c57848901518255600182019150602085019450602081019050614c67565b86831015614ca95784890151614ca5601f891682614bb2565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000614cf4601883613d4f565b9150614cff82614cbe565b602082019050919050565b60006020820190508181036000830152614d2381614ce7565b9050919050565b7f7061757365640000000000000000000000000000000000000000000000000000600082015250565b6000614d60600683613d4f565b9150614d6b82614d2a565b602082019050919050565b60006020820190508181036000830152614d8f81614d53565b9050919050565b6000614da182613e81565b9150614dac83613e81565b9250828203905061ffff811115614dc657614dc56147d8565b5b92915050565b6000614dd782613eb9565b9150614de283613eb9565b9250828203905081811115614dfa57614df96147d8565b5b92915050565b6000614e0b82613eb9565b9150614e1683613eb9565b9250828201905080821115614e2e57614e2d6147d8565b5b92915050565b7f6e6f20737570706c790000000000000000000000000000000000000000000000600082015250565b6000614e6a600983613d4f565b9150614e7582614e34565b602082019050919050565b60006020820190508181036000830152614e9981614e5d565b9050919050565b7f6d696e74202b3100000000000000000000000000000000000000000000000000600082015250565b6000614ed6600783613d4f565b9150614ee182614ea0565b602082019050919050565b60006020820190508181036000830152614f0581614ec9565b9050919050565b7f6e656564206574682b0000000000000000000000000000000000000000000000600082015250565b6000614f42600983613d4f565b9150614f4d82614f0c565b602082019050919050565b60006020820190508181036000830152614f7181614f35565b9050919050565b7f574c206973206f6e000000000000000000000000000000000000000000000000600082015250565b6000614fae600883613d4f565b9150614fb982614f78565b602082019050919050565b60006020820190508181036000830152614fdd81614fa1565b9050919050565b6000614fef82613e81565b9150614ffa83613e81565b9250828201905061ffff811115615014576150136147d8565b5b92915050565b7f6578636565646564206d61780000000000000000000000000000000000000000600082015250565b6000615050600c83613d4f565b915061505b8261501a565b602082019050919050565b6000602082019050818103600083015261507f81615043565b9050919050565b7f574c206973206f66660000000000000000000000000000000000000000000000600082015250565b60006150bc600983613d4f565b91506150c782615086565b602082019050919050565b600060208201905081810360008301526150eb816150af565b9050919050565b7f6e6f74206f6e20574c0000000000000000000000000000000000000000000000600082015250565b6000615128600983613d4f565b9150615133826150f2565b602082019050919050565b600060208201905081810360008301526151578161511b565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b60006151ba602983613d4f565b91506151c58261515e565b604082019050919050565b600060208201905081810360008301526151e9816151ad565b9050919050565b7f6d697373696e6720746f6b656e00000000000000000000000000000000000000600082015250565b6000615226600d83613d4f565b9150615231826151f0565b602082019050919050565b6000602082019050818103600083015261525581615219565b9050919050565b6000815461526981614778565b6152738186614831565b9450600182166000811461528e57600181146152a3576152d6565b60ff19831686528115158202860193506152d6565b6152ac85614a4a565b60005b838110156152ce578154818901526001820191506020810190506152af565b838801955050505b50505092915050565b60006152eb828561525c565b91506152f7828461483c565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061535f602683613d4f565b915061536a82615303565b604082019050919050565b6000602082019050818103600083015261538e81615352565b9050919050565b60006040820190506153aa6000830185613f1c565b6153b76020830184613f1c565b9392505050565b6000815190506153cd81614403565b92915050565b6000602082840312156153e9576153e8613c7f565b5b60006153f7848285016153be565b91505092915050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b600061545c602183613d4f565b915061546782615400565b604082019050919050565b6000602082019050818103600083015261548b8161544f565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b60006154ee603d83613d4f565b91506154f982615492565b604082019050919050565b6000602082019050818103600083015261551d816154e1565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061555a602083613d4f565b915061556582615524565b602082019050919050565b600060208201905081810360008301526155898161554d565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b60006155ec602d83613d4f565b91506155f782615590565b604082019050919050565b6000602082019050818103600083015261561b816155df565b9050919050565b60008160601b9050919050565b600061563a82615622565b9050919050565b600061564c8261562f565b9050919050565b61566461565f82613e16565b615641565b82525050565b60006156768284615653565b60148201915081905092915050565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b60006156bb601c83614831565b91506156c682615685565b601c82019050919050565b6000819050919050565b6156ec6156e782614461565b6156d1565b82525050565b60006156fd826156ae565b915061570982846156db565b60208201915081905092915050565b61572181614461565b82525050565b600060808201905061573c6000830187615718565b615749602083018661453b565b6157566040830185615718565b6157636060830184615718565b95945050505050565b7f696e76616c696420736967000000000000000000000000000000000000000000600082015250565b60006157a2600b83613d4f565b91506157ad8261576c565b602082019050919050565b600060208201905081810360008301526157d181615795565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000615834603283613d4f565b915061583f826157d8565b604082019050919050565b6000602082019050818103600083015261586381615827565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006158a0601983613d4f565b91506158ab8261586a565b602082019050919050565b600060208201905081810360008301526158cf81615893565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000615932602583613d4f565b915061593d826158d6565b604082019050919050565b6000602082019050818103600083015261596181615925565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006159c4602483613d4f565b91506159cf82615968565b604082019050919050565b600060208201905081810360008301526159f3816159b7565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000615a30602083613d4f565b9150615a3b826159fa565b602082019050919050565b60006020820190508181036000830152615a5f81615a23565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000615a9c601c83613d4f565b9150615aa782615a66565b602082019050919050565b60006020820190508181036000830152615acb81615a8f565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000615af982615ad2565b615b038185615add565b9350615b13818560208601613d60565b615b1c81613d8a565b840191505092915050565b6000608082019050615b3c6000830187613f1c565b615b496020830186613f1c565b615b566040830185613fdf565b8181036060830152615b688184615aee565b905095945050505050565b600081519050615b8281613cb5565b92915050565b600060208284031215615b9e57615b9d613c7f565b5b6000615bac84828501615b73565b9150509291505056fea26469706673582212208a82b1b0d63df45dc9598f69875896f0eb8b0e212ddd94b7b56779e6b5e5bcb164736f6c63430008130033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000b92f76122d51dc463178bdf7f8fc94bd683fa54b000000000000000000000000f097022ff2befcbbc50b7c25c6f94a21545248cc000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000006f05b59d3b2000000000000000000000000000000000000000000000000000000000000000008340000000000000000000000000000000000000000000000000000000000000163000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002968747470733a2f2f7072656d696e742e6c656e64616c70726f2e74726164652f6170692f6d6574612f0000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : signer (address): 0xb92f76122d51dc463178bDF7f8Fc94bd683fa54b
Arg [1] : account (address): 0xf097022fF2bEfcBBc50B7c25C6f94A21545248cc
Arg [2] : baseUrl (string): https://premint.lendalpro.trade/api/meta/
Arg [3] : price (uint256): 500000000000000000
Arg [4] : supply (uint16): 2100
Arg [5] : reserved (uint16): 355
Arg [6] : mintLimit (uint8): 1
Arg [7] : mintLimitWhitelist (uint8): 1
Arg [8] : isWhitelistOnly (bool): True
-----Encoded View---------------
12 Constructor Arguments found :
Arg [0] : 000000000000000000000000b92f76122d51dc463178bdf7f8fc94bd683fa54b
Arg [1] : 000000000000000000000000f097022ff2befcbbc50b7c25c6f94a21545248cc
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [3] : 00000000000000000000000000000000000000000000000006f05b59d3b20000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000834
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000163
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000029
Arg [10] : 68747470733a2f2f7072656d696e742e6c656e64616c70726f2e74726164652f
Arg [11] : 6170692f6d6574612f0000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
71295:8717:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;79846:161;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56302:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75261:265;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57814:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;78846:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74224:89;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71463:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75141:88;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72625:545;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71684:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71659:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;79000:154;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74504:90;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45553:442;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;74597:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75529:114;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76055:121;;;:::i;:::-;;74316:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7735:143;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;79157:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71713:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74411:90;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73187:77;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56012:223;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77307:957;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73283:80;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76193:1111;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55743:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29754:103;;;;;;;;;;;;;:::i;:::-;;71771:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71583:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73366:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29106:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;78269:380;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74137:84;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56471:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71951:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71919:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;78676:167;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75646:112;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73955:179;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;79322:187;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71617:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74708:82;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74805:232;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75040:85;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71520:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58283:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71744:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30012:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71557:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;79846:161;79948:4;79966:36;79990:11;79966:23;:36::i;:::-;79959:43;;79846:161;;;:::o;56302:100::-;56356:13;56389:5;56382:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56302:100;:::o;75261:265::-;75326:6;75339:12;75354:1;75339:16;;75364:8;75360:145;75377:15;:21;75393:4;75377:21;;;;;;;;;;;;;;;:28;;;;75375:1;:30;;;75360:145;;;75444:1;75417:15;:21;75433:4;75417:21;;;;;;;;;;;;;;;75439:1;75417:24;;;;;;;;;;:::i;:::-;;;;;;;;;;:28;75414:54;;;75454:7;;;;;:::i;:::-;;;;75414:54;75490:3;;;;;;;75360:145;;;;75516:5;75509:12;;;75261:265;;;:::o;57814:171::-;57890:7;57910:23;57925:7;57910:14;:23::i;:::-;57953:15;:24;57969:7;57953:24;;;;;;;;;;;;;;;;;;;;;57946:31;;57814:171;;;:::o;78846:151::-;78942:8;9517:30;9538:8;9517:20;:30::i;:::-;78957:32:::1;78971:8;78981:7;78957:13;:32::i;:::-;78846:151:::0;;;:::o;74224:89::-;28992:13;:11;:13::i;:::-;74300:8:::1;74286:11;;:22;;;;;;;;;;;;;;;;;;74224:89:::0;:::o;71463:26::-;;;;;;;;;;;;;:::o;75141:88::-;75187:7;75208:16;:6;:14;:16::i;:::-;75201:23;;75141:88;:::o;72625:545::-;72668:13;72725:7;;;;;;;;;;;:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72761:16;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72805:34;72822:16;:6;:14;:16::i;:::-;72805;:34::i;:::-;72854:42;72871:24;:14;:22;:24::i;:::-;72854:16;:42::i;:::-;72911:29;72928:11;;;;;;;;;;;72911:29;;:16;:29::i;:::-;72955:31;72972:13;;;;;;;;;;;72955:31;;:16;:31::i;:::-;73001:24;73018:6;;73001:16;:24::i;:::-;73040:28;73057:10;;;;;;;;;;;73040:28;;:16;:28::i;:::-;73083:37;73100:19;;;;;;;;;;;73083:37;;:16;:37::i;:::-;73135:24;73152:6;;;;;;;;;;;73135:24;;:16;:24::i;:::-;72702:462;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;72688:477;;72625:545;:::o;71684:25::-;;;;;;;;;;;;;:::o;71659:21::-;;;;:::o;79000:154::-;79101:4;9251:10;9243:18;;:4;:18;;;9239:83;;9278:32;9299:10;9278:20;:32::i;:::-;9239:83;79112:37:::1;79131:4;79137:2;79141:7;79112:18;:37::i;:::-;79000:154:::0;;;;:::o;74504:90::-;28992:13;:11;:13::i;:::-;74581:8:::1;74568:10;;:21;;;;;;;;;;;;;;;;;;74504:90:::0;:::o;45553:442::-;45650:7;45659;45679:26;45708:17;:27;45726:8;45708:27;;;;;;;;;;;45679:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45780:1;45752:30;;:7;:16;;;:30;;;45748:92;;45809:19;45799:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45748:92;45852:21;45917:17;:15;:17::i;:::-;45876:58;;45890:7;:23;;;45877:36;;:10;:36;;;;:::i;:::-;45876:58;;;;:::i;:::-;45852:82;;45955:7;:16;;;45973:13;45947:40;;;;;;45553:442;;;;;:::o;74597:108::-;28992:13;:11;:13::i;:::-;74692:8:::1;74670:19;;:30;;;;;;;;;;;;;;;;;;74597:108:::0;:::o;75529:114::-;75587:16;75617:15;:21;75633:4;75617:21;;;;;;;;;;;;;;;75610:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75529:114;;;:::o;76055:121::-;28992:13;:11;:13::i;:::-;76123:18:::1;;;;;;;;;;;76115:32;;:55;76148:21;76115:55;;;;;;;;;;;;;;;;;;;;;;;76107:64;;;::::0;::::1;;76055:121::o:0;74316:92::-;28992:13;:11;:13::i;:::-;74395:8:::1;74379:13;;:24;;;;;;;;;;;;;;;;;;74316:92:::0;:::o;7735:143::-;151:42;7735:143;:::o;79157:162::-;79262:4;9251:10;9243:18;;:4;:18;;;9239:83;;9278:32;9299:10;9278:20;:32::i;:::-;9239:83;79273:41:::1;79296:4;79302:2;79306:7;79273:22;:41::i;:::-;79157:162:::0;;;;:::o;71713:27::-;;;;;;;;;;;;;:::o;74411:90::-;28992:13;:11;:13::i;:::-;74490:6:::1;74479:8;:17;;;;;;:::i;:::-;;74411:90:::0;:::o;73187:77::-;28992:13;:11;:13::i;:::-;73254:5:::1;73244:7;;:15;;;;;;;;;;;;;;;;;;73187:77:::0;:::o;56012:223::-;56084:7;56104:13;56120:17;56129:7;56120:8;:17::i;:::-;56104:33;;56173:1;56156:19;;:5;:19;;;56148:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;56222:5;56215:12;;;56012:223;;;:::o;77307:957::-;77399:7;;;;;;;;;;;77398:8;77390:26;;;;;;;;;;;;:::i;:::-;;;;;;;;;77542:13;;;;;;;;;;;77528:11;;;;;;;;;;;:27;;;;:::i;:::-;77471:84;;77517:7;77471:53;;77490:24;:14;:22;:24::i;:::-;77471:16;:6;:14;:16::i;:::-;:43;;;;:::i;:::-;:53;;;;:::i;:::-;:84;;77463:105;;;;;;;;;;;;:::i;:::-;;;;;;;;;77621:1;77611:7;:11;;;77603:30;;;;;;;;;;;;:::i;:::-;;;;;;;;;77706:7;77697:16;;:6;;:16;;;;:::i;:::-;77684:9;:29;;77676:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;77763:16;;;;;;;;;;;77762:17;77754:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;77925:1;77912:10;;;;;;;;;;;:14;;;77909:113;;;77990:10;;;;;;;;;;;77942:58;;77979:7;77942:44;;:34;77965:10;77942:22;:34::i;:::-;:44;;;;:::i;:::-;:58;;;;77934:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;77909:113;78042:7;78038:220;78052:7;78050:9;;:1;:9;;;78038:220;;;78068:18;:6;:16;:18::i;:::-;78092:14;:26;78107:10;78092:26;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;78126:15;:27;78142:10;78126:27;;;;;;;;;;;;;;;78159:16;:6;:14;:16::i;:::-;78126:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;78182:38;78192:10;78203:16;:6;:14;:16::i;:::-;78182:9;:38::i;:::-;78243:3;;;;;;;78038:220;;;;77307:957;:::o;73283:80::-;28992:13;:11;:13::i;:::-;73352:6:::1;73342:7;;:16;;;;;;;;;;;;;;;;;;73283:80:::0;:::o;76193:1111::-;76302:7;;;;;;;;;;;76301:8;76293:26;;;;;;;;;;;;:::i;:::-;;;;;;;;;76445:13;;;;;;;;;;;76431:11;;;;;;;;;;;:27;;;;:::i;:::-;76374:84;;76420:7;76374:53;;76393:24;:14;:22;:24::i;:::-;76374:16;:6;:14;:16::i;:::-;:43;;;;:::i;:::-;:53;;;;:::i;:::-;:84;;76366:105;;;;;;;;;;;;:::i;:::-;;;;;;;;;76524:1;76514:7;:11;;;76506:30;;;;;;;;;;;;:::i;:::-;;;;;;;;;76609:7;76600:16;;:6;;:16;;;;:::i;:::-;76587:9;:29;;76579:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;76666:16;;;;;;;;;;;76658:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;76735:58;76753:32;76774:10;76753:20;:32::i;:::-;76786:6;76735:17;:58::i;:::-;76727:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;76956:1;76934:19;;;;;;;;;;;:23;;;76931:131;;;77021:19;;;;;;;;;;;76973:67;;77010:7;76973:44;;:34;76996:10;76973:22;:34::i;:::-;:44;;;;:::i;:::-;:67;;;;76965:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;76931:131;77082:7;77078:220;77092:7;77090:9;;:1;:9;;;77078:220;;;77108:18;:6;:16;:18::i;:::-;77132:14;:26;77147:10;77132:26;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;77166:15;:27;77182:10;77166:27;;;;;;;;;;;;;;;77199:16;:6;:14;:16::i;:::-;77166:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77222:38;77232:10;77243:16;:6;:14;:16::i;:::-;77222:9;:38::i;:::-;77283:3;;;;;;;77078:220;;;;76193:1111;;:::o;55743:207::-;55815:7;55860:1;55843:19;;:5;:19;;;55835:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;55926:9;:16;55936:5;55926:16;;;;;;;;;;;;;;;;55919:23;;55743:207;;;:::o;29754:103::-;28992:13;:11;:13::i;:::-;29819:30:::1;29846:1;29819:18;:30::i;:::-;29754:103::o:0;71771:32::-;;;;;;;;;;;;;:::o;71583:30::-;;;;;;;;;:::o;73366:94::-;28992:13;:11;:13::i;:::-;73448:7:::1;73429:16;;:26;;;;;;;;;;;;;;;;;;73366:94:::0;:::o;29106:87::-;29152:7;29179:6;;;;;;;;;;;29172:13;;29106:87;:::o;78269:380::-;28992:13;:11;:13::i;:::-;78397::::1;;;;;;;;;;;78359:51;;78386:7;78359:34;;:24;:14;:22;:24::i;:::-;:34;;;;:::i;:::-;:51;;78351:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;78432:8;78428:217;78443:7;78441:9;;:1;:9;;;78428:217;;;78459:18;:6;:16;:18::i;:::-;78483:26;:14;:24;:26::i;:::-;78515:15;:26;78531:9;78515:26;;;;;;;;;;;;;;;78547:16;:6;:14;:16::i;:::-;78515:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;78570:37;78580:9;78590:16;:6;:14;:16::i;:::-;78570:9;:37::i;:::-;78630:3;;;;;;;78428:217;;;;78269:380:::0;;:::o;74137:84::-;28992:13;:11;:13::i;:::-;74208:8:::1;74199:6;:17;;;;74137:84:::0;:::o;56471:104::-;56527:13;56560:7;56553:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56471:104;:::o;71951:23::-;;;;;;;;;;;;;:::o;71919:28::-;;;;;;;;;;;;;:::o;78676:167::-;78780:8;9517:30;9538:8;9517:20;:30::i;:::-;78795:43:::1;78819:8;78829;78795:23;:43::i;:::-;78676:167:::0;;;:::o;75646:112::-;75713:6;75733:14;:20;75748:4;75733:20;;;;;;;;;;;;;;;;;;;;;;;;;75726:27;;75646:112;;;:::o;73955:179::-;28992:13;:11;:13::i;:::-;74055:1:::1;74036:21;;:7;:21;;::::0;74028:30:::1;;;::::0;::::1;;74090:4;74071:24;;:7;:24;;::::0;74063:33:::1;;;::::0;::::1;;74122:7;74101:18;;:28;;;;;;;;;;;;;;;;;;73955:179:::0;:::o;79322:187::-;79446:4;9251:10;9243:18;;:4;:18;;;9239:83;;9278:32;9299:10;9278:20;:32::i;:::-;9239:83;79457:47:::1;79480:4;79486:2;79490:7;79499:4;79457:22;:47::i;:::-;79322:187:::0;;;;;:::o;71617:38::-;;;;;;;;;:::o;74708:82::-;28992:13;:11;:13::i;:::-;74777:8:::1;74768:6;;:17;;;;;;;;;;;;;;;;;;74708:82:::0;:::o;74805:232::-;74870:13;74932:16;74940:7;74932;:16::i;:::-;74924:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;75003:8;75012:18;:7;:16;:18::i;:::-;74986:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;74972:60;;74805:232;;;:::o;75040:85::-;75085:13;75112:8;75105:15;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75040:85;:::o;71520:33::-;;;;;;;;;;;;;:::o;58283:164::-;58380:4;58404:18;:25;58423:5;58404:25;;;;;;;;;;;;;;;:35;58430:8;58404:35;;;;;;;;;;;;;;;;;;;;;;;;;58397:42;;58283:164;;;;:::o;71744:23::-;;;;;;;;;;;;;:::o;30012:201::-;28992:13;:11;:13::i;:::-;30121:1:::1;30101:22;;:8;:22;;::::0;30093:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;30177:28;30196:8;30177:18;:28::i;:::-;30012:201:::0;:::o;71557:22::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;45283:215::-;45385:4;45424:26;45409:41;;;:11;:41;;;;:81;;;;45454:36;45478:11;45454:23;:36::i;:::-;45409:81;45402:88;;45283:215;;;:::o;67633:135::-;67715:16;67723:7;67715;:16::i;:::-;67707:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;67633:135;:::o;9660:647::-;9899:1;151:42;9851:45;;;:49;9847:453;;;151:42;10150;;;10201:4;10208:8;10150:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10145:144;;10264:8;10245:28;;;;;;;;;;;:::i;:::-;;;;;;;;10145:144;9847:453;9660:647;:::o;57332:416::-;57413:13;57429:23;57444:7;57429:14;:23::i;:::-;57413:39;;57477:5;57471:11;;:2;:11;;;57463:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;57571:5;57555:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;57580:37;57597:5;57604:12;:10;:12::i;:::-;57580:16;:37::i;:::-;57555:62;57533:173;;;;;;;;;;;;:::i;:::-;;;;;;;;;57719:21;57728:2;57732:7;57719:8;:21::i;:::-;57402:346;57332:416;;:::o;29271:132::-;29346:12;:10;:12::i;:::-;29335:23;;:7;:5;:7::i;:::-;:23;;;29327:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;29271:132::o;11186:114::-;11251:7;11278;:14;;;11271:21;;11186:114;;;:::o;25084:716::-;25140:13;25191:14;25228:1;25208:17;25219:5;25208:10;:17::i;:::-;:21;25191:38;;25244:20;25278:6;25267:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25244:41;;25300:11;25429:6;25425:2;25421:15;25413:6;25409:28;25402:35;;25466:288;25473:4;25466:288;;;25498:5;;;;;;;;25640:8;25635:2;25628:5;25624:14;25619:30;25614:3;25606:44;25696:2;25687:11;;;;;;:::i;:::-;;;;;25730:1;25721:5;:10;25466:288;25717:21;25466:288;25775:6;25768:13;;;;;25084:716;;;:::o;58514:335::-;58709:41;58728:12;:10;:12::i;:::-;58742:7;58709:18;:41::i;:::-;58701:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;58813:28;58823:4;58829:2;58833:7;58813:9;:28::i;:::-;58514:335;;;:::o;46277:97::-;46335:6;46361:5;46354:12;;46277:97;:::o;58920:185::-;59058:39;59075:4;59081:2;59085:7;59058:39;;;;;;;;;;;;:16;:39::i;:::-;58920:185;;;:::o;60806:117::-;60872:7;60899;:16;60907:7;60899:16;;;;;;;;;;;;;;;;;;;;;60892:23;;60806:117;;;:::o;11308:127::-;11415:1;11397:7;:14;;;:19;;;;;;;;;;;11308:127;:::o;62137:110::-;62213:26;62223:2;62227:7;62213:26;;;;;;;;;;;;:9;:26::i;:::-;62137:110;;:::o;73708:224::-;73779:7;73906:8;73889:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;73879:37;;;;;;73815:107;;;;;;;;:::i;:::-;;;;;;;;;;;;;73800:127;;;;;;73793:134;;73708:224;;;:::o;73463:242::-;73551:4;73562:14;73579:44;73589:6;73596;:8;;;73605:6;:8;;;73614:6;:8;;;73579:44;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73562:61;;73654:1;73636:20;;:6;:20;;;73628:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;73693:7;;;;;;;;;;;73683:17;;:6;:17;;;73676:24;;;73463:242;;;;:::o;30373:191::-;30447:16;30466:6;;;;;;;;;;;30447:25;;30492:8;30483:6;;:17;;;;;;;;;;;;;;;;;;30547:8;30516:40;;30537:8;30516:40;;;;;;;;;;;;30436:128;30373:191;:::o;58057:155::-;58152:52;58171:12;:10;:12::i;:::-;58185:8;58195;58152:18;:52::i;:::-;58057:155;;:::o;59176:322::-;59350:41;59369:12;:10;:12::i;:::-;59383:7;59350:18;:41::i;:::-;59342:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;59452:38;59466:4;59472:2;59476:7;59485:4;59452:13;:38::i;:::-;59176:322;;;;:::o;61236:128::-;61301:4;61354:1;61325:31;;:17;61334:7;61325:8;:17::i;:::-;:31;;;;61318:38;;61236:128;;;:::o;55374:305::-;55476:4;55528:25;55513:40;;;:11;:40;;;;:105;;;;55585:33;55570:48;;;:11;:48;;;;55513:105;:158;;;;55635:36;55659:11;55635:23;:36::i;:::-;55513:158;55493:178;;55374:305;;;:::o;27657:98::-;27710:7;27737:10;27730:17;;27657:98;:::o;66912:174::-;67014:2;66987:15;:24;67003:7;66987:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;67070:7;67066:2;67032:46;;67041:23;67056:7;67041:14;:23::i;:::-;67032:46;;;;;;;;;;;;66912:174;;:::o;21950:922::-;22003:7;22023:14;22040:1;22023:18;;22090:6;22081:5;:15;22077:102;;22126:6;22117:15;;;;;;:::i;:::-;;;;;22161:2;22151:12;;;;22077:102;22206:6;22197:5;:15;22193:102;;22242:6;22233:15;;;;;;:::i;:::-;;;;;22277:2;22267:12;;;;22193:102;22322:6;22313:5;:15;22309:102;;22358:6;22349:15;;;;;;:::i;:::-;;;;;22393:2;22383:12;;;;22309:102;22438:5;22429;:14;22425:99;;22473:5;22464:14;;;;;;:::i;:::-;;;;;22507:1;22497:11;;;;22425:99;22551:5;22542;:14;22538:99;;22586:5;22577:14;;;;;;:::i;:::-;;;;;22620:1;22610:11;;;;22538:99;22664:5;22655;:14;22651:99;;22699:5;22690:14;;;;;;:::i;:::-;;;;;22733:1;22723:11;;;;22651:99;22777:5;22768;:14;22764:66;;22813:1;22803:11;;;;22764:66;22858:6;22851:13;;;21950:922;;;:::o;61531:264::-;61624:4;61641:13;61657:23;61672:7;61657:14;:23::i;:::-;61641:39;;61710:5;61699:16;;:7;:16;;;:52;;;;61719:32;61736:5;61743:7;61719:16;:32::i;:::-;61699:52;:87;;;;61779:7;61755:31;;:20;61767:7;61755:11;:20::i;:::-;:31;;;61699:87;61691:96;;;61531:264;;;;:::o;79512:331::-;79612:4;9251:10;9243:18;;:4;:18;;;9239:83;;9278:32;9299:10;9278:20;:32::i;:::-;9239:83;79625:32:::1;79641:4;79646:2;79649:7;79625:15;:32::i;:::-;79720:43;79750:4;79755:7;79720:29;:43::i;:::-;79803:15;:19;79819:2;79803:19;;;;;;;;;;;;;;;79828:7;79803:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;79512:331:::0;;;;:::o;62474:319::-;62603:18;62609:2;62613:7;62603:5;:18::i;:::-;62654:53;62685:1;62689:2;62693:7;62702:4;62654:22;:53::i;:::-;62632:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;62474:319;;;:::o;67229:315::-;67384:8;67375:17;;:5;:17;;;67367:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;67471:8;67433:18;:25;67452:5;67433:25;;;;;;;;;;;;;;;:35;67459:8;67433:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;67517:8;67495:41;;67510:5;67495:41;;;67527:8;67495:41;;;;;;:::i;:::-;;;;;;;;67229:315;;;:::o;60379:313::-;60535:28;60545:4;60551:2;60555:7;60535:9;:28::i;:::-;60582:47;60605:4;60611:2;60615:7;60624:4;60582:22;:47::i;:::-;60574:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;60379:313;;;;:::o;43733:157::-;43818:4;43857:25;43842:40;;;:11;:40;;;;43835:47;;43733:157;;;:::o;65530:1263::-;65689:4;65662:31;;:23;65677:7;65662:14;:23::i;:::-;:31;;;65654:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;65768:1;65754:16;;:2;:16;;;65746:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;65824:42;65845:4;65851:2;65855:7;65864:1;65824:20;:42::i;:::-;65996:4;65969:31;;:23;65984:7;65969:14;:23::i;:::-;:31;;;65961:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;66114:15;:24;66130:7;66114:24;;;;;;;;;;;;66107:31;;;;;;;;;;;66609:1;66590:9;:15;66600:4;66590:15;;;;;;;;;;;;;;;;:20;;;;;;;;;;;66642:1;66625:9;:13;66635:2;66625:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;66684:2;66665:7;:16;66673:7;66665:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;66723:7;66719:2;66704:27;;66713:4;66704:27;;;;;;;;;;;;66744:41;66764:4;66770:2;66774:7;66783:1;66744:19;:41::i;:::-;65530:1263;;;:::o;75761:276::-;75848:9;75844:189;75862:15;:21;75878:4;75862:21;;;;;;;;;;;;;;;:28;;;;75860:1;:30;75844:189;;;75930:7;75902:15;:21;75918:4;75902:21;;;;;;;;;;;;;;;75924:1;75902:24;;;;;;;;:::i;:::-;;;;;;;;;;:35;75899:97;;75953:15;:21;75969:4;75953:21;;;;;;;;;;;;;;;75975:1;75953:24;;;;;;;;:::i;:::-;;;;;;;;;75946:31;;;75984:5;;75899:97;76018:3;;;;;;;75844:189;;;;75761:276;;:::o;63129:942::-;63223:1;63209:16;;:2;:16;;;63201:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;63282:16;63290:7;63282;:16::i;:::-;63281:17;63273:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;63344:48;63373:1;63377:2;63381:7;63390:1;63344:20;:48::i;:::-;63491:16;63499:7;63491;:16::i;:::-;63490:17;63482:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;63906:1;63889:9;:13;63899:2;63889:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;63950:2;63931:7;:16;63939:7;63931:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;63995:7;63991:2;63970:33;;63987:1;63970:33;;;;;;;;;;;;64016:47;64044:1;64048:2;64052:7;64061:1;64016:19;:47::i;:::-;63129:942;;:::o;68332:853::-;68486:4;68507:15;:2;:13;;;:15::i;:::-;68503:675;;;68559:2;68543:36;;;68580:12;:10;:12::i;:::-;68594:4;68600:7;68609:4;68543:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;68539:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68801:1;68784:6;:13;:18;68780:328;;68827:60;;;;;;;;;;:::i;:::-;;;;;;;;68780:328;69058:6;69052:13;69043:6;69039:2;69035:15;69028:38;68539:584;68675:41;;;68665:51;;;:6;:51;;;;68658:58;;;;;68503:675;69162:4;69155:11;;68332:853;;;;;;;:::o;69917:410::-;70107:1;70095:9;:13;70091:229;;;70145:1;70129:18;;:4;:18;;;70125:87;;70187:9;70168;:15;70178:4;70168:15;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;70125:87;70244:1;70230:16;;:2;:16;;;70226:83;;70284:9;70267;:13;70277:2;70267:13;;;;;;;;;;;;;;;;:26;;;;;;;:::i;:::-;;;;;;;;70226:83;70091:229;69917:410;;;;:::o;71049:158::-;;;;;:::o;31804:326::-;31864:4;32121:1;32099:7;:19;;;:23;32092:30;;31804:326;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:126::-;2897:7;2937:42;2930:5;2926:54;2915:65;;2860:126;;;:::o;2992:96::-;3029:7;3058:24;3076:5;3058:24;:::i;:::-;3047:35;;2992:96;;;:::o;3094:122::-;3167:24;3185:5;3167:24;:::i;:::-;3160:5;3157:35;3147:63;;3206:1;3203;3196:12;3147:63;3094:122;:::o;3222:139::-;3268:5;3306:6;3293:20;3284:29;;3322:33;3349:5;3322:33;:::i;:::-;3222:139;;;;:::o;3367:329::-;3426:6;3475:2;3463:9;3454:7;3450:23;3446:32;3443:119;;;3481:79;;:::i;:::-;3443:119;3601:1;3626:53;3671:7;3662:6;3651:9;3647:22;3626:53;:::i;:::-;3616:63;;3572:117;3367:329;;;;:::o;3702:89::-;3738:7;3778:6;3771:5;3767:18;3756:29;;3702:89;;;:::o;3797:115::-;3882:23;3899:5;3882:23;:::i;:::-;3877:3;3870:36;3797:115;;:::o;3918:218::-;4009:4;4047:2;4036:9;4032:18;4024:26;;4060:69;4126:1;4115:9;4111:17;4102:6;4060:69;:::i;:::-;3918:218;;;;:::o;4142:77::-;4179:7;4208:5;4197:16;;4142:77;;;:::o;4225:122::-;4298:24;4316:5;4298:24;:::i;:::-;4291:5;4288:35;4278:63;;4337:1;4334;4327:12;4278:63;4225:122;:::o;4353:139::-;4399:5;4437:6;4424:20;4415:29;;4453:33;4480:5;4453:33;:::i;:::-;4353:139;;;;:::o;4498:329::-;4557:6;4606:2;4594:9;4585:7;4581:23;4577:32;4574:119;;;4612:79;;:::i;:::-;4574:119;4732:1;4757:53;4802:7;4793:6;4782:9;4778:22;4757:53;:::i;:::-;4747:63;;4703:117;4498:329;;;;:::o;4833:118::-;4920:24;4938:5;4920:24;:::i;:::-;4915:3;4908:37;4833:118;;:::o;4957:222::-;5050:4;5088:2;5077:9;5073:18;5065:26;;5101:71;5169:1;5158:9;5154:17;5145:6;5101:71;:::i;:::-;4957:222;;;;:::o;5185:474::-;5253:6;5261;5310:2;5298:9;5289:7;5285:23;5281:32;5278:119;;;5316:79;;:::i;:::-;5278:119;5436:1;5461:53;5506:7;5497:6;5486:9;5482:22;5461:53;:::i;:::-;5451:63;;5407:117;5563:2;5589:53;5634:7;5625:6;5614:9;5610:22;5589:53;:::i;:::-;5579:63;;5534:118;5185:474;;;;;:::o;5665:120::-;5737:23;5754:5;5737:23;:::i;:::-;5730:5;5727:34;5717:62;;5775:1;5772;5765:12;5717:62;5665:120;:::o;5791:137::-;5836:5;5874:6;5861:20;5852:29;;5890:32;5916:5;5890:32;:::i;:::-;5791:137;;;;:::o;5934:327::-;5992:6;6041:2;6029:9;6020:7;6016:23;6012:32;6009:119;;;6047:79;;:::i;:::-;6009:119;6167:1;6192:52;6236:7;6227:6;6216:9;6212:22;6192:52;:::i;:::-;6182:62;;6138:116;5934:327;;;;:::o;6267:118::-;6354:24;6372:5;6354:24;:::i;:::-;6349:3;6342:37;6267:118;;:::o;6391:222::-;6484:4;6522:2;6511:9;6507:18;6499:26;;6535:71;6603:1;6592:9;6588:17;6579:6;6535:71;:::i;:::-;6391:222;;;;:::o;6619:619::-;6696:6;6704;6712;6761:2;6749:9;6740:7;6736:23;6732:32;6729:119;;;6767:79;;:::i;:::-;6729:119;6887:1;6912:53;6957:7;6948:6;6937:9;6933:22;6912:53;:::i;:::-;6902:63;;6858:117;7014:2;7040:53;7085:7;7076:6;7065:9;7061:22;7040:53;:::i;:::-;7030:63;;6985:118;7142:2;7168:53;7213:7;7204:6;7193:9;7189:22;7168:53;:::i;:::-;7158:63;;7113:118;6619:619;;;;;:::o;7244:86::-;7279:7;7319:4;7312:5;7308:16;7297:27;;7244:86;;;:::o;7336:118::-;7407:22;7423:5;7407:22;:::i;:::-;7400:5;7397:33;7387:61;;7444:1;7441;7434:12;7387:61;7336:118;:::o;7460:135::-;7504:5;7542:6;7529:20;7520:29;;7558:31;7583:5;7558:31;:::i;:::-;7460:135;;;;:::o;7601:325::-;7658:6;7707:2;7695:9;7686:7;7682:23;7678:32;7675:119;;;7713:79;;:::i;:::-;7675:119;7833:1;7858:51;7901:7;7892:6;7881:9;7877:22;7858:51;:::i;:::-;7848:61;;7804:115;7601:325;;;;:::o;7932:474::-;8000:6;8008;8057:2;8045:9;8036:7;8032:23;8028:32;8025:119;;;8063:79;;:::i;:::-;8025:119;8183:1;8208:53;8253:7;8244:6;8233:9;8229:22;8208:53;:::i;:::-;8198:63;;8154:117;8310:2;8336:53;8381:7;8372:6;8361:9;8357:22;8336:53;:::i;:::-;8326:63;;8281:118;7932:474;;;;;:::o;8412:332::-;8533:4;8571:2;8560:9;8556:18;8548:26;;8584:71;8652:1;8641:9;8637:17;8628:6;8584:71;:::i;:::-;8665:72;8733:2;8722:9;8718:18;8709:6;8665:72;:::i;:::-;8412:332;;;;;:::o;8750:114::-;8817:6;8851:5;8845:12;8835:22;;8750:114;;;:::o;8870:184::-;8969:11;9003:6;8998:3;8991:19;9043:4;9038:3;9034:14;9019:29;;8870:184;;;;:::o;9060:132::-;9127:4;9150:3;9142:11;;9180:4;9175:3;9171:14;9163:22;;9060:132;;;:::o;9198:108::-;9275:24;9293:5;9275:24;:::i;:::-;9270:3;9263:37;9198:108;;:::o;9312:179::-;9381:10;9402:46;9444:3;9436:6;9402:46;:::i;:::-;9480:4;9475:3;9471:14;9457:28;;9312:179;;;;:::o;9497:113::-;9567:4;9599;9594:3;9590:14;9582:22;;9497:113;;;:::o;9646:732::-;9765:3;9794:54;9842:5;9794:54;:::i;:::-;9864:86;9943:6;9938:3;9864:86;:::i;:::-;9857:93;;9974:56;10024:5;9974:56;:::i;:::-;10053:7;10084:1;10069:284;10094:6;10091:1;10088:13;10069:284;;;10170:6;10164:13;10197:63;10256:3;10241:13;10197:63;:::i;:::-;10190:70;;10283:60;10336:6;10283:60;:::i;:::-;10273:70;;10129:224;10116:1;10113;10109:9;10104:14;;10069:284;;;10073:14;10369:3;10362:10;;9770:608;;;9646:732;;;;:::o;10384:373::-;10527:4;10565:2;10554:9;10550:18;10542:26;;10614:9;10608:4;10604:20;10600:1;10589:9;10585:17;10578:47;10642:108;10745:4;10736:6;10642:108;:::i;:::-;10634:116;;10384:373;;;;:::o;10763:60::-;10791:3;10812:5;10805:12;;10763:60;;;:::o;10829:142::-;10879:9;10912:53;10930:34;10939:24;10957:5;10939:24;:::i;:::-;10930:34;:::i;:::-;10912:53;:::i;:::-;10899:66;;10829:142;;;:::o;10977:126::-;11027:9;11060:37;11091:5;11060:37;:::i;:::-;11047:50;;10977:126;;;:::o;11109:157::-;11190:9;11223:37;11254:5;11223:37;:::i;:::-;11210:50;;11109:157;;;:::o;11272:193::-;11390:68;11452:5;11390:68;:::i;:::-;11385:3;11378:81;11272:193;;:::o;11471:284::-;11595:4;11633:2;11622:9;11618:18;11610:26;;11646:102;11745:1;11734:9;11730:17;11721:6;11646:102;:::i;:::-;11471:284;;;;:::o;11761:117::-;11870:1;11867;11860:12;11884:117;11993:1;11990;11983:12;12007:180;12055:77;12052:1;12045:88;12152:4;12149:1;12142:15;12176:4;12173:1;12166:15;12193:281;12276:27;12298:4;12276:27;:::i;:::-;12268:6;12264:40;12406:6;12394:10;12391:22;12370:18;12358:10;12355:34;12352:62;12349:88;;;12417:18;;:::i;:::-;12349:88;12457:10;12453:2;12446:22;12236:238;12193:281;;:::o;12480:129::-;12514:6;12541:20;;:::i;:::-;12531:30;;12570:33;12598:4;12590:6;12570:33;:::i;:::-;12480:129;;;:::o;12615:308::-;12677:4;12767:18;12759:6;12756:30;12753:56;;;12789:18;;:::i;:::-;12753:56;12827:29;12849:6;12827:29;:::i;:::-;12819:37;;12911:4;12905;12901:15;12893:23;;12615:308;;;:::o;12929:146::-;13026:6;13021:3;13016;13003:30;13067:1;13058:6;13053:3;13049:16;13042:27;12929:146;;;:::o;13081:425::-;13159:5;13184:66;13200:49;13242:6;13200:49;:::i;:::-;13184:66;:::i;:::-;13175:75;;13273:6;13266:5;13259:21;13311:4;13304:5;13300:16;13349:3;13340:6;13335:3;13331:16;13328:25;13325:112;;;13356:79;;:::i;:::-;13325:112;13446:54;13493:6;13488:3;13483;13446:54;:::i;:::-;13165:341;13081:425;;;;;:::o;13526:340::-;13582:5;13631:3;13624:4;13616:6;13612:17;13608:27;13598:122;;13639:79;;:::i;:::-;13598:122;13756:6;13743:20;13781:79;13856:3;13848:6;13841:4;13833:6;13829:17;13781:79;:::i;:::-;13772:88;;13588:278;13526:340;;;;:::o;13872:509::-;13941:6;13990:2;13978:9;13969:7;13965:23;13961:32;13958:119;;;13996:79;;:::i;:::-;13958:119;14144:1;14133:9;14129:17;14116:31;14174:18;14166:6;14163:30;14160:117;;;14196:79;;:::i;:::-;14160:117;14301:63;14356:7;14347:6;14336:9;14332:22;14301:63;:::i;:::-;14291:73;;14087:287;13872:509;;;;:::o;14387:116::-;14457:21;14472:5;14457:21;:::i;:::-;14450:5;14447:32;14437:60;;14493:1;14490;14483:12;14437:60;14387:116;:::o;14509:133::-;14552:5;14590:6;14577:20;14568:29;;14606:30;14630:5;14606:30;:::i;:::-;14509:133;;;;:::o;14648:323::-;14704:6;14753:2;14741:9;14732:7;14728:23;14724:32;14721:119;;;14759:79;;:::i;:::-;14721:119;14879:1;14904:50;14946:7;14937:6;14926:9;14922:22;14904:50;:::i;:::-;14894:60;;14850:114;14648:323;;;;:::o;14977:117::-;15086:1;15083;15076:12;15223:77;15260:7;15289:5;15278:16;;15223:77;;;:::o;15306:122::-;15379:24;15397:5;15379:24;:::i;:::-;15372:5;15369:35;15359:63;;15418:1;15415;15408:12;15359:63;15306:122;:::o;15434:139::-;15480:5;15518:6;15505:20;15496:29;;15534:33;15561:5;15534:33;:::i;:::-;15434:139;;;;:::o;15608:723::-;15681:5;15725:4;15713:9;15708:3;15704:19;15700:30;15697:117;;;15733:79;;:::i;:::-;15697:117;15832:21;15848:4;15832:21;:::i;:::-;15823:30;;15909:1;15949:49;15994:3;15985:6;15974:9;15970:22;15949:49;:::i;:::-;15942:4;15935:5;15931:16;15924:75;15863:147;16066:2;16107:49;16152:3;16143:6;16132:9;16128:22;16107:49;:::i;:::-;16100:4;16093:5;16089:16;16082:75;16020:148;16224:2;16265:47;16308:3;16299:6;16288:9;16284:22;16265:47;:::i;:::-;16258:4;16251:5;16247:16;16240:73;16178:146;15608:723;;;;:::o;16337:519::-;16427:6;16435;16484:3;16472:9;16463:7;16459:23;16455:33;16452:120;;;16491:79;;:::i;:::-;16452:120;16611:1;16636:51;16679:7;16670:6;16659:9;16655:22;16636:51;:::i;:::-;16626:61;;16582:115;16736:2;16762:77;16831:7;16822:6;16811:9;16807:22;16762:77;:::i;:::-;16752:87;;16707:142;16337:519;;;;;:::o;16862:112::-;16945:22;16961:5;16945:22;:::i;:::-;16940:3;16933:35;16862:112;;:::o;16980:214::-;17069:4;17107:2;17096:9;17092:18;17084:26;;17120:67;17184:1;17173:9;17169:17;17160:6;17120:67;:::i;:::-;16980:214;;;;:::o;17200:472::-;17267:6;17275;17324:2;17312:9;17303:7;17299:23;17295:32;17292:119;;;17330:79;;:::i;:::-;17292:119;17450:1;17475:53;17520:7;17511:6;17500:9;17496:22;17475:53;:::i;:::-;17465:63;;17421:117;17577:2;17603:52;17647:7;17638:6;17627:9;17623:22;17603:52;:::i;:::-;17593:62;;17548:117;17200:472;;;;;:::o;17678:468::-;17743:6;17751;17800:2;17788:9;17779:7;17775:23;17771:32;17768:119;;;17806:79;;:::i;:::-;17768:119;17926:1;17951:53;17996:7;17987:6;17976:9;17972:22;17951:53;:::i;:::-;17941:63;;17897:117;18053:2;18079:50;18121:7;18112:6;18101:9;18097:22;18079:50;:::i;:::-;18069:60;;18024:115;17678:468;;;;;:::o;18152:307::-;18213:4;18303:18;18295:6;18292:30;18289:56;;;18325:18;;:::i;:::-;18289:56;18363:29;18385:6;18363:29;:::i;:::-;18355:37;;18447:4;18441;18437:15;18429:23;;18152:307;;;:::o;18465:423::-;18542:5;18567:65;18583:48;18624:6;18583:48;:::i;:::-;18567:65;:::i;:::-;18558:74;;18655:6;18648:5;18641:21;18693:4;18686:5;18682:16;18731:3;18722:6;18717:3;18713:16;18710:25;18707:112;;;18738:79;;:::i;:::-;18707:112;18828:54;18875:6;18870:3;18865;18828:54;:::i;:::-;18548:340;18465:423;;;;;:::o;18907:338::-;18962:5;19011:3;19004:4;18996:6;18992:17;18988:27;18978:122;;19019:79;;:::i;:::-;18978:122;19136:6;19123:20;19161:78;19235:3;19227:6;19220:4;19212:6;19208:17;19161:78;:::i;:::-;19152:87;;18968:277;18907:338;;;;:::o;19251:943::-;19346:6;19354;19362;19370;19419:3;19407:9;19398:7;19394:23;19390:33;19387:120;;;19426:79;;:::i;:::-;19387:120;19546:1;19571:53;19616:7;19607:6;19596:9;19592:22;19571:53;:::i;:::-;19561:63;;19517:117;19673:2;19699:53;19744:7;19735:6;19724:9;19720:22;19699:53;:::i;:::-;19689:63;;19644:118;19801:2;19827:53;19872:7;19863:6;19852:9;19848:22;19827:53;:::i;:::-;19817:63;;19772:118;19957:2;19946:9;19942:18;19929:32;19988:18;19980:6;19977:30;19974:117;;;20010:79;;:::i;:::-;19974:117;20115:62;20169:7;20160:6;20149:9;20145:22;20115:62;:::i;:::-;20105:72;;19900:287;19251:943;;;;;;;:::o;20200:474::-;20268:6;20276;20325:2;20313:9;20304:7;20300:23;20296:32;20293:119;;;20331:79;;:::i;:::-;20293:119;20451:1;20476:53;20521:7;20512:6;20501:9;20497:22;20476:53;:::i;:::-;20466:63;;20422:117;20578:2;20604:53;20649:7;20640:6;20629:9;20625:22;20604:53;:::i;:::-;20594:63;;20549:118;20200:474;;;;;:::o;20680:180::-;20728:77;20725:1;20718:88;20825:4;20822:1;20815:15;20849:4;20846:1;20839:15;20866:320;20910:6;20947:1;20941:4;20937:12;20927:22;;20994:1;20988:4;20984:12;21015:18;21005:81;;21071:4;21063:6;21059:17;21049:27;;21005:81;21133:2;21125:6;21122:14;21102:18;21099:38;21096:84;;21152:18;;:::i;:::-;21096:84;20917:269;20866:320;;;:::o;21192:180::-;21240:77;21237:1;21230:88;21337:4;21334:1;21327:15;21361:4;21358:1;21351:15;21378:180;21426:77;21423:1;21416:88;21523:4;21520:1;21513:15;21547:4;21544:1;21537:15;21564:171;21602:3;21625:23;21642:5;21625:23;:::i;:::-;21616:32;;21670:6;21663:5;21660:17;21657:43;;21680:18;;:::i;:::-;21657:43;21727:1;21720:5;21716:13;21709:20;;21564:171;;;:::o;21741:148::-;21843:11;21880:3;21865:18;;21741:148;;;;:::o;21895:390::-;22001:3;22029:39;22062:5;22029:39;:::i;:::-;22084:89;22166:6;22161:3;22084:89;:::i;:::-;22077:96;;22182:65;22240:6;22235:3;22228:4;22221:5;22217:16;22182:65;:::i;:::-;22272:6;22267:3;22263:16;22256:23;;22005:280;21895:390;;;;:::o;22291:151::-;22431:3;22427:1;22419:6;22415:14;22408:27;22291:151;:::o;22448:400::-;22608:3;22629:84;22711:1;22706:3;22629:84;:::i;:::-;22622:91;;22722:93;22811:3;22722:93;:::i;:::-;22840:1;22835:3;22831:11;22824:18;;22448:400;;;:::o;22854:4109::-;24327:3;24349:95;24440:3;24431:6;24349:95;:::i;:::-;24342:102;;24461:148;24605:3;24461:148;:::i;:::-;24454:155;;24626:95;24717:3;24708:6;24626:95;:::i;:::-;24619:102;;24738:148;24882:3;24738:148;:::i;:::-;24731:155;;24903:95;24994:3;24985:6;24903:95;:::i;:::-;24896:102;;25015:148;25159:3;25015:148;:::i;:::-;25008:155;;25180:95;25271:3;25262:6;25180:95;:::i;:::-;25173:102;;25292:148;25436:3;25292:148;:::i;:::-;25285:155;;25457:95;25548:3;25539:6;25457:95;:::i;:::-;25450:102;;25569:148;25713:3;25569:148;:::i;:::-;25562:155;;25734:95;25825:3;25816:6;25734:95;:::i;:::-;25727:102;;25846:148;25990:3;25846:148;:::i;:::-;25839:155;;26011:95;26102:3;26093:6;26011:95;:::i;:::-;26004:102;;26123:148;26267:3;26123:148;:::i;:::-;26116:155;;26288:95;26379:3;26370:6;26288:95;:::i;:::-;26281:102;;26400:148;26544:3;26400:148;:::i;:::-;26393:155;;26565:95;26656:3;26647:6;26565:95;:::i;:::-;26558:102;;26677:148;26821:3;26677:148;:::i;:::-;26670:155;;26842:95;26933:3;26924:6;26842:95;:::i;:::-;26835:102;;26954:3;26947:10;;22854:4109;;;;;;;;;;;;;:::o;26969:410::-;27009:7;27032:20;27050:1;27032:20;:::i;:::-;27027:25;;27066:20;27084:1;27066:20;:::i;:::-;27061:25;;27121:1;27118;27114:9;27143:30;27161:11;27143:30;:::i;:::-;27132:41;;27322:1;27313:7;27309:15;27306:1;27303:22;27283:1;27276:9;27256:83;27233:139;;27352:18;;:::i;:::-;27233:139;27017:362;26969:410;;;;:::o;27385:180::-;27433:77;27430:1;27423:88;27530:4;27527:1;27520:15;27554:4;27551:1;27544:15;27571:185;27611:1;27628:20;27646:1;27628:20;:::i;:::-;27623:25;;27662:20;27680:1;27662:20;:::i;:::-;27657:25;;27701:1;27691:35;;27706:18;;:::i;:::-;27691:35;27748:1;27745;27741:9;27736:14;;27571:185;;;;:::o;27762:141::-;27811:4;27834:3;27826:11;;27857:3;27854:1;27847:14;27891:4;27888:1;27878:18;27870:26;;27762:141;;;:::o;27909:93::-;27946:6;27993:2;27988;27981:5;27977:14;27973:23;27963:33;;27909:93;;;:::o;28008:107::-;28052:8;28102:5;28096:4;28092:16;28071:37;;28008:107;;;;:::o;28121:393::-;28190:6;28240:1;28228:10;28224:18;28263:97;28293:66;28282:9;28263:97;:::i;:::-;28381:39;28411:8;28400:9;28381:39;:::i;:::-;28369:51;;28453:4;28449:9;28442:5;28438:21;28429:30;;28502:4;28492:8;28488:19;28481:5;28478:30;28468:40;;28197:317;;28121:393;;;;;:::o;28520:142::-;28570:9;28603:53;28621:34;28630:24;28648:5;28630:24;:::i;:::-;28621:34;:::i;:::-;28603:53;:::i;:::-;28590:66;;28520:142;;;:::o;28668:75::-;28711:3;28732:5;28725:12;;28668:75;;;:::o;28749:269::-;28859:39;28890:7;28859:39;:::i;:::-;28920:91;28969:41;28993:16;28969:41;:::i;:::-;28961:6;28954:4;28948:11;28920:91;:::i;:::-;28914:4;28907:105;28825:193;28749:269;;;:::o;29024:73::-;29069:3;29024:73;:::o;29103:189::-;29180:32;;:::i;:::-;29221:65;29279:6;29271;29265:4;29221:65;:::i;:::-;29156:136;29103:189;;:::o;29298:186::-;29358:120;29375:3;29368:5;29365:14;29358:120;;;29429:39;29466:1;29459:5;29429:39;:::i;:::-;29402:1;29395:5;29391:13;29382:22;;29358:120;;;29298:186;;:::o;29490:543::-;29591:2;29586:3;29583:11;29580:446;;;29625:38;29657:5;29625:38;:::i;:::-;29709:29;29727:10;29709:29;:::i;:::-;29699:8;29695:44;29892:2;29880:10;29877:18;29874:49;;;29913:8;29898:23;;29874:49;29936:80;29992:22;30010:3;29992:22;:::i;:::-;29982:8;29978:37;29965:11;29936:80;:::i;:::-;29595:431;;29580:446;29490:543;;;:::o;30039:117::-;30093:8;30143:5;30137:4;30133:16;30112:37;;30039:117;;;;:::o;30162:169::-;30206:6;30239:51;30287:1;30283:6;30275:5;30272:1;30268:13;30239:51;:::i;:::-;30235:56;30320:4;30314;30310:15;30300:25;;30213:118;30162:169;;;;:::o;30336:295::-;30412:4;30558:29;30583:3;30577:4;30558:29;:::i;:::-;30550:37;;30620:3;30617:1;30613:11;30607:4;30604:21;30596:29;;30336:295;;;;:::o;30636:1395::-;30753:37;30786:3;30753:37;:::i;:::-;30855:18;30847:6;30844:30;30841:56;;;30877:18;;:::i;:::-;30841:56;30921:38;30953:4;30947:11;30921:38;:::i;:::-;31006:67;31066:6;31058;31052:4;31006:67;:::i;:::-;31100:1;31124:4;31111:17;;31156:2;31148:6;31145:14;31173:1;31168:618;;;;31830:1;31847:6;31844:77;;;31896:9;31891:3;31887:19;31881:26;31872:35;;31844:77;31947:67;32007:6;32000:5;31947:67;:::i;:::-;31941:4;31934:81;31803:222;31138:887;;31168:618;31220:4;31216:9;31208:6;31204:22;31254:37;31286:4;31254:37;:::i;:::-;31313:1;31327:208;31341:7;31338:1;31335:14;31327:208;;;31420:9;31415:3;31411:19;31405:26;31397:6;31390:42;31471:1;31463:6;31459:14;31449:24;;31518:2;31507:9;31503:18;31490:31;;31364:4;31361:1;31357:12;31352:17;;31327:208;;;31563:6;31554:7;31551:19;31548:179;;;31621:9;31616:3;31612:19;31606:26;31664:48;31706:4;31698:6;31694:17;31683:9;31664:48;:::i;:::-;31656:6;31649:64;31571:156;31548:179;31773:1;31769;31761:6;31757:14;31753:22;31747:4;31740:36;31175:611;;;31138:887;;30728:1303;;;30636:1395;;:::o;32037:174::-;32177:26;32173:1;32165:6;32161:14;32154:50;32037:174;:::o;32217:366::-;32359:3;32380:67;32444:2;32439:3;32380:67;:::i;:::-;32373:74;;32456:93;32545:3;32456:93;:::i;:::-;32574:2;32569:3;32565:12;32558:19;;32217:366;;;:::o;32589:419::-;32755:4;32793:2;32782:9;32778:18;32770:26;;32842:9;32836:4;32832:20;32828:1;32817:9;32813:17;32806:47;32870:131;32996:4;32870:131;:::i;:::-;32862:139;;32589:419;;;:::o;33014:156::-;33154:8;33150:1;33142:6;33138:14;33131:32;33014:156;:::o;33176:365::-;33318:3;33339:66;33403:1;33398:3;33339:66;:::i;:::-;33332:73;;33414:93;33503:3;33414:93;:::i;:::-;33532:2;33527:3;33523:12;33516:19;;33176:365;;;:::o;33547:419::-;33713:4;33751:2;33740:9;33736:18;33728:26;;33800:9;33794:4;33790:20;33786:1;33775:9;33771:17;33764:47;33828:131;33954:4;33828:131;:::i;:::-;33820:139;;33547:419;;;:::o;33972:196::-;34011:4;34031:19;34048:1;34031:19;:::i;:::-;34026:24;;34064:19;34081:1;34064:19;:::i;:::-;34059:24;;34107:1;34104;34100:9;34092:17;;34131:6;34125:4;34122:16;34119:42;;;34141:18;;:::i;:::-;34119:42;33972:196;;;;:::o;34174:194::-;34214:4;34234:20;34252:1;34234:20;:::i;:::-;34229:25;;34268:20;34286:1;34268:20;:::i;:::-;34263:25;;34312:1;34309;34305:9;34297:17;;34336:1;34330:4;34327:11;34324:37;;;34341:18;;:::i;:::-;34324:37;34174:194;;;;:::o;34374:191::-;34414:3;34433:20;34451:1;34433:20;:::i;:::-;34428:25;;34467:20;34485:1;34467:20;:::i;:::-;34462:25;;34510:1;34507;34503:9;34496:16;;34531:3;34528:1;34525:10;34522:36;;;34538:18;;:::i;:::-;34522:36;34374:191;;;;:::o;34571:159::-;34711:11;34707:1;34699:6;34695:14;34688:35;34571:159;:::o;34736:365::-;34878:3;34899:66;34963:1;34958:3;34899:66;:::i;:::-;34892:73;;34974:93;35063:3;34974:93;:::i;:::-;35092:2;35087:3;35083:12;35076:19;;34736:365;;;:::o;35107:419::-;35273:4;35311:2;35300:9;35296:18;35288:26;;35360:9;35354:4;35350:20;35346:1;35335:9;35331:17;35324:47;35388:131;35514:4;35388:131;:::i;:::-;35380:139;;35107:419;;;:::o;35532:157::-;35672:9;35668:1;35660:6;35656:14;35649:33;35532:157;:::o;35695:365::-;35837:3;35858:66;35922:1;35917:3;35858:66;:::i;:::-;35851:73;;35933:93;36022:3;35933:93;:::i;:::-;36051:2;36046:3;36042:12;36035:19;;35695:365;;;:::o;36066:419::-;36232:4;36270:2;36259:9;36255:18;36247:26;;36319:9;36313:4;36309:20;36305:1;36294:9;36290:17;36283:47;36347:131;36473:4;36347:131;:::i;:::-;36339:139;;36066:419;;;:::o;36491:159::-;36631:11;36627:1;36619:6;36615:14;36608:35;36491:159;:::o;36656:365::-;36798:3;36819:66;36883:1;36878:3;36819:66;:::i;:::-;36812:73;;36894:93;36983:3;36894:93;:::i;:::-;37012:2;37007:3;37003:12;36996:19;;36656:365;;;:::o;37027:419::-;37193:4;37231:2;37220:9;37216:18;37208:26;;37280:9;37274:4;37270:20;37266:1;37255:9;37251:17;37244:47;37308:131;37434:4;37308:131;:::i;:::-;37300:139;;37027:419;;;:::o;37452:158::-;37592:10;37588:1;37580:6;37576:14;37569:34;37452:158;:::o;37616:365::-;37758:3;37779:66;37843:1;37838:3;37779:66;:::i;:::-;37772:73;;37854:93;37943:3;37854:93;:::i;:::-;37972:2;37967:3;37963:12;37956:19;;37616:365;;;:::o;37987:419::-;38153:4;38191:2;38180:9;38176:18;38168:26;;38240:9;38234:4;38230:20;38226:1;38215:9;38211:17;38204:47;38268:131;38394:4;38268:131;:::i;:::-;38260:139;;37987:419;;;:::o;38412:193::-;38451:3;38470:19;38487:1;38470:19;:::i;:::-;38465:24;;38503:19;38520:1;38503:19;:::i;:::-;38498:24;;38545:1;38542;38538:9;38531:16;;38568:6;38563:3;38560:15;38557:41;;;38578:18;;:::i;:::-;38557:41;38412:193;;;;:::o;38611:162::-;38751:14;38747:1;38739:6;38735:14;38728:38;38611:162;:::o;38779:366::-;38921:3;38942:67;39006:2;39001:3;38942:67;:::i;:::-;38935:74;;39018:93;39107:3;39018:93;:::i;:::-;39136:2;39131:3;39127:12;39120:19;;38779:366;;;:::o;39151:419::-;39317:4;39355:2;39344:9;39340:18;39332:26;;39404:9;39398:4;39394:20;39390:1;39379:9;39375:17;39368:47;39432:131;39558:4;39432:131;:::i;:::-;39424:139;;39151:419;;;:::o;39576:159::-;39716:11;39712:1;39704:6;39700:14;39693:35;39576:159;:::o;39741:365::-;39883:3;39904:66;39968:1;39963:3;39904:66;:::i;:::-;39897:73;;39979:93;40068:3;39979:93;:::i;:::-;40097:2;40092:3;40088:12;40081:19;;39741:365;;;:::o;40112:419::-;40278:4;40316:2;40305:9;40301:18;40293:26;;40365:9;40359:4;40355:20;40351:1;40340:9;40336:17;40329:47;40393:131;40519:4;40393:131;:::i;:::-;40385:139;;40112:419;;;:::o;40537:159::-;40677:11;40673:1;40665:6;40661:14;40654:35;40537:159;:::o;40702:365::-;40844:3;40865:66;40929:1;40924:3;40865:66;:::i;:::-;40858:73;;40940:93;41029:3;40940:93;:::i;:::-;41058:2;41053:3;41049:12;41042:19;;40702:365;;;:::o;41073:419::-;41239:4;41277:2;41266:9;41262:18;41254:26;;41326:9;41320:4;41316:20;41312:1;41301:9;41297:17;41290:47;41354:131;41480:4;41354:131;:::i;:::-;41346:139;;41073:419;;;:::o;41498:228::-;41638:34;41634:1;41626:6;41622:14;41615:58;41707:11;41702:2;41694:6;41690:15;41683:36;41498:228;:::o;41732:366::-;41874:3;41895:67;41959:2;41954:3;41895:67;:::i;:::-;41888:74;;41971:93;42060:3;41971:93;:::i;:::-;42089:2;42084:3;42080:12;42073:19;;41732:366;;;:::o;42104:419::-;42270:4;42308:2;42297:9;42293:18;42285:26;;42357:9;42351:4;42347:20;42343:1;42332:9;42328:17;42321:47;42385:131;42511:4;42385:131;:::i;:::-;42377:139;;42104:419;;;:::o;42529:163::-;42669:15;42665:1;42657:6;42653:14;42646:39;42529:163;:::o;42698:366::-;42840:3;42861:67;42925:2;42920:3;42861:67;:::i;:::-;42854:74;;42937:93;43026:3;42937:93;:::i;:::-;43055:2;43050:3;43046:12;43039:19;;42698:366;;;:::o;43070:419::-;43236:4;43274:2;43263:9;43259:18;43251:26;;43323:9;43317:4;43313:20;43309:1;43298:9;43294:17;43287:47;43351:131;43477:4;43351:131;:::i;:::-;43343:139;;43070:419;;;:::o;43519:874::-;43622:3;43659:5;43653:12;43688:36;43714:9;43688:36;:::i;:::-;43740:89;43822:6;43817:3;43740:89;:::i;:::-;43733:96;;43860:1;43849:9;43845:17;43876:1;43871:166;;;;44051:1;44046:341;;;;43838:549;;43871:166;43955:4;43951:9;43940;43936:25;43931:3;43924:38;44017:6;44010:14;44003:22;43995:6;43991:35;43986:3;43982:45;43975:52;;43871:166;;44046:341;44113:38;44145:5;44113:38;:::i;:::-;44173:1;44187:154;44201:6;44198:1;44195:13;44187:154;;;44275:7;44269:14;44265:1;44260:3;44256:11;44249:35;44325:1;44316:7;44312:15;44301:26;;44223:4;44220:1;44216:12;44211:17;;44187:154;;;44370:6;44365:3;44361:16;44354:23;;44053:334;;43838:549;;43626:767;;43519:874;;;;:::o;44399:429::-;44576:3;44598:92;44686:3;44677:6;44598:92;:::i;:::-;44591:99;;44707:95;44798:3;44789:6;44707:95;:::i;:::-;44700:102;;44819:3;44812:10;;44399:429;;;;;:::o;44834:225::-;44974:34;44970:1;44962:6;44958:14;44951:58;45043:8;45038:2;45030:6;45026:15;45019:33;44834:225;:::o;45065:366::-;45207:3;45228:67;45292:2;45287:3;45228:67;:::i;:::-;45221:74;;45304:93;45393:3;45304:93;:::i;:::-;45422:2;45417:3;45413:12;45406:19;;45065:366;;;:::o;45437:419::-;45603:4;45641:2;45630:9;45626:18;45618:26;;45690:9;45684:4;45680:20;45676:1;45665:9;45661:17;45654:47;45718:131;45844:4;45718:131;:::i;:::-;45710:139;;45437:419;;;:::o;45862:332::-;45983:4;46021:2;46010:9;46006:18;45998:26;;46034:71;46102:1;46091:9;46087:17;46078:6;46034:71;:::i;:::-;46115:72;46183:2;46172:9;46168:18;46159:6;46115:72;:::i;:::-;45862:332;;;;;:::o;46200:137::-;46254:5;46285:6;46279:13;46270:22;;46301:30;46325:5;46301:30;:::i;:::-;46200:137;;;;:::o;46343:345::-;46410:6;46459:2;46447:9;46438:7;46434:23;46430:32;46427:119;;;46465:79;;:::i;:::-;46427:119;46585:1;46610:61;46663:7;46654:6;46643:9;46639:22;46610:61;:::i;:::-;46600:71;;46556:125;46343:345;;;;:::o;46694:220::-;46834:34;46830:1;46822:6;46818:14;46811:58;46903:3;46898:2;46890:6;46886:15;46879:28;46694:220;:::o;46920:366::-;47062:3;47083:67;47147:2;47142:3;47083:67;:::i;:::-;47076:74;;47159:93;47248:3;47159:93;:::i;:::-;47277:2;47272:3;47268:12;47261:19;;46920:366;;;:::o;47292:419::-;47458:4;47496:2;47485:9;47481:18;47473:26;;47545:9;47539:4;47535:20;47531:1;47520:9;47516:17;47509:47;47573:131;47699:4;47573:131;:::i;:::-;47565:139;;47292:419;;;:::o;47717:248::-;47857:34;47853:1;47845:6;47841:14;47834:58;47926:31;47921:2;47913:6;47909:15;47902:56;47717:248;:::o;47971:366::-;48113:3;48134:67;48198:2;48193:3;48134:67;:::i;:::-;48127:74;;48210:93;48299:3;48210:93;:::i;:::-;48328:2;48323:3;48319:12;48312:19;;47971:366;;;:::o;48343:419::-;48509:4;48547:2;48536:9;48532:18;48524:26;;48596:9;48590:4;48586:20;48582:1;48571:9;48567:17;48560:47;48624:131;48750:4;48624:131;:::i;:::-;48616:139;;48343:419;;;:::o;48768:182::-;48908:34;48904:1;48896:6;48892:14;48885:58;48768:182;:::o;48956:366::-;49098:3;49119:67;49183:2;49178:3;49119:67;:::i;:::-;49112:74;;49195:93;49284:3;49195:93;:::i;:::-;49313:2;49308:3;49304:12;49297:19;;48956:366;;;:::o;49328:419::-;49494:4;49532:2;49521:9;49517:18;49509:26;;49581:9;49575:4;49571:20;49567:1;49556:9;49552:17;49545:47;49609:131;49735:4;49609:131;:::i;:::-;49601:139;;49328:419;;;:::o;49753:232::-;49893:34;49889:1;49881:6;49877:14;49870:58;49962:15;49957:2;49949:6;49945:15;49938:40;49753:232;:::o;49991:366::-;50133:3;50154:67;50218:2;50213:3;50154:67;:::i;:::-;50147:74;;50230:93;50319:3;50230:93;:::i;:::-;50348:2;50343:3;50339:12;50332:19;;49991:366;;;:::o;50363:419::-;50529:4;50567:2;50556:9;50552:18;50544:26;;50616:9;50610:4;50606:20;50602:1;50591:9;50587:17;50580:47;50644:131;50770:4;50644:131;:::i;:::-;50636:139;;50363:419;;;:::o;50788:94::-;50821:8;50869:5;50865:2;50861:14;50840:35;;50788:94;;;:::o;50888:::-;50927:7;50956:20;50970:5;50956:20;:::i;:::-;50945:31;;50888:94;;;:::o;50988:100::-;51027:7;51056:26;51076:5;51056:26;:::i;:::-;51045:37;;50988:100;;;:::o;51094:157::-;51199:45;51219:24;51237:5;51219:24;:::i;:::-;51199:45;:::i;:::-;51194:3;51187:58;51094:157;;:::o;51257:256::-;51369:3;51384:75;51455:3;51446:6;51384:75;:::i;:::-;51484:2;51479:3;51475:12;51468:19;;51504:3;51497:10;;51257:256;;;;:::o;51519:214::-;51659:66;51655:1;51647:6;51643:14;51636:90;51519:214;:::o;51739:402::-;51899:3;51920:85;52002:2;51997:3;51920:85;:::i;:::-;51913:92;;52014:93;52103:3;52014:93;:::i;:::-;52132:2;52127:3;52123:12;52116:19;;51739:402;;;:::o;52147:79::-;52186:7;52215:5;52204:16;;52147:79;;;:::o;52232:157::-;52337:45;52357:24;52375:5;52357:24;:::i;:::-;52337:45;:::i;:::-;52332:3;52325:58;52232:157;;:::o;52395:522::-;52608:3;52630:148;52774:3;52630:148;:::i;:::-;52623:155;;52788:75;52859:3;52850:6;52788:75;:::i;:::-;52888:2;52883:3;52879:12;52872:19;;52908:3;52901:10;;52395:522;;;;:::o;52923:118::-;53010:24;53028:5;53010:24;:::i;:::-;53005:3;52998:37;52923:118;;:::o;53047:545::-;53220:4;53258:3;53247:9;53243:19;53235:27;;53272:71;53340:1;53329:9;53325:17;53316:6;53272:71;:::i;:::-;53353:68;53417:2;53406:9;53402:18;53393:6;53353:68;:::i;:::-;53431:72;53499:2;53488:9;53484:18;53475:6;53431:72;:::i;:::-;53513;53581:2;53570:9;53566:18;53557:6;53513:72;:::i;:::-;53047:545;;;;;;;:::o;53598:161::-;53738:13;53734:1;53726:6;53722:14;53715:37;53598:161;:::o;53765:366::-;53907:3;53928:67;53992:2;53987:3;53928:67;:::i;:::-;53921:74;;54004:93;54093:3;54004:93;:::i;:::-;54122:2;54117:3;54113:12;54106:19;;53765:366;;;:::o;54137:419::-;54303:4;54341:2;54330:9;54326:18;54318:26;;54390:9;54384:4;54380:20;54376:1;54365:9;54361:17;54354:47;54418:131;54544:4;54418:131;:::i;:::-;54410:139;;54137:419;;;:::o;54562:237::-;54702:34;54698:1;54690:6;54686:14;54679:58;54771:20;54766:2;54758:6;54754:15;54747:45;54562:237;:::o;54805:366::-;54947:3;54968:67;55032:2;55027:3;54968:67;:::i;:::-;54961:74;;55044:93;55133:3;55044:93;:::i;:::-;55162:2;55157:3;55153:12;55146:19;;54805:366;;;:::o;55177:419::-;55343:4;55381:2;55370:9;55366:18;55358:26;;55430:9;55424:4;55420:20;55416:1;55405:9;55401:17;55394:47;55458:131;55584:4;55458:131;:::i;:::-;55450:139;;55177:419;;;:::o;55602:175::-;55742:27;55738:1;55730:6;55726:14;55719:51;55602:175;:::o;55783:366::-;55925:3;55946:67;56010:2;56005:3;55946:67;:::i;:::-;55939:74;;56022:93;56111:3;56022:93;:::i;:::-;56140:2;56135:3;56131:12;56124:19;;55783:366;;;:::o;56155:419::-;56321:4;56359:2;56348:9;56344:18;56336:26;;56408:9;56402:4;56398:20;56394:1;56383:9;56379:17;56372:47;56436:131;56562:4;56436:131;:::i;:::-;56428:139;;56155:419;;;:::o;56580:224::-;56720:34;56716:1;56708:6;56704:14;56697:58;56789:7;56784:2;56776:6;56772:15;56765:32;56580:224;:::o;56810:366::-;56952:3;56973:67;57037:2;57032:3;56973:67;:::i;:::-;56966:74;;57049:93;57138:3;57049:93;:::i;:::-;57167:2;57162:3;57158:12;57151:19;;56810:366;;;:::o;57182:419::-;57348:4;57386:2;57375:9;57371:18;57363:26;;57435:9;57429:4;57425:20;57421:1;57410:9;57406:17;57399:47;57463:131;57589:4;57463:131;:::i;:::-;57455:139;;57182:419;;;:::o;57607:223::-;57747:34;57743:1;57735:6;57731:14;57724:58;57816:6;57811:2;57803:6;57799:15;57792:31;57607:223;:::o;57836:366::-;57978:3;57999:67;58063:2;58058:3;57999:67;:::i;:::-;57992:74;;58075:93;58164:3;58075:93;:::i;:::-;58193:2;58188:3;58184:12;58177:19;;57836:366;;;:::o;58208:419::-;58374:4;58412:2;58401:9;58397:18;58389:26;;58461:9;58455:4;58451:20;58447:1;58436:9;58432:17;58425:47;58489:131;58615:4;58489:131;:::i;:::-;58481:139;;58208:419;;;:::o;58633:182::-;58773:34;58769:1;58761:6;58757:14;58750:58;58633:182;:::o;58821:366::-;58963:3;58984:67;59048:2;59043:3;58984:67;:::i;:::-;58977:74;;59060:93;59149:3;59060:93;:::i;:::-;59178:2;59173:3;59169:12;59162:19;;58821:366;;;:::o;59193:419::-;59359:4;59397:2;59386:9;59382:18;59374:26;;59446:9;59440:4;59436:20;59432:1;59421:9;59417:17;59410:47;59474:131;59600:4;59474:131;:::i;:::-;59466:139;;59193:419;;;:::o;59618:178::-;59758:30;59754:1;59746:6;59742:14;59735:54;59618:178;:::o;59802:366::-;59944:3;59965:67;60029:2;60024:3;59965:67;:::i;:::-;59958:74;;60041:93;60130:3;60041:93;:::i;:::-;60159:2;60154:3;60150:12;60143:19;;59802:366;;;:::o;60174:419::-;60340:4;60378:2;60367:9;60363:18;60355:26;;60427:9;60421:4;60417:20;60413:1;60402:9;60398:17;60391:47;60455:131;60581:4;60455:131;:::i;:::-;60447:139;;60174:419;;;:::o;60599:98::-;60650:6;60684:5;60678:12;60668:22;;60599:98;;;:::o;60703:168::-;60786:11;60820:6;60815:3;60808:19;60860:4;60855:3;60851:14;60836:29;;60703:168;;;;:::o;60877:373::-;60963:3;60991:38;61023:5;60991:38;:::i;:::-;61045:70;61108:6;61103:3;61045:70;:::i;:::-;61038:77;;61124:65;61182:6;61177:3;61170:4;61163:5;61159:16;61124:65;:::i;:::-;61214:29;61236:6;61214:29;:::i;:::-;61209:3;61205:39;61198:46;;60967:283;60877:373;;;;:::o;61256:640::-;61451:4;61489:3;61478:9;61474:19;61466:27;;61503:71;61571:1;61560:9;61556:17;61547:6;61503:71;:::i;:::-;61584:72;61652:2;61641:9;61637:18;61628:6;61584:72;:::i;:::-;61666;61734:2;61723:9;61719:18;61710:6;61666:72;:::i;:::-;61785:9;61779:4;61775:20;61770:2;61759:9;61755:18;61748:48;61813:76;61884:4;61875:6;61813:76;:::i;:::-;61805:84;;61256:640;;;;;;;:::o;61902:141::-;61958:5;61989:6;61983:13;61974:22;;62005:32;62031:5;62005:32;:::i;:::-;61902:141;;;;:::o;62049:349::-;62118:6;62167:2;62155:9;62146:7;62142:23;62138:32;62135:119;;;62173:79;;:::i;:::-;62135:119;62293:1;62318:63;62373:7;62364:6;62353:9;62349:22;62318:63;:::i;:::-;62308:73;;62264:127;62049:349;;;;:::o
Swarm Source
ipfs://8a82b1b0d63df45dc9598f69875896f0eb8b0e212ddd94b7b56779e6b5e5bcb1
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.