Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 15 from a total of 15 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set Approval For... | 16810526 | 683 days ago | IN | 0 ETH | 0.00092736 | ||||
Withdraw | 16514305 | 725 days ago | IN | 0 ETH | 0.00075197 | ||||
Set Approval For... | 16514195 | 725 days ago | IN | 0 ETH | 0.00099512 | ||||
Set Approval For... | 16514139 | 725 days ago | IN | 0 ETH | 0.00096464 | ||||
Public Mint | 16514124 | 725 days ago | IN | 0.008 ETH | 0.00305224 | ||||
Set Approval For... | 16514037 | 725 days ago | IN | 0 ETH | 0.00086031 | ||||
Public Mint | 16514027 | 725 days ago | IN | 0.008 ETH | 0.00286413 | ||||
Set Approval For... | 16513986 | 725 days ago | IN | 0 ETH | 0.0009644 | ||||
Public Mint | 16513961 | 725 days ago | IN | 0.008 ETH | 0.00282517 | ||||
Withdraw | 16513631 | 725 days ago | IN | 0 ETH | 0.00061513 | ||||
Set Approval For... | 16507260 | 726 days ago | IN | 0 ETH | 0.00070859 | ||||
Public Mint | 16505332 | 726 days ago | IN | 0.008 ETH | 0.00226285 | ||||
Public Mint | 16505159 | 726 days ago | IN | 0.008 ETH | 0.00227233 | ||||
Revealandset Bas... | 16504721 | 726 days ago | IN | 0 ETH | 0.00153161 | ||||
Edit Mint Window... | 16504721 | 726 days ago | IN | 0 ETH | 0.00062263 |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
PUFFYSOULS
Compiler Version
v0.8.9+commit.e5eed63a
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-01-28 */ // SPDX-License-Identifier: MIT // 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/security/Pausable.sol // OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { _requireNotPaused(); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { _requirePaused(); _; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { require(!paused(), "Pausable: paused"); } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { require(paused(), "Pausable: not paused"); } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721 * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must * understand this adds an external call which potentially creates a reentrancy vulnerability. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: address zero is not a valid owner"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _ownerOf(tokenId); require(owner != address(0), "ERC721: invalid token ID"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { _requireMinted(tokenId); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not token owner or approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { _requireMinted(tokenId); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved"); _safeTransfer(from, to, tokenId, data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist */ function _ownerOf(uint256 tokenId) internal view virtual returns (address) { return _owners[tokenId]; } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _ownerOf(tokenId) != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { address owner = ERC721.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId, 1); // Check that tokenId was not minted by `_beforeTokenTransfer` hook require(!_exists(tokenId), "ERC721: token already minted"); unchecked { // Will not overflow unless all 2**256 token ids are minted to the same owner. // Given that tokens are minted one by one, it is impossible in practice that // this ever happens. Might change if we allow batch minting. // The ERC fails to describe this case. _balances[to] += 1; } _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId, 1); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * This is an internal function that does not check if the sender is authorized to operate on the token. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId, 1); // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook owner = ERC721.ownerOf(tokenId); // Clear approvals delete _tokenApprovals[tokenId]; unchecked { // Cannot overflow, as that would require more tokens to be burned/transferred // out than the owner initially received through minting and transferring in. _balances[owner] -= 1; } delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId, 1); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId, 1); // Check that tokenId was not transferred by `_beforeTokenTransfer` hook require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); // Clear approvals from the previous owner delete _tokenApprovals[tokenId]; unchecked { // `_balances[from]` cannot overflow for the same reason as described in `_burn`: // `from`'s balance is the number of token held, which is at least one before the current // transfer. // `_balances[to]` could overflow in the conditions described in `_mint`. That would require // all 2**256 token ids to be minted, which in practice is impossible. _balances[from] -= 1; _balances[to] += 1; } _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId, 1); } /** * @dev Approve `to` to operate on `tokenId` * * Emits an {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits an {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Reverts if the `tokenId` has not been minted yet. */ function _requireMinted(uint256 tokenId) internal view virtual { require(_exists(tokenId), "ERC721: invalid token ID"); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { /// @solidity memory-safe-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting and burning. If {ERC721Consecutive} is * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`. * - When `from` is zero, the tokens will be minted for `to`. * - When `to` is zero, ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * - `batchSize` is non-zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256, /* firstTokenId */ uint256 batchSize ) internal virtual { if (batchSize > 1) { if (from != address(0)) { _balances[from] -= batchSize; } if (to != address(0)) { _balances[to] += batchSize; } } } /** * @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`. * - When `from` is zero, the tokens were minted for `to`. * - When `to` is zero, ``from``'s tokens were burned. * - `from` and `to` are never both zero. * - `batchSize` is non-zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 firstTokenId, uint256 batchSize ) internal virtual {} } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/extensions/ERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev See {ERC721-_beforeTokenTransfer}. */ function _beforeTokenTransfer( address from, address to, uint256 firstTokenId, uint256 batchSize ) internal virtual override { super._beforeTokenTransfer(from, to, firstTokenId, batchSize); if (batchSize > 1) { // Will only trigger during construction. Batch transferring (minting) is not available afterwards. revert("ERC721Enumerable: consecutive transfers not supported"); } uint256 tokenId = firstTokenId; if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } // File: contracts/Puffy Souls.sol pragma solidity ^0.8.9; contract PUFFYSOULS is ERC721, ERC721Enumerable, Pausable, Ownable { using Counters for Counters.Counter; uint256 maxSupply = 8888; uint256 public Mintprice_inWEI = 0.008 ether; bool public publicMintOpen = false; bool public allowListMintOpen = false; mapping(address => bool) public allowList; Counters.Counter private _tokenIdCounter; string public baseURI; constructor() ERC721("PUFFY SOULS", "PYS") { _tokenIdCounter.increment(); } function _baseURI() internal view override returns (string memory) { return baseURI; } function pause() public onlyOwner { _pause(); } function unpause() public onlyOwner { _unpause(); } function editMintWindows( bool _publicMintOpen, bool _allowListMintOpen ) external onlyOwner { publicMintOpen = _publicMintOpen; allowListMintOpen = _allowListMintOpen; } function allowListMint () public payable { require(allowListMintOpen, "chosen ones minting is closed"); require(allowList[msg.sender], "you are not the chosen ones"); require(msg.value == 0.008 ether, "Add some more ETH, insufficient funds"); require(totalSupply() < maxSupply, "unfortunately great sale is end" ); internalMint(); } function publicMint() public payable { require(publicMintOpen, "Better luck next time sale is closed"); require(msg.value == 0.008 ether, "Add some more ETH, insufficient funds"); require(totalSupply() < maxSupply, "unfortunately great sale is end" ); internalMint(); } function internalMint() internal { require(totalSupply() < maxSupply, "COLLECTION SOLD OUT"); uint256 tokenId = _tokenIdCounter.current(); _tokenIdCounter.increment(); _safeMint(msg.sender, tokenId); } function withdraw(address _addr) external onlyOwner { uint256 balance = address(this).balance; payable(_addr).transfer(balance); } function setAllowList(address [] calldata addresses ) external onlyOwner { for(uint256 i = 0; i < addresses.length; i++){ allowList[addresses[i]] = true; } } function _beforeTokenTransfer(address from, address to, uint256 tokenId, uint256 batchSize) internal whenNotPaused override(ERC721, ERC721Enumerable) { super._beforeTokenTransfer(from, to, tokenId, batchSize); } // The following functions are overrides required by Solidity. function supportsInterface(bytes4 interfaceId) public view override(ERC721, ERC721Enumerable) returns (bool) { return super.supportsInterface(interfaceId); } function revealandsetBaseURI(string memory baseURI_) external onlyOwner{ baseURI = baseURI_; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"Mintprice_inWEI","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"allowList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allowListMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"allowListMintOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_publicMintOpen","type":"bool"},{"internalType":"bool","name":"_allowListMintOpen","type":"bool"}],"name":"editMintWindows","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"publicMintOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"revealandsetBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"setAllowList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526122b8600b55661c6bf526340000600c556000600d60006101000a81548160ff0219169083151502179055506000600d60016101000a81548160ff0219169083151502179055503480156200005857600080fd5b506040518060400160405280600b81526020017f505546465920534f554c530000000000000000000000000000000000000000008152506040518060400160405280600381526020017f50595300000000000000000000000000000000000000000000000000000000008152508160009080519060200190620000dd92919062000235565b508060019080519060200190620000f692919062000235565b5050506000600a60006101000a81548160ff02191690831515021790555062000134620001286200015160201b60201c565b6200015960201b60201c565b6200014b600f6200021f60201b6200141c1760201c565b6200034a565b600033905090565b6000600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6001816000016000828254019250508190555050565b828054620002439062000314565b90600052602060002090601f016020900481019282620002675760008555620002b3565b82601f106200028257805160ff1916838001178555620002b3565b82800160010185558215620002b3579182015b82811115620002b257825182559160200191906001019062000295565b5b509050620002c29190620002c6565b5090565b5b80821115620002e1576000816000905550600101620002c7565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200032d57607f821691505b60208210811415620003445762000343620002e5565b5b50919050565b614463806200035a6000396000f3fe6080604052600436106101ee5760003560e01c80635c975abb1161010d5780638f7bcb08116100a0578063b88d4fde1161006f578063b88d4fde14610697578063bcc9ca5b146106c0578063c87b56dd146106eb578063e985e9c514610728578063f2fde38b14610765576101ee565b80638f7bcb08146105ef57806395d89b41146106185780639ebabd6214610643578063a22cb4651461066e576101ee565b806370a08231116100dc57806370a0823114610559578063715018a6146105965780638456cb59146105ad5780638da5cb5b146105c4576101ee565b80635c975abb1461049d5780636352211e146104c85780636447c35d146105055780636c0360eb1461052e576101ee565b806326092b83116101855780633f4ba83a116101545780633f4ba83a146103f757806342842e0e1461040e5780634f6ccce71461043757806351cff8d914610474576101ee565b806326092b831461034a5780632848aeaf146103545780632f48de79146103915780632f745c59146103ba576101ee565b8063095ea7b3116101c1578063095ea7b3146102c3578063102a6a73146102ec57806318160ddd146102f657806323b872dd14610321576101ee565b806301ffc9a7146101f357806306fdde0314610230578063081812fc1461025b578063085c9bac14610298575b600080fd5b3480156101ff57600080fd5b5061021a60048036038101906102159190612dbe565b61078e565b6040516102279190612e06565b60405180910390f35b34801561023c57600080fd5b506102456107a0565b6040516102529190612eba565b60405180910390f35b34801561026757600080fd5b50610282600480360381019061027d9190612f12565b610832565b60405161028f9190612f80565b60405180910390f35b3480156102a457600080fd5b506102ad610878565b6040516102ba9190612e06565b60405180910390f35b3480156102cf57600080fd5b506102ea60048036038101906102e59190612fc7565b61088b565b005b6102f46109a3565b005b34801561030257600080fd5b5061030b610b1c565b6040516103189190613016565b60405180910390f35b34801561032d57600080fd5b5061034860048036038101906103439190613031565b610b29565b005b610352610b89565b005b34801561036057600080fd5b5061037b60048036038101906103769190613084565b610c76565b6040516103889190612e06565b60405180910390f35b34801561039d57600080fd5b506103b860048036038101906103b391906130dd565b610c96565b005b3480156103c657600080fd5b506103e160048036038101906103dc9190612fc7565b610cd6565b6040516103ee9190613016565b60405180910390f35b34801561040357600080fd5b5061040c610d7b565b005b34801561041a57600080fd5b5061043560048036038101906104309190613031565b610d8d565b005b34801561044357600080fd5b5061045e60048036038101906104599190612f12565b610dad565b60405161046b9190613016565b60405180910390f35b34801561048057600080fd5b5061049b60048036038101906104969190613084565b610e1e565b005b3480156104a957600080fd5b506104b2610e76565b6040516104bf9190612e06565b60405180910390f35b3480156104d457600080fd5b506104ef60048036038101906104ea9190612f12565b610e8d565b6040516104fc9190612f80565b60405180910390f35b34801561051157600080fd5b5061052c60048036038101906105279190613182565b610f14565b005b34801561053a57600080fd5b50610543610fc1565b6040516105509190612eba565b60405180910390f35b34801561056557600080fd5b50610580600480360381019061057b9190613084565b61104f565b60405161058d9190613016565b60405180910390f35b3480156105a257600080fd5b506105ab611107565b005b3480156105b957600080fd5b506105c261111b565b005b3480156105d057600080fd5b506105d961112d565b6040516105e69190612f80565b60405180910390f35b3480156105fb57600080fd5b50610616600480360381019061061191906132ff565b611157565b005b34801561062457600080fd5b5061062d611179565b60405161063a9190612eba565b60405180910390f35b34801561064f57600080fd5b5061065861120b565b6040516106659190613016565b60405180910390f35b34801561067a57600080fd5b5061069560048036038101906106909190613348565b611211565b005b3480156106a357600080fd5b506106be60048036038101906106b99190613429565b611227565b005b3480156106cc57600080fd5b506106d5611289565b6040516106e29190612e06565b60405180910390f35b3480156106f757600080fd5b50610712600480360381019061070d9190612f12565b61129c565b60405161071f9190612eba565b60405180910390f35b34801561073457600080fd5b5061074f600480360381019061074a91906134ac565b611304565b60405161075c9190612e06565b60405180910390f35b34801561077157600080fd5b5061078c60048036038101906107879190613084565b611398565b005b600061079982611432565b9050919050565b6060600080546107af9061351b565b80601f01602080910402602001604051908101604052809291908181526020018280546107db9061351b565b80156108285780601f106107fd57610100808354040283529160200191610828565b820191906000526020600020905b81548152906001019060200180831161080b57829003601f168201915b5050505050905090565b600061083d826114ac565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600d60019054906101000a900460ff1681565b600061089682610e8d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610907576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108fe906135bf565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109266114f7565b73ffffffffffffffffffffffffffffffffffffffff16148061095557506109548161094f6114f7565b611304565b5b610994576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098b90613651565b60405180910390fd5b61099e83836114ff565b505050565b600d60019054906101000a900460ff166109f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e9906136bd565b60405180910390fd5b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610a7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7590613729565b60405180910390fd5b661c6bf5263400003414610ac7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610abe906137bb565b60405180910390fd5b600b54610ad2610b1c565b10610b12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0990613827565b60405180910390fd5b610b1a6115b8565b565b6000600880549050905090565b610b3a610b346114f7565b82611628565b610b79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b70906138b9565b60405180910390fd5b610b848383836116bd565b505050565b600d60009054906101000a900460ff16610bd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bcf9061394b565b60405180910390fd5b661c6bf5263400003414610c21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c18906137bb565b60405180910390fd5b600b54610c2c610b1c565b10610c6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6390613827565b60405180910390fd5b610c746115b8565b565b600e6020528060005260406000206000915054906101000a900460ff1681565b610c9e6119b7565b81600d60006101000a81548160ff02191690831515021790555080600d60016101000a81548160ff0219169083151502179055505050565b6000610ce18361104f565b8210610d22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d19906139dd565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610d836119b7565b610d8b611a35565b565b610da883838360405180602001604052806000815250611227565b505050565b6000610db7610b1c565b8210610df8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610def90613a6f565b60405180910390fd5b60088281548110610e0c57610e0b613a8f565b5b90600052602060002001549050919050565b610e266119b7565b60004790508173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610e71573d6000803e3d6000fd5b505050565b6000600a60009054906101000a900460ff16905090565b600080610e9983611a98565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610f0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0290613b0a565b60405180910390fd5b80915050919050565b610f1c6119b7565b60005b82829050811015610fbc576001600e6000858585818110610f4357610f42613a8f565b5b9050602002016020810190610f589190613084565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080610fb490613b59565b915050610f1f565b505050565b60108054610fce9061351b565b80601f0160208091040260200160405190810160405280929190818152602001828054610ffa9061351b565b80156110475780601f1061101c57610100808354040283529160200191611047565b820191906000526020600020905b81548152906001019060200180831161102a57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156110c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b790613c14565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61110f6119b7565b6111196000611ad5565b565b6111236119b7565b61112b611b9b565b565b6000600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61115f6119b7565b8060109080519060200190611175929190612caf565b5050565b6060600180546111889061351b565b80601f01602080910402602001604051908101604052809291908181526020018280546111b49061351b565b80156112015780601f106111d657610100808354040283529160200191611201565b820191906000526020600020905b8154815290600101906020018083116111e457829003601f168201915b5050505050905090565b600c5481565b61122361121c6114f7565b8383611bfe565b5050565b6112386112326114f7565b83611628565b611277576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126e906138b9565b60405180910390fd5b61128384848484611d6b565b50505050565b600d60009054906101000a900460ff1681565b60606112a7826114ac565b60006112b1611dc7565b905060008151116112d157604051806020016040528060008152506112fc565b806112db84611e59565b6040516020016112ec929190613c70565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6113a06119b7565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611410576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140790613d06565b60405180910390fd5b61141981611ad5565b50565b6001816000016000828254019250508190555050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806114a557506114a482611f31565b5b9050919050565b6114b581612013565b6114f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114eb90613b0a565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661157283610e8d565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600b546115c3610b1c565b10611603576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115fa90613d72565b60405180910390fd5b600061160f600f612054565b905061161b600f61141c565b6116253382612062565b50565b60008061163483610e8d565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061167657506116758185611304565b5b806116b457508373ffffffffffffffffffffffffffffffffffffffff1661169c84610832565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166116dd82610e8d565b73ffffffffffffffffffffffffffffffffffffffff1614611733576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172a90613e04565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156117a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179a90613e96565b60405180910390fd5b6117b08383836001612080565b8273ffffffffffffffffffffffffffffffffffffffff166117d082610e8d565b73ffffffffffffffffffffffffffffffffffffffff1614611826576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181d90613e04565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46119b2838383600161209a565b505050565b6119bf6114f7565b73ffffffffffffffffffffffffffffffffffffffff166119dd61112d565b73ffffffffffffffffffffffffffffffffffffffff1614611a33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2a90613f02565b60405180910390fd5b565b611a3d6120a0565b6000600a60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611a816114f7565b604051611a8e9190612f80565b60405180910390a1565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611ba36120e9565b6001600a60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611be76114f7565b604051611bf49190612f80565b60405180910390a1565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611c6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6490613f6e565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611d5e9190612e06565b60405180910390a3505050565b611d768484846116bd565b611d8284848484612133565b611dc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db890614000565b60405180910390fd5b50505050565b606060108054611dd69061351b565b80601f0160208091040260200160405190810160405280929190818152602001828054611e029061351b565b8015611e4f5780601f10611e2457610100808354040283529160200191611e4f565b820191906000526020600020905b815481529060010190602001808311611e3257829003601f168201915b5050505050905090565b606060006001611e68846122ca565b01905060008167ffffffffffffffff811115611e8757611e866131d4565b5b6040519080825280601f01601f191660200182016040528015611eb95781602001600182028036833780820191505090505b509050600082602001820190505b600115611f26578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581611f1057611f0f614020565b5b0494506000851415611f2157611f26565b611ec7565b819350505050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611ffc57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061200c575061200b8261241d565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff1661203583611a98565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600081600001549050919050565b61207c828260405180602001604052806000815250612487565b5050565b6120886120e9565b612094848484846124e2565b50505050565b50505050565b6120a8610e76565b6120e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120de9061409b565b60405180910390fd5b565b6120f1610e76565b15612131576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161212890614107565b60405180910390fd5b565b60006121548473ffffffffffffffffffffffffffffffffffffffff16612642565b156122bd578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261217d6114f7565b8786866040518563ffffffff1660e01b815260040161219f949392919061417c565b602060405180830381600087803b1580156121b957600080fd5b505af19250505080156121ea57506040513d601f19601f820116820180604052508101906121e791906141dd565b60015b61226d573d806000811461221a576040519150601f19603f3d011682016040523d82523d6000602084013e61221f565b606091505b50600081511415612265576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225c90614000565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506122c2565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612328577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000838161231e5761231d614020565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612365576d04ee2d6d415b85acef8100000000838161235b5761235a614020565b5b0492506020810190505b662386f26fc10000831061239457662386f26fc10000838161238a57612389614020565b5b0492506010810190505b6305f5e10083106123bd576305f5e10083816123b3576123b2614020565b5b0492506008810190505b61271083106123e25761271083816123d8576123d7614020565b5b0492506004810190505b6064831061240557606483816123fb576123fa614020565b5b0492506002810190505b600a8310612414576001810190505b80915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6124918383612665565b61249e6000848484612133565b6124dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124d490614000565b60405180910390fd5b505050565b6124ee84848484612883565b6001811115612532576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125299061427c565b60405180910390fd5b6000829050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141561257a57612575816129a9565b6125b9565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16146125b8576125b785826129f2565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156125fc576125f781612b5f565b61263b565b8473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161461263a576126398482612c30565b5b5b5050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156126d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126cc906142e8565b60405180910390fd5b6126de81612013565b1561271e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161271590614354565b60405180910390fd5b61272c600083836001612080565b61273581612013565b15612775576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161276c90614354565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461287f60008383600161209a565b5050565b60018111156129a357600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146129175780600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461290f9190614374565b925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146129a25780600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461299a91906143a8565b925050819055505b5b50505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016129ff8461104f565b612a099190614374565b9050600060076000848152602001908152602001600020549050818114612aee576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612b739190614374565b9050600060096000848152602001908152602001600020549050600060088381548110612ba357612ba2613a8f565b5b906000526020600020015490508060088381548110612bc557612bc4613a8f565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612c1457612c136143fe565b5b6001900381819060005260206000200160009055905550505050565b6000612c3b8361104f565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b828054612cbb9061351b565b90600052602060002090601f016020900481019282612cdd5760008555612d24565b82601f10612cf657805160ff1916838001178555612d24565b82800160010185558215612d24579182015b82811115612d23578251825591602001919060010190612d08565b5b509050612d319190612d35565b5090565b5b80821115612d4e576000816000905550600101612d36565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612d9b81612d66565b8114612da657600080fd5b50565b600081359050612db881612d92565b92915050565b600060208284031215612dd457612dd3612d5c565b5b6000612de284828501612da9565b91505092915050565b60008115159050919050565b612e0081612deb565b82525050565b6000602082019050612e1b6000830184612df7565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612e5b578082015181840152602081019050612e40565b83811115612e6a576000848401525b50505050565b6000601f19601f8301169050919050565b6000612e8c82612e21565b612e968185612e2c565b9350612ea6818560208601612e3d565b612eaf81612e70565b840191505092915050565b60006020820190508181036000830152612ed48184612e81565b905092915050565b6000819050919050565b612eef81612edc565b8114612efa57600080fd5b50565b600081359050612f0c81612ee6565b92915050565b600060208284031215612f2857612f27612d5c565b5b6000612f3684828501612efd565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612f6a82612f3f565b9050919050565b612f7a81612f5f565b82525050565b6000602082019050612f956000830184612f71565b92915050565b612fa481612f5f565b8114612faf57600080fd5b50565b600081359050612fc181612f9b565b92915050565b60008060408385031215612fde57612fdd612d5c565b5b6000612fec85828601612fb2565b9250506020612ffd85828601612efd565b9150509250929050565b61301081612edc565b82525050565b600060208201905061302b6000830184613007565b92915050565b60008060006060848603121561304a57613049612d5c565b5b600061305886828701612fb2565b935050602061306986828701612fb2565b925050604061307a86828701612efd565b9150509250925092565b60006020828403121561309a57613099612d5c565b5b60006130a884828501612fb2565b91505092915050565b6130ba81612deb565b81146130c557600080fd5b50565b6000813590506130d7816130b1565b92915050565b600080604083850312156130f4576130f3612d5c565b5b6000613102858286016130c8565b9250506020613113858286016130c8565b9150509250929050565b600080fd5b600080fd5b600080fd5b60008083601f8401126131425761314161311d565b5b8235905067ffffffffffffffff81111561315f5761315e613122565b5b60208301915083602082028301111561317b5761317a613127565b5b9250929050565b6000806020838503121561319957613198612d5c565b5b600083013567ffffffffffffffff8111156131b7576131b6612d61565b5b6131c38582860161312c565b92509250509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61320c82612e70565b810181811067ffffffffffffffff8211171561322b5761322a6131d4565b5b80604052505050565b600061323e612d52565b905061324a8282613203565b919050565b600067ffffffffffffffff82111561326a576132696131d4565b5b61327382612e70565b9050602081019050919050565b82818337600083830152505050565b60006132a261329d8461324f565b613234565b9050828152602081018484840111156132be576132bd6131cf565b5b6132c9848285613280565b509392505050565b600082601f8301126132e6576132e561311d565b5b81356132f684826020860161328f565b91505092915050565b60006020828403121561331557613314612d5c565b5b600082013567ffffffffffffffff81111561333357613332612d61565b5b61333f848285016132d1565b91505092915050565b6000806040838503121561335f5761335e612d5c565b5b600061336d85828601612fb2565b925050602061337e858286016130c8565b9150509250929050565b600067ffffffffffffffff8211156133a3576133a26131d4565b5b6133ac82612e70565b9050602081019050919050565b60006133cc6133c784613388565b613234565b9050828152602081018484840111156133e8576133e76131cf565b5b6133f3848285613280565b509392505050565b600082601f8301126134105761340f61311d565b5b81356134208482602086016133b9565b91505092915050565b6000806000806080858703121561344357613442612d5c565b5b600061345187828801612fb2565b945050602061346287828801612fb2565b935050604061347387828801612efd565b925050606085013567ffffffffffffffff81111561349457613493612d61565b5b6134a0878288016133fb565b91505092959194509250565b600080604083850312156134c3576134c2612d5c565b5b60006134d185828601612fb2565b92505060206134e285828601612fb2565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061353357607f821691505b60208210811415613547576135466134ec565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006135a9602183612e2c565b91506135b48261354d565b604082019050919050565b600060208201905081810360008301526135d88161359c565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b600061363b603d83612e2c565b9150613646826135df565b604082019050919050565b6000602082019050818103600083015261366a8161362e565b9050919050565b7f63686f73656e206f6e6573206d696e74696e6720697320636c6f736564000000600082015250565b60006136a7601d83612e2c565b91506136b282613671565b602082019050919050565b600060208201905081810360008301526136d68161369a565b9050919050565b7f796f7520617265206e6f74207468652063686f73656e206f6e65730000000000600082015250565b6000613713601b83612e2c565b915061371e826136dd565b602082019050919050565b6000602082019050818103600083015261374281613706565b9050919050565b7f41646420736f6d65206d6f7265204554482c20696e73756666696369656e742060008201527f66756e6473000000000000000000000000000000000000000000000000000000602082015250565b60006137a5602583612e2c565b91506137b082613749565b604082019050919050565b600060208201905081810360008301526137d481613798565b9050919050565b7f756e666f7274756e6174656c792067726561742073616c6520697320656e6400600082015250565b6000613811601f83612e2c565b915061381c826137db565b602082019050919050565b6000602082019050818103600083015261384081613804565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b60006138a3602d83612e2c565b91506138ae82613847565b604082019050919050565b600060208201905081810360008301526138d281613896565b9050919050565b7f426574746572206c75636b206e6578742074696d652073616c6520697320636c60008201527f6f73656400000000000000000000000000000000000000000000000000000000602082015250565b6000613935602483612e2c565b9150613940826138d9565b604082019050919050565b6000602082019050818103600083015261396481613928565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b60006139c7602b83612e2c565b91506139d28261396b565b604082019050919050565b600060208201905081810360008301526139f6816139ba565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000613a59602c83612e2c565b9150613a64826139fd565b604082019050919050565b60006020820190508181036000830152613a8881613a4c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000613af4601883612e2c565b9150613aff82613abe565b602082019050919050565b60006020820190508181036000830152613b2381613ae7565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613b6482612edc565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613b9757613b96613b2a565b5b600182019050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000613bfe602983612e2c565b9150613c0982613ba2565b604082019050919050565b60006020820190508181036000830152613c2d81613bf1565b9050919050565b600081905092915050565b6000613c4a82612e21565b613c548185613c34565b9350613c64818560208601612e3d565b80840191505092915050565b6000613c7c8285613c3f565b9150613c888284613c3f565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613cf0602683612e2c565b9150613cfb82613c94565b604082019050919050565b60006020820190508181036000830152613d1f81613ce3565b9050919050565b7f434f4c4c454354494f4e20534f4c44204f555400000000000000000000000000600082015250565b6000613d5c601383612e2c565b9150613d6782613d26565b602082019050919050565b60006020820190508181036000830152613d8b81613d4f565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000613dee602583612e2c565b9150613df982613d92565b604082019050919050565b60006020820190508181036000830152613e1d81613de1565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613e80602483612e2c565b9150613e8b82613e24565b604082019050919050565b60006020820190508181036000830152613eaf81613e73565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613eec602083612e2c565b9150613ef782613eb6565b602082019050919050565b60006020820190508181036000830152613f1b81613edf565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000613f58601983612e2c565b9150613f6382613f22565b602082019050919050565b60006020820190508181036000830152613f8781613f4b565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000613fea603283612e2c565b9150613ff582613f8e565b604082019050919050565b6000602082019050818103600083015261401981613fdd565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b6000614085601483612e2c565b91506140908261404f565b602082019050919050565b600060208201905081810360008301526140b481614078565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b60006140f1601083612e2c565b91506140fc826140bb565b602082019050919050565b60006020820190508181036000830152614120816140e4565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061414e82614127565b6141588185614132565b9350614168818560208601612e3d565b61417181612e70565b840191505092915050565b60006080820190506141916000830187612f71565b61419e6020830186612f71565b6141ab6040830185613007565b81810360608301526141bd8184614143565b905095945050505050565b6000815190506141d781612d92565b92915050565b6000602082840312156141f3576141f2612d5c565b5b6000614201848285016141c8565b91505092915050565b7f455243373231456e756d657261626c653a20636f6e736563757469766520747260008201527f616e7366657273206e6f7420737570706f727465640000000000000000000000602082015250565b6000614266603583612e2c565b91506142718261420a565b604082019050919050565b6000602082019050818103600083015261429581614259565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b60006142d2602083612e2c565b91506142dd8261429c565b602082019050919050565b60006020820190508181036000830152614301816142c5565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b600061433e601c83612e2c565b915061434982614308565b602082019050919050565b6000602082019050818103600083015261436d81614331565b9050919050565b600061437f82612edc565b915061438a83612edc565b92508282101561439d5761439c613b2a565b5b828203905092915050565b60006143b382612edc565b91506143be83612edc565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156143f3576143f2613b2a565b5b828201905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea2646970667358221220837fa68180ac740c3197a11bd5f4ece77dd4e8d62507ab2b2fbb87ed3578c09464736f6c63430008090033
Deployed Bytecode
0x6080604052600436106101ee5760003560e01c80635c975abb1161010d5780638f7bcb08116100a0578063b88d4fde1161006f578063b88d4fde14610697578063bcc9ca5b146106c0578063c87b56dd146106eb578063e985e9c514610728578063f2fde38b14610765576101ee565b80638f7bcb08146105ef57806395d89b41146106185780639ebabd6214610643578063a22cb4651461066e576101ee565b806370a08231116100dc57806370a0823114610559578063715018a6146105965780638456cb59146105ad5780638da5cb5b146105c4576101ee565b80635c975abb1461049d5780636352211e146104c85780636447c35d146105055780636c0360eb1461052e576101ee565b806326092b83116101855780633f4ba83a116101545780633f4ba83a146103f757806342842e0e1461040e5780634f6ccce71461043757806351cff8d914610474576101ee565b806326092b831461034a5780632848aeaf146103545780632f48de79146103915780632f745c59146103ba576101ee565b8063095ea7b3116101c1578063095ea7b3146102c3578063102a6a73146102ec57806318160ddd146102f657806323b872dd14610321576101ee565b806301ffc9a7146101f357806306fdde0314610230578063081812fc1461025b578063085c9bac14610298575b600080fd5b3480156101ff57600080fd5b5061021a60048036038101906102159190612dbe565b61078e565b6040516102279190612e06565b60405180910390f35b34801561023c57600080fd5b506102456107a0565b6040516102529190612eba565b60405180910390f35b34801561026757600080fd5b50610282600480360381019061027d9190612f12565b610832565b60405161028f9190612f80565b60405180910390f35b3480156102a457600080fd5b506102ad610878565b6040516102ba9190612e06565b60405180910390f35b3480156102cf57600080fd5b506102ea60048036038101906102e59190612fc7565b61088b565b005b6102f46109a3565b005b34801561030257600080fd5b5061030b610b1c565b6040516103189190613016565b60405180910390f35b34801561032d57600080fd5b5061034860048036038101906103439190613031565b610b29565b005b610352610b89565b005b34801561036057600080fd5b5061037b60048036038101906103769190613084565b610c76565b6040516103889190612e06565b60405180910390f35b34801561039d57600080fd5b506103b860048036038101906103b391906130dd565b610c96565b005b3480156103c657600080fd5b506103e160048036038101906103dc9190612fc7565b610cd6565b6040516103ee9190613016565b60405180910390f35b34801561040357600080fd5b5061040c610d7b565b005b34801561041a57600080fd5b5061043560048036038101906104309190613031565b610d8d565b005b34801561044357600080fd5b5061045e60048036038101906104599190612f12565b610dad565b60405161046b9190613016565b60405180910390f35b34801561048057600080fd5b5061049b60048036038101906104969190613084565b610e1e565b005b3480156104a957600080fd5b506104b2610e76565b6040516104bf9190612e06565b60405180910390f35b3480156104d457600080fd5b506104ef60048036038101906104ea9190612f12565b610e8d565b6040516104fc9190612f80565b60405180910390f35b34801561051157600080fd5b5061052c60048036038101906105279190613182565b610f14565b005b34801561053a57600080fd5b50610543610fc1565b6040516105509190612eba565b60405180910390f35b34801561056557600080fd5b50610580600480360381019061057b9190613084565b61104f565b60405161058d9190613016565b60405180910390f35b3480156105a257600080fd5b506105ab611107565b005b3480156105b957600080fd5b506105c261111b565b005b3480156105d057600080fd5b506105d961112d565b6040516105e69190612f80565b60405180910390f35b3480156105fb57600080fd5b50610616600480360381019061061191906132ff565b611157565b005b34801561062457600080fd5b5061062d611179565b60405161063a9190612eba565b60405180910390f35b34801561064f57600080fd5b5061065861120b565b6040516106659190613016565b60405180910390f35b34801561067a57600080fd5b5061069560048036038101906106909190613348565b611211565b005b3480156106a357600080fd5b506106be60048036038101906106b99190613429565b611227565b005b3480156106cc57600080fd5b506106d5611289565b6040516106e29190612e06565b60405180910390f35b3480156106f757600080fd5b50610712600480360381019061070d9190612f12565b61129c565b60405161071f9190612eba565b60405180910390f35b34801561073457600080fd5b5061074f600480360381019061074a91906134ac565b611304565b60405161075c9190612e06565b60405180910390f35b34801561077157600080fd5b5061078c60048036038101906107879190613084565b611398565b005b600061079982611432565b9050919050565b6060600080546107af9061351b565b80601f01602080910402602001604051908101604052809291908181526020018280546107db9061351b565b80156108285780601f106107fd57610100808354040283529160200191610828565b820191906000526020600020905b81548152906001019060200180831161080b57829003601f168201915b5050505050905090565b600061083d826114ac565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600d60019054906101000a900460ff1681565b600061089682610e8d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610907576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108fe906135bf565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109266114f7565b73ffffffffffffffffffffffffffffffffffffffff16148061095557506109548161094f6114f7565b611304565b5b610994576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098b90613651565b60405180910390fd5b61099e83836114ff565b505050565b600d60019054906101000a900460ff166109f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e9906136bd565b60405180910390fd5b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610a7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7590613729565b60405180910390fd5b661c6bf5263400003414610ac7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610abe906137bb565b60405180910390fd5b600b54610ad2610b1c565b10610b12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0990613827565b60405180910390fd5b610b1a6115b8565b565b6000600880549050905090565b610b3a610b346114f7565b82611628565b610b79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b70906138b9565b60405180910390fd5b610b848383836116bd565b505050565b600d60009054906101000a900460ff16610bd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bcf9061394b565b60405180910390fd5b661c6bf5263400003414610c21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c18906137bb565b60405180910390fd5b600b54610c2c610b1c565b10610c6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6390613827565b60405180910390fd5b610c746115b8565b565b600e6020528060005260406000206000915054906101000a900460ff1681565b610c9e6119b7565b81600d60006101000a81548160ff02191690831515021790555080600d60016101000a81548160ff0219169083151502179055505050565b6000610ce18361104f565b8210610d22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d19906139dd565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610d836119b7565b610d8b611a35565b565b610da883838360405180602001604052806000815250611227565b505050565b6000610db7610b1c565b8210610df8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610def90613a6f565b60405180910390fd5b60088281548110610e0c57610e0b613a8f565b5b90600052602060002001549050919050565b610e266119b7565b60004790508173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610e71573d6000803e3d6000fd5b505050565b6000600a60009054906101000a900460ff16905090565b600080610e9983611a98565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610f0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0290613b0a565b60405180910390fd5b80915050919050565b610f1c6119b7565b60005b82829050811015610fbc576001600e6000858585818110610f4357610f42613a8f565b5b9050602002016020810190610f589190613084565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080610fb490613b59565b915050610f1f565b505050565b60108054610fce9061351b565b80601f0160208091040260200160405190810160405280929190818152602001828054610ffa9061351b565b80156110475780601f1061101c57610100808354040283529160200191611047565b820191906000526020600020905b81548152906001019060200180831161102a57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156110c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b790613c14565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61110f6119b7565b6111196000611ad5565b565b6111236119b7565b61112b611b9b565b565b6000600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61115f6119b7565b8060109080519060200190611175929190612caf565b5050565b6060600180546111889061351b565b80601f01602080910402602001604051908101604052809291908181526020018280546111b49061351b565b80156112015780601f106111d657610100808354040283529160200191611201565b820191906000526020600020905b8154815290600101906020018083116111e457829003601f168201915b5050505050905090565b600c5481565b61122361121c6114f7565b8383611bfe565b5050565b6112386112326114f7565b83611628565b611277576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126e906138b9565b60405180910390fd5b61128384848484611d6b565b50505050565b600d60009054906101000a900460ff1681565b60606112a7826114ac565b60006112b1611dc7565b905060008151116112d157604051806020016040528060008152506112fc565b806112db84611e59565b6040516020016112ec929190613c70565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6113a06119b7565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611410576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140790613d06565b60405180910390fd5b61141981611ad5565b50565b6001816000016000828254019250508190555050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806114a557506114a482611f31565b5b9050919050565b6114b581612013565b6114f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114eb90613b0a565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661157283610e8d565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600b546115c3610b1c565b10611603576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115fa90613d72565b60405180910390fd5b600061160f600f612054565b905061161b600f61141c565b6116253382612062565b50565b60008061163483610e8d565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061167657506116758185611304565b5b806116b457508373ffffffffffffffffffffffffffffffffffffffff1661169c84610832565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166116dd82610e8d565b73ffffffffffffffffffffffffffffffffffffffff1614611733576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172a90613e04565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156117a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179a90613e96565b60405180910390fd5b6117b08383836001612080565b8273ffffffffffffffffffffffffffffffffffffffff166117d082610e8d565b73ffffffffffffffffffffffffffffffffffffffff1614611826576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181d90613e04565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46119b2838383600161209a565b505050565b6119bf6114f7565b73ffffffffffffffffffffffffffffffffffffffff166119dd61112d565b73ffffffffffffffffffffffffffffffffffffffff1614611a33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2a90613f02565b60405180910390fd5b565b611a3d6120a0565b6000600a60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611a816114f7565b604051611a8e9190612f80565b60405180910390a1565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611ba36120e9565b6001600a60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611be76114f7565b604051611bf49190612f80565b60405180910390a1565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611c6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6490613f6e565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611d5e9190612e06565b60405180910390a3505050565b611d768484846116bd565b611d8284848484612133565b611dc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db890614000565b60405180910390fd5b50505050565b606060108054611dd69061351b565b80601f0160208091040260200160405190810160405280929190818152602001828054611e029061351b565b8015611e4f5780601f10611e2457610100808354040283529160200191611e4f565b820191906000526020600020905b815481529060010190602001808311611e3257829003601f168201915b5050505050905090565b606060006001611e68846122ca565b01905060008167ffffffffffffffff811115611e8757611e866131d4565b5b6040519080825280601f01601f191660200182016040528015611eb95781602001600182028036833780820191505090505b509050600082602001820190505b600115611f26578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581611f1057611f0f614020565b5b0494506000851415611f2157611f26565b611ec7565b819350505050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611ffc57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061200c575061200b8261241d565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff1661203583611a98565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600081600001549050919050565b61207c828260405180602001604052806000815250612487565b5050565b6120886120e9565b612094848484846124e2565b50505050565b50505050565b6120a8610e76565b6120e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120de9061409b565b60405180910390fd5b565b6120f1610e76565b15612131576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161212890614107565b60405180910390fd5b565b60006121548473ffffffffffffffffffffffffffffffffffffffff16612642565b156122bd578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261217d6114f7565b8786866040518563ffffffff1660e01b815260040161219f949392919061417c565b602060405180830381600087803b1580156121b957600080fd5b505af19250505080156121ea57506040513d601f19601f820116820180604052508101906121e791906141dd565b60015b61226d573d806000811461221a576040519150601f19603f3d011682016040523d82523d6000602084013e61221f565b606091505b50600081511415612265576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225c90614000565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506122c2565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612328577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000838161231e5761231d614020565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612365576d04ee2d6d415b85acef8100000000838161235b5761235a614020565b5b0492506020810190505b662386f26fc10000831061239457662386f26fc10000838161238a57612389614020565b5b0492506010810190505b6305f5e10083106123bd576305f5e10083816123b3576123b2614020565b5b0492506008810190505b61271083106123e25761271083816123d8576123d7614020565b5b0492506004810190505b6064831061240557606483816123fb576123fa614020565b5b0492506002810190505b600a8310612414576001810190505b80915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6124918383612665565b61249e6000848484612133565b6124dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124d490614000565b60405180910390fd5b505050565b6124ee84848484612883565b6001811115612532576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125299061427c565b60405180910390fd5b6000829050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141561257a57612575816129a9565b6125b9565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16146125b8576125b785826129f2565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156125fc576125f781612b5f565b61263b565b8473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161461263a576126398482612c30565b5b5b5050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156126d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126cc906142e8565b60405180910390fd5b6126de81612013565b1561271e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161271590614354565b60405180910390fd5b61272c600083836001612080565b61273581612013565b15612775576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161276c90614354565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461287f60008383600161209a565b5050565b60018111156129a357600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146129175780600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461290f9190614374565b925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146129a25780600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461299a91906143a8565b925050819055505b5b50505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016129ff8461104f565b612a099190614374565b9050600060076000848152602001908152602001600020549050818114612aee576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612b739190614374565b9050600060096000848152602001908152602001600020549050600060088381548110612ba357612ba2613a8f565b5b906000526020600020015490508060088381548110612bc557612bc4613a8f565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612c1457612c136143fe565b5b6001900381819060005260206000200160009055905550505050565b6000612c3b8361104f565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b828054612cbb9061351b565b90600052602060002090601f016020900481019282612cdd5760008555612d24565b82601f10612cf657805160ff1916838001178555612d24565b82800160010185558215612d24579182015b82811115612d23578251825591602001919060010190612d08565b5b509050612d319190612d35565b5090565b5b80821115612d4e576000816000905550600101612d36565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612d9b81612d66565b8114612da657600080fd5b50565b600081359050612db881612d92565b92915050565b600060208284031215612dd457612dd3612d5c565b5b6000612de284828501612da9565b91505092915050565b60008115159050919050565b612e0081612deb565b82525050565b6000602082019050612e1b6000830184612df7565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612e5b578082015181840152602081019050612e40565b83811115612e6a576000848401525b50505050565b6000601f19601f8301169050919050565b6000612e8c82612e21565b612e968185612e2c565b9350612ea6818560208601612e3d565b612eaf81612e70565b840191505092915050565b60006020820190508181036000830152612ed48184612e81565b905092915050565b6000819050919050565b612eef81612edc565b8114612efa57600080fd5b50565b600081359050612f0c81612ee6565b92915050565b600060208284031215612f2857612f27612d5c565b5b6000612f3684828501612efd565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612f6a82612f3f565b9050919050565b612f7a81612f5f565b82525050565b6000602082019050612f956000830184612f71565b92915050565b612fa481612f5f565b8114612faf57600080fd5b50565b600081359050612fc181612f9b565b92915050565b60008060408385031215612fde57612fdd612d5c565b5b6000612fec85828601612fb2565b9250506020612ffd85828601612efd565b9150509250929050565b61301081612edc565b82525050565b600060208201905061302b6000830184613007565b92915050565b60008060006060848603121561304a57613049612d5c565b5b600061305886828701612fb2565b935050602061306986828701612fb2565b925050604061307a86828701612efd565b9150509250925092565b60006020828403121561309a57613099612d5c565b5b60006130a884828501612fb2565b91505092915050565b6130ba81612deb565b81146130c557600080fd5b50565b6000813590506130d7816130b1565b92915050565b600080604083850312156130f4576130f3612d5c565b5b6000613102858286016130c8565b9250506020613113858286016130c8565b9150509250929050565b600080fd5b600080fd5b600080fd5b60008083601f8401126131425761314161311d565b5b8235905067ffffffffffffffff81111561315f5761315e613122565b5b60208301915083602082028301111561317b5761317a613127565b5b9250929050565b6000806020838503121561319957613198612d5c565b5b600083013567ffffffffffffffff8111156131b7576131b6612d61565b5b6131c38582860161312c565b92509250509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61320c82612e70565b810181811067ffffffffffffffff8211171561322b5761322a6131d4565b5b80604052505050565b600061323e612d52565b905061324a8282613203565b919050565b600067ffffffffffffffff82111561326a576132696131d4565b5b61327382612e70565b9050602081019050919050565b82818337600083830152505050565b60006132a261329d8461324f565b613234565b9050828152602081018484840111156132be576132bd6131cf565b5b6132c9848285613280565b509392505050565b600082601f8301126132e6576132e561311d565b5b81356132f684826020860161328f565b91505092915050565b60006020828403121561331557613314612d5c565b5b600082013567ffffffffffffffff81111561333357613332612d61565b5b61333f848285016132d1565b91505092915050565b6000806040838503121561335f5761335e612d5c565b5b600061336d85828601612fb2565b925050602061337e858286016130c8565b9150509250929050565b600067ffffffffffffffff8211156133a3576133a26131d4565b5b6133ac82612e70565b9050602081019050919050565b60006133cc6133c784613388565b613234565b9050828152602081018484840111156133e8576133e76131cf565b5b6133f3848285613280565b509392505050565b600082601f8301126134105761340f61311d565b5b81356134208482602086016133b9565b91505092915050565b6000806000806080858703121561344357613442612d5c565b5b600061345187828801612fb2565b945050602061346287828801612fb2565b935050604061347387828801612efd565b925050606085013567ffffffffffffffff81111561349457613493612d61565b5b6134a0878288016133fb565b91505092959194509250565b600080604083850312156134c3576134c2612d5c565b5b60006134d185828601612fb2565b92505060206134e285828601612fb2565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061353357607f821691505b60208210811415613547576135466134ec565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006135a9602183612e2c565b91506135b48261354d565b604082019050919050565b600060208201905081810360008301526135d88161359c565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b600061363b603d83612e2c565b9150613646826135df565b604082019050919050565b6000602082019050818103600083015261366a8161362e565b9050919050565b7f63686f73656e206f6e6573206d696e74696e6720697320636c6f736564000000600082015250565b60006136a7601d83612e2c565b91506136b282613671565b602082019050919050565b600060208201905081810360008301526136d68161369a565b9050919050565b7f796f7520617265206e6f74207468652063686f73656e206f6e65730000000000600082015250565b6000613713601b83612e2c565b915061371e826136dd565b602082019050919050565b6000602082019050818103600083015261374281613706565b9050919050565b7f41646420736f6d65206d6f7265204554482c20696e73756666696369656e742060008201527f66756e6473000000000000000000000000000000000000000000000000000000602082015250565b60006137a5602583612e2c565b91506137b082613749565b604082019050919050565b600060208201905081810360008301526137d481613798565b9050919050565b7f756e666f7274756e6174656c792067726561742073616c6520697320656e6400600082015250565b6000613811601f83612e2c565b915061381c826137db565b602082019050919050565b6000602082019050818103600083015261384081613804565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b60006138a3602d83612e2c565b91506138ae82613847565b604082019050919050565b600060208201905081810360008301526138d281613896565b9050919050565b7f426574746572206c75636b206e6578742074696d652073616c6520697320636c60008201527f6f73656400000000000000000000000000000000000000000000000000000000602082015250565b6000613935602483612e2c565b9150613940826138d9565b604082019050919050565b6000602082019050818103600083015261396481613928565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b60006139c7602b83612e2c565b91506139d28261396b565b604082019050919050565b600060208201905081810360008301526139f6816139ba565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000613a59602c83612e2c565b9150613a64826139fd565b604082019050919050565b60006020820190508181036000830152613a8881613a4c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000613af4601883612e2c565b9150613aff82613abe565b602082019050919050565b60006020820190508181036000830152613b2381613ae7565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613b6482612edc565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613b9757613b96613b2a565b5b600182019050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000613bfe602983612e2c565b9150613c0982613ba2565b604082019050919050565b60006020820190508181036000830152613c2d81613bf1565b9050919050565b600081905092915050565b6000613c4a82612e21565b613c548185613c34565b9350613c64818560208601612e3d565b80840191505092915050565b6000613c7c8285613c3f565b9150613c888284613c3f565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613cf0602683612e2c565b9150613cfb82613c94565b604082019050919050565b60006020820190508181036000830152613d1f81613ce3565b9050919050565b7f434f4c4c454354494f4e20534f4c44204f555400000000000000000000000000600082015250565b6000613d5c601383612e2c565b9150613d6782613d26565b602082019050919050565b60006020820190508181036000830152613d8b81613d4f565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000613dee602583612e2c565b9150613df982613d92565b604082019050919050565b60006020820190508181036000830152613e1d81613de1565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613e80602483612e2c565b9150613e8b82613e24565b604082019050919050565b60006020820190508181036000830152613eaf81613e73565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613eec602083612e2c565b9150613ef782613eb6565b602082019050919050565b60006020820190508181036000830152613f1b81613edf565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000613f58601983612e2c565b9150613f6382613f22565b602082019050919050565b60006020820190508181036000830152613f8781613f4b565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000613fea603283612e2c565b9150613ff582613f8e565b604082019050919050565b6000602082019050818103600083015261401981613fdd565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b6000614085601483612e2c565b91506140908261404f565b602082019050919050565b600060208201905081810360008301526140b481614078565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b60006140f1601083612e2c565b91506140fc826140bb565b602082019050919050565b60006020820190508181036000830152614120816140e4565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061414e82614127565b6141588185614132565b9350614168818560208601612e3d565b61417181612e70565b840191505092915050565b60006080820190506141916000830187612f71565b61419e6020830186612f71565b6141ab6040830185613007565b81810360608301526141bd8184614143565b905095945050505050565b6000815190506141d781612d92565b92915050565b6000602082840312156141f3576141f2612d5c565b5b6000614201848285016141c8565b91505092915050565b7f455243373231456e756d657261626c653a20636f6e736563757469766520747260008201527f616e7366657273206e6f7420737570706f727465640000000000000000000000602082015250565b6000614266603583612e2c565b91506142718261420a565b604082019050919050565b6000602082019050818103600083015261429581614259565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b60006142d2602083612e2c565b91506142dd8261429c565b602082019050919050565b60006020820190508181036000830152614301816142c5565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b600061433e601c83612e2c565b915061434982614308565b602082019050919050565b6000602082019050818103600083015261436d81614331565b9050919050565b600061437f82612edc565b915061438a83612edc565b92508282101561439d5761439c613b2a565b5b828203905092915050565b60006143b382612edc565b91506143be83612edc565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156143f3576143f2613b2a565b5b828201905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea2646970667358221220837fa68180ac740c3197a11bd5f4ece77dd4e8d62507ab2b2fbb87ed3578c09464736f6c63430008090033
Deployed Bytecode Sourcemap
66657:3063:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69340:212;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44705:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46217:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66899:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45735:416;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67670:384;;;:::i;:::-;;61283:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46917:335;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68064:312;;;:::i;:::-;;66950:41;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67446:216;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60951:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67373:65;;;;;;;;;;;;;:::i;:::-;;47323:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61473:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68643:153;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21963:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44415:223;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68804:193;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67063:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44146:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19473:103;;;;;;;;;;;;;:::i;:::-;;67304:61;;;;;;;;;;;;;:::i;:::-;;18825:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69572:139;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44874:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66805:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46460:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47579:322;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66858:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45049:281;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46686:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19731:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69340:212;69479:4;69508:36;69532:11;69508:23;:36::i;:::-;69501:43;;69340:212;;;:::o;44705:100::-;44759:13;44792:5;44785:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44705:100;:::o;46217:171::-;46293:7;46313:23;46328:7;46313:14;:23::i;:::-;46356:15;:24;46372:7;46356:24;;;;;;;;;;;;;;;;;;;;;46349:31;;46217:171;;;:::o;66899:37::-;;;;;;;;;;;;;:::o;45735:416::-;45816:13;45832:23;45847:7;45832:14;:23::i;:::-;45816:39;;45880:5;45874:11;;:2;:11;;;;45866:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;45974:5;45958:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;45983:37;46000:5;46007:12;:10;:12::i;:::-;45983:16;:37::i;:::-;45958:62;45936:173;;;;;;;;;;;;:::i;:::-;;;;;;;;;46122:21;46131:2;46135:7;46122:8;:21::i;:::-;45805:346;45735:416;;:::o;67670:384::-;67730:17;;;;;;;;;;;67722:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;67800:9;:21;67810:10;67800:21;;;;;;;;;;;;;;;;;;;;;;;;;67792:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;67885:11;67872:9;:24;67864:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;67973:9;;67957:13;:11;:13::i;:::-;:25;67949:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;68030:14;:12;:14::i;:::-;67670:384::o;61283:113::-;61344:7;61371:10;:17;;;;61364:24;;61283:113;:::o;46917:335::-;47112:41;47131:12;:10;:12::i;:::-;47145:7;47112:18;:41::i;:::-;47104:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;47216:28;47226:4;47232:2;47236:7;47216:9;:28::i;:::-;46917:335;;;:::o;68064:312::-;68120:14;;;;;;;;;;;68112:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;68207:11;68194:9;:24;68186:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;68295:9;;68279:13;:11;:13::i;:::-;:25;68271:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;68352:14;:12;:14::i;:::-;68064:312::o;66950:41::-;;;;;;;;;;;;;;;;;;;;;;:::o;67446:216::-;18711:13;:11;:13::i;:::-;67590:15:::1;67573:14;;:32;;;;;;;;;;;;;;;;;;67636:18;67616:17;;:38;;;;;;;;;;;;;;;;;;67446:216:::0;;:::o;60951:256::-;61048:7;61084:23;61101:5;61084:16;:23::i;:::-;61076:5;:31;61068:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;61173:12;:19;61186:5;61173:19;;;;;;;;;;;;;;;:26;61193:5;61173:26;;;;;;;;;;;;61166:33;;60951:256;;;;:::o;67373:65::-;18711:13;:11;:13::i;:::-;67420:10:::1;:8;:10::i;:::-;67373:65::o:0;47323:185::-;47461:39;47478:4;47484:2;47488:7;47461:39;;;;;;;;;;;;:16;:39::i;:::-;47323:185;;;:::o;61473:233::-;61548:7;61584:30;:28;:30::i;:::-;61576:5;:38;61568:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;61681:10;61692:5;61681:17;;;;;;;;:::i;:::-;;;;;;;;;;61674:24;;61473:233;;;:::o;68643:153::-;18711:13;:11;:13::i;:::-;68706:15:::1;68724:21;68706:39;;68764:5;68756:23;;:32;68780:7;68756:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;68695:101;68643:153:::0;:::o;21963:86::-;22010:4;22034:7;;;;;;;;;;;22027:14;;21963:86;:::o;44415:223::-;44487:7;44507:13;44523:17;44532:7;44523:8;:17::i;:::-;44507:33;;44576:1;44559:19;;:5;:19;;;;44551:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;44625:5;44618:12;;;44415:223;;;:::o;68804:193::-;18711:13;:11;:13::i;:::-;68892:9:::1;68888:102;68911:9;;:16;;68907:1;:20;68888:102;;;68974:4;68948:9;:23;68958:9;;68968:1;68958:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;68948:23;;;;;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;68929:3;;;;;:::i;:::-;;;;68888:102;;;;68804:193:::0;;:::o;67063:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;44146:207::-;44218:7;44263:1;44246:19;;:5;:19;;;;44238:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;44329:9;:16;44339:5;44329:16;;;;;;;;;;;;;;;;44322:23;;44146:207;;;:::o;19473:103::-;18711:13;:11;:13::i;:::-;19538:30:::1;19565:1;19538:18;:30::i;:::-;19473:103::o:0;67304:61::-;18711:13;:11;:13::i;:::-;67349:8:::1;:6;:8::i;:::-;67304:61::o:0;18825:87::-;18871:7;18898:6;;;;;;;;;;;18891:13;;18825:87;:::o;69572:139::-;18711:13;:11;:13::i;:::-;69691:8:::1;69681:7;:18;;;;;;;;;;;;:::i;:::-;;69572:139:::0;:::o;44874:104::-;44930:13;44963:7;44956:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44874:104;:::o;66805:44::-;;;;:::o;46460:155::-;46555:52;46574:12;:10;:12::i;:::-;46588:8;46598;46555:18;:52::i;:::-;46460:155;;:::o;47579:322::-;47753:41;47772:12;:10;:12::i;:::-;47786:7;47753:18;:41::i;:::-;47745:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;47855:38;47869:4;47875:2;47879:7;47888:4;47855:13;:38::i;:::-;47579:322;;;;:::o;66858:34::-;;;;;;;;;;;;;:::o;45049:281::-;45122:13;45148:23;45163:7;45148:14;:23::i;:::-;45184:21;45208:10;:8;:10::i;:::-;45184:34;;45260:1;45242:7;45236:21;:25;:86;;;;;;;;;;;;;;;;;45288:7;45297:18;:7;:16;:18::i;:::-;45271:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;45236:86;45229:93;;;45049:281;;;:::o;46686:164::-;46783:4;46807:18;:25;46826:5;46807:25;;;;;;;;;;;;;;;:35;46833:8;46807:35;;;;;;;;;;;;;;;;;;;;;;;;;46800:42;;46686:164;;;;:::o;19731:201::-;18711:13;:11;:13::i;:::-;19840:1:::1;19820:22;;:8;:22;;;;19812:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;19896:28;19915:8;19896:18;:28::i;:::-;19731:201:::0;:::o;1027:127::-;1134:1;1116:7;:14;;;:19;;;;;;;;;;;1027:127;:::o;60643:224::-;60745:4;60784:35;60769:50;;;:11;:50;;;;:90;;;;60823:36;60847:11;60823:23;:36::i;:::-;60769:90;60762:97;;60643:224;;;:::o;56036:135::-;56118:16;56126:7;56118;:16::i;:::-;56110:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;56036:135;:::o;17376:98::-;17429:7;17456:10;17449:17;;17376:98;:::o;55315:174::-;55417:2;55390:15;:24;55406:7;55390:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;55473:7;55469:2;55435:46;;55444:23;55459:7;55444:14;:23::i;:::-;55435:46;;;;;;;;;;;;55315:174;;:::o;68386:242::-;68454:9;;68438:13;:11;:13::i;:::-;:25;68430:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;68498:15;68516:25;:15;:23;:25::i;:::-;68498:43;;68552:27;:15;:25;:27::i;:::-;68590:30;68600:10;68612:7;68590:9;:30::i;:::-;68419:209;68386:242::o;49934:264::-;50027:4;50044:13;50060:23;50075:7;50060:14;:23::i;:::-;50044:39;;50113:5;50102:16;;:7;:16;;;:52;;;;50122:32;50139:5;50146:7;50122:16;:32::i;:::-;50102:52;:87;;;;50182:7;50158:31;;:20;50170:7;50158:11;:20::i;:::-;:31;;;50102:87;50094:96;;;49934:264;;;;:::o;53933:1263::-;54092:4;54065:31;;:23;54080:7;54065:14;:23::i;:::-;:31;;;54057:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;54171:1;54157:16;;:2;:16;;;;54149:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;54227:42;54248:4;54254:2;54258:7;54267:1;54227:20;:42::i;:::-;54399:4;54372:31;;:23;54387:7;54372:14;:23::i;:::-;:31;;;54364:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;54517:15;:24;54533:7;54517:24;;;;;;;;;;;;54510:31;;;;;;;;;;;55012:1;54993:9;:15;55003:4;54993:15;;;;;;;;;;;;;;;;:20;;;;;;;;;;;55045:1;55028:9;:13;55038:2;55028:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;55087:2;55068:7;:16;55076:7;55068:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;55126:7;55122:2;55107:27;;55116:4;55107:27;;;;;;;;;;;;55147:41;55167:4;55173:2;55177:7;55186:1;55147:19;:41::i;:::-;53933:1263;;;:::o;18990:132::-;19065:12;:10;:12::i;:::-;19054:23;;:7;:5;:7::i;:::-;:23;;;19046:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;18990:132::o;22818:120::-;21827:16;:14;:16::i;:::-;22887:5:::1;22877:7;;:15;;;;;;;;;;;;;;;;;;22908:22;22917:12;:10;:12::i;:::-;22908:22;;;;;;:::i;:::-;;;;;;;;22818:120::o:0;49209:117::-;49275:7;49302;:16;49310:7;49302:16;;;;;;;;;;;;;;;;;;;;;49295:23;;49209:117;;;:::o;20092:191::-;20166:16;20185:6;;;;;;;;;;;20166:25;;20211:8;20202:6;;:17;;;;;;;;;;;;;;;;;;20266:8;20235:40;;20256:8;20235:40;;;;;;;;;;;;20155:128;20092:191;:::o;22559:118::-;21568:19;:17;:19::i;:::-;22629:4:::1;22619:7;;:14;;;;;;;;;;;;;;;;;;22649:20;22656:12;:10;:12::i;:::-;22649:20;;;;;;:::i;:::-;;;;;;;;22559:118::o:0;55632:315::-;55787:8;55778:17;;:5;:17;;;;55770:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;55874:8;55836:18;:25;55855:5;55836:25;;;;;;;;;;;;;;;:35;55862:8;55836:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;55920:8;55898:41;;55913:5;55898:41;;;55930:8;55898:41;;;;;;:::i;:::-;;;;;;;;55632:315;;;:::o;48782:313::-;48938:28;48948:4;48954:2;48958:7;48938:9;:28::i;:::-;48985:47;49008:4;49014:2;49018:7;49027:4;48985:22;:47::i;:::-;48977:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;48782:313;;;;:::o;67196:100::-;67248:13;67281:7;67274:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67196:100;:::o;14803:716::-;14859:13;14910:14;14947:1;14927:17;14938:5;14927:10;:17::i;:::-;:21;14910:38;;14963:20;14997:6;14986:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14963:41;;15019:11;15148:6;15144:2;15140:15;15132:6;15128:28;15121:35;;15185:288;15192:4;15185:288;;;15217:5;;;;;;;;15359:8;15354:2;15347:5;15343:14;15338:30;15333:3;15325:44;15415:2;15406:11;;;;;;:::i;:::-;;;;;15449:1;15440:5;:10;15436:21;;;15452:5;;15436:21;15185:288;;;15494:6;15487:13;;;;;14803:716;;;:::o;43777:305::-;43879:4;43931:25;43916:40;;;:11;:40;;;;:105;;;;43988:33;43973:48;;;:11;:48;;;;43916:105;:158;;;;44038:36;44062:11;44038:23;:36::i;:::-;43916:158;43896:178;;43777:305;;;:::o;49639:128::-;49704:4;49757:1;49728:31;;:17;49737:7;49728:8;:17::i;:::-;:31;;;;49721:38;;49639:128;;;:::o;905:114::-;970:7;997;:14;;;990:21;;905:114;;;:::o;50540:110::-;50616:26;50626:2;50630:7;50616:26;;;;;;;;;;;;:9;:26::i;:::-;50540:110;;:::o;69005:257::-;21568:19;:17;:19::i;:::-;69198:56:::1;69225:4;69231:2;69235:7;69244:9;69198:26;:56::i;:::-;69005:257:::0;;;;:::o;59452:158::-;;;;;:::o;22307:108::-;22374:8;:6;:8::i;:::-;22366:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;22307:108::o;22122:::-;22193:8;:6;:8::i;:::-;22192:9;22184:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;22122:108::o;56735:853::-;56889:4;56910:15;:2;:13;;;:15::i;:::-;56906:675;;;56962:2;56946:36;;;56983:12;:10;:12::i;:::-;56997:4;57003:7;57012:4;56946:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;56942:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57204:1;57187:6;:13;:18;57183:328;;;57230:60;;;;;;;;;;:::i;:::-;;;;;;;;57183:328;57461:6;57455:13;57446:6;57442:2;57438:15;57431:38;56942:584;57078:41;;;57068:51;;;:6;:51;;;;57061:58;;;;;56906:675;57565:4;57558:11;;56735:853;;;;;;;:::o;11669:922::-;11722:7;11742:14;11759:1;11742:18;;11809:6;11800:5;:15;11796:102;;11845:6;11836:15;;;;;;:::i;:::-;;;;;11880:2;11870:12;;;;11796:102;11925:6;11916:5;:15;11912:102;;11961:6;11952:15;;;;;;:::i;:::-;;;;;11996:2;11986:12;;;;11912:102;12041:6;12032:5;:15;12028:102;;12077:6;12068:15;;;;;;:::i;:::-;;;;;12112:2;12102:12;;;;12028:102;12157:5;12148;:14;12144:99;;12192:5;12183:14;;;;;;:::i;:::-;;;;;12226:1;12216:11;;;;12144:99;12270:5;12261;:14;12257:99;;12305:5;12296:14;;;;;;:::i;:::-;;;;;12339:1;12329:11;;;;12257:99;12383:5;12374;:14;12370:99;;12418:5;12409:14;;;;;;:::i;:::-;;;;;12452:1;12442:11;;;;12370:99;12496:5;12487;:14;12483:66;;12532:1;12522:11;;;;12483:66;12577:6;12570:13;;;11669:922;;;:::o;35209:157::-;35294:4;35333:25;35318:40;;;:11;:40;;;;35311:47;;35209:157;;;:::o;50877:319::-;51006:18;51012:2;51016:7;51006:5;:18::i;:::-;51057:53;51088:1;51092:2;51096:7;51105:4;51057:22;:53::i;:::-;51035:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;50877:319;;;:::o;61780:915::-;61957:61;61984:4;61990:2;61994:12;62008:9;61957:26;:61::i;:::-;62047:1;62035:9;:13;62031:222;;;62178:63;;;;;;;;;;:::i;:::-;;;;;;;;62031:222;62265:15;62283:12;62265:30;;62328:1;62312:18;;:4;:18;;;62308:187;;;62347:40;62379:7;62347:31;:40::i;:::-;62308:187;;;62417:2;62409:10;;:4;:10;;;62405:90;;62436:47;62469:4;62475:7;62436:32;:47::i;:::-;62405:90;62308:187;62523:1;62509:16;;:2;:16;;;62505:183;;;62542:45;62579:7;62542:36;:45::i;:::-;62505:183;;;62615:4;62609:10;;:2;:10;;;62605:83;;62636:40;62664:2;62668:7;62636:27;:40::i;:::-;62605:83;62505:183;61946:749;61780:915;;;;:::o;24178:326::-;24238:4;24495:1;24473:7;:19;;;:23;24466:30;;24178:326;;;:::o;51532:942::-;51626:1;51612:16;;:2;:16;;;;51604:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;51685:16;51693:7;51685;:16::i;:::-;51684:17;51676:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;51747:48;51776:1;51780:2;51784:7;51793:1;51747:20;:48::i;:::-;51894:16;51902:7;51894;:16::i;:::-;51893:17;51885:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;52309:1;52292:9;:13;52302:2;52292:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;52353:2;52334:7;:16;52342:7;52334:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;52398:7;52394:2;52373:33;;52390:1;52373:33;;;;;;;;;;;;52419:47;52447:1;52451:2;52455:7;52464:1;52419:19;:47::i;:::-;51532:942;;:::o;58320:410::-;58510:1;58498:9;:13;58494:229;;;58548:1;58532:18;;:4;:18;;;58528:87;;58590:9;58571;:15;58581:4;58571:15;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;58528:87;58647:1;58633:16;;:2;:16;;;58629:83;;58687:9;58670;:13;58680:2;58670:13;;;;;;;;;;;;;;;;:26;;;;;;;:::i;:::-;;;;;;;;58629:83;58494:229;58320:410;;;;:::o;63418:164::-;63522:10;:17;;;;63495:15;:24;63511:7;63495:24;;;;;;;;;;;:44;;;;63550:10;63566:7;63550:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63418:164;:::o;64209:988::-;64475:22;64525:1;64500:22;64517:4;64500:16;:22::i;:::-;:26;;;;:::i;:::-;64475:51;;64537:18;64558:17;:26;64576:7;64558:26;;;;;;;;;;;;64537:47;;64705:14;64691:10;:28;64687:328;;64736:19;64758:12;:18;64771:4;64758:18;;;;;;;;;;;;;;;:34;64777:14;64758:34;;;;;;;;;;;;64736:56;;64842:11;64809:12;:18;64822:4;64809:18;;;;;;;;;;;;;;;:30;64828:10;64809:30;;;;;;;;;;;:44;;;;64959:10;64926:17;:30;64944:11;64926:30;;;;;;;;;;;:43;;;;64721:294;64687:328;65111:17;:26;65129:7;65111:26;;;;;;;;;;;65104:33;;;65155:12;:18;65168:4;65155:18;;;;;;;;;;;;;;;:34;65174:14;65155:34;;;;;;;;;;;65148:41;;;64290:907;;64209:988;;:::o;65492:1079::-;65745:22;65790:1;65770:10;:17;;;;:21;;;;:::i;:::-;65745:46;;65802:18;65823:15;:24;65839:7;65823:24;;;;;;;;;;;;65802:45;;66174:19;66196:10;66207:14;66196:26;;;;;;;;:::i;:::-;;;;;;;;;;66174:48;;66260:11;66235:10;66246;66235:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;66371:10;66340:15;:28;66356:11;66340:28;;;;;;;;;;;:41;;;;66512:15;:24;66528:7;66512:24;;;;;;;;;;;66505:31;;;66547:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;65563:1008;;;65492:1079;:::o;62996:221::-;63081:14;63098:20;63115:2;63098:16;:20::i;:::-;63081:37;;63156:7;63129:12;:16;63142:2;63129:16;;;;;;;;;;;;;;;:24;63146:6;63129:24;;;;;;;;;;;:34;;;;63203:6;63174:17;:26;63192:7;63174:26;;;;;;;;;;;:35;;;;63070:147;62996:221;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:619::-;5367:6;5375;5383;5432:2;5420:9;5411:7;5407:23;5403:32;5400:119;;;5438:79;;:::i;:::-;5400:119;5558:1;5583:53;5628:7;5619:6;5608:9;5604:22;5583:53;:::i;:::-;5573:63;;5529:117;5685:2;5711:53;5756:7;5747:6;5736:9;5732:22;5711:53;:::i;:::-;5701:63;;5656:118;5813:2;5839:53;5884:7;5875:6;5864:9;5860:22;5839:53;:::i;:::-;5829:63;;5784:118;5290:619;;;;;:::o;5915:329::-;5974:6;6023:2;6011:9;6002:7;5998:23;5994:32;5991:119;;;6029:79;;:::i;:::-;5991:119;6149:1;6174:53;6219:7;6210:6;6199:9;6195:22;6174:53;:::i;:::-;6164:63;;6120:117;5915:329;;;;:::o;6250:116::-;6320:21;6335:5;6320:21;:::i;:::-;6313:5;6310:32;6300:60;;6356:1;6353;6346:12;6300:60;6250:116;:::o;6372:133::-;6415:5;6453:6;6440:20;6431:29;;6469:30;6493:5;6469:30;:::i;:::-;6372:133;;;;:::o;6511:462::-;6573:6;6581;6630:2;6618:9;6609:7;6605:23;6601:32;6598:119;;;6636:79;;:::i;:::-;6598:119;6756:1;6781:50;6823:7;6814:6;6803:9;6799:22;6781:50;:::i;:::-;6771:60;;6727:114;6880:2;6906:50;6948:7;6939:6;6928:9;6924:22;6906:50;:::i;:::-;6896:60;;6851:115;6511:462;;;;;:::o;6979:117::-;7088:1;7085;7078:12;7102:117;7211:1;7208;7201:12;7225:117;7334:1;7331;7324:12;7365:568;7438:8;7448:6;7498:3;7491:4;7483:6;7479:17;7475:27;7465:122;;7506:79;;:::i;:::-;7465:122;7619:6;7606:20;7596:30;;7649:18;7641:6;7638:30;7635:117;;;7671:79;;:::i;:::-;7635:117;7785:4;7777:6;7773:17;7761:29;;7839:3;7831:4;7823:6;7819:17;7809:8;7805:32;7802:41;7799:128;;;7846:79;;:::i;:::-;7799:128;7365:568;;;;;:::o;7939:559::-;8025:6;8033;8082:2;8070:9;8061:7;8057:23;8053:32;8050:119;;;8088:79;;:::i;:::-;8050:119;8236:1;8225:9;8221:17;8208:31;8266:18;8258:6;8255:30;8252:117;;;8288:79;;:::i;:::-;8252:117;8401:80;8473:7;8464:6;8453:9;8449:22;8401:80;:::i;:::-;8383:98;;;;8179:312;7939:559;;;;;:::o;8504:117::-;8613:1;8610;8603:12;8627:180;8675:77;8672:1;8665:88;8772:4;8769:1;8762:15;8796:4;8793:1;8786:15;8813:281;8896:27;8918:4;8896:27;:::i;:::-;8888:6;8884:40;9026:6;9014:10;9011:22;8990:18;8978:10;8975:34;8972:62;8969:88;;;9037:18;;:::i;:::-;8969:88;9077:10;9073:2;9066:22;8856:238;8813:281;;:::o;9100:129::-;9134:6;9161:20;;:::i;:::-;9151:30;;9190:33;9218:4;9210:6;9190:33;:::i;:::-;9100:129;;;:::o;9235:308::-;9297:4;9387:18;9379:6;9376:30;9373:56;;;9409:18;;:::i;:::-;9373:56;9447:29;9469:6;9447:29;:::i;:::-;9439:37;;9531:4;9525;9521:15;9513:23;;9235:308;;;:::o;9549:154::-;9633:6;9628:3;9623;9610:30;9695:1;9686:6;9681:3;9677:16;9670:27;9549:154;;;:::o;9709:412::-;9787:5;9812:66;9828:49;9870:6;9828:49;:::i;:::-;9812:66;:::i;:::-;9803:75;;9901:6;9894:5;9887:21;9939:4;9932:5;9928:16;9977:3;9968:6;9963:3;9959:16;9956:25;9953:112;;;9984:79;;:::i;:::-;9953:112;10074:41;10108:6;10103:3;10098;10074:41;:::i;:::-;9793:328;9709:412;;;;;:::o;10141:340::-;10197:5;10246:3;10239:4;10231:6;10227:17;10223:27;10213:122;;10254:79;;:::i;:::-;10213:122;10371:6;10358:20;10396:79;10471:3;10463:6;10456:4;10448:6;10444:17;10396:79;:::i;:::-;10387:88;;10203:278;10141:340;;;;:::o;10487:509::-;10556:6;10605:2;10593:9;10584:7;10580:23;10576:32;10573:119;;;10611:79;;:::i;:::-;10573:119;10759:1;10748:9;10744:17;10731:31;10789:18;10781:6;10778:30;10775:117;;;10811:79;;:::i;:::-;10775:117;10916:63;10971:7;10962:6;10951:9;10947:22;10916:63;:::i;:::-;10906:73;;10702:287;10487:509;;;;:::o;11002:468::-;11067:6;11075;11124:2;11112:9;11103:7;11099:23;11095:32;11092:119;;;11130:79;;:::i;:::-;11092:119;11250:1;11275:53;11320:7;11311:6;11300:9;11296:22;11275:53;:::i;:::-;11265:63;;11221:117;11377:2;11403:50;11445:7;11436:6;11425:9;11421:22;11403:50;:::i;:::-;11393:60;;11348:115;11002:468;;;;;:::o;11476:307::-;11537:4;11627:18;11619:6;11616:30;11613:56;;;11649:18;;:::i;:::-;11613:56;11687:29;11709:6;11687:29;:::i;:::-;11679:37;;11771:4;11765;11761:15;11753:23;;11476:307;;;:::o;11789:410::-;11866:5;11891:65;11907:48;11948:6;11907:48;:::i;:::-;11891:65;:::i;:::-;11882:74;;11979:6;11972:5;11965:21;12017:4;12010:5;12006:16;12055:3;12046:6;12041:3;12037:16;12034:25;12031:112;;;12062:79;;:::i;:::-;12031:112;12152:41;12186:6;12181:3;12176;12152:41;:::i;:::-;11872:327;11789:410;;;;;:::o;12218:338::-;12273:5;12322:3;12315:4;12307:6;12303:17;12299:27;12289:122;;12330:79;;:::i;:::-;12289:122;12447:6;12434:20;12472:78;12546:3;12538:6;12531:4;12523:6;12519:17;12472:78;:::i;:::-;12463:87;;12279:277;12218:338;;;;:::o;12562:943::-;12657:6;12665;12673;12681;12730:3;12718:9;12709:7;12705:23;12701:33;12698:120;;;12737:79;;:::i;:::-;12698:120;12857:1;12882:53;12927:7;12918:6;12907:9;12903:22;12882:53;:::i;:::-;12872:63;;12828:117;12984:2;13010:53;13055:7;13046:6;13035:9;13031:22;13010:53;:::i;:::-;13000:63;;12955:118;13112:2;13138:53;13183:7;13174:6;13163:9;13159:22;13138:53;:::i;:::-;13128:63;;13083:118;13268:2;13257:9;13253:18;13240:32;13299:18;13291:6;13288:30;13285:117;;;13321:79;;:::i;:::-;13285:117;13426:62;13480:7;13471:6;13460:9;13456:22;13426:62;:::i;:::-;13416:72;;13211:287;12562:943;;;;;;;:::o;13511:474::-;13579:6;13587;13636:2;13624:9;13615:7;13611:23;13607:32;13604:119;;;13642:79;;:::i;:::-;13604:119;13762:1;13787:53;13832:7;13823:6;13812:9;13808:22;13787:53;:::i;:::-;13777:63;;13733:117;13889:2;13915:53;13960:7;13951:6;13940:9;13936:22;13915:53;:::i;:::-;13905:63;;13860:118;13511:474;;;;;:::o;13991:180::-;14039:77;14036:1;14029:88;14136:4;14133:1;14126:15;14160:4;14157:1;14150:15;14177:320;14221:6;14258:1;14252:4;14248:12;14238:22;;14305:1;14299:4;14295:12;14326:18;14316:81;;14382:4;14374:6;14370:17;14360:27;;14316:81;14444:2;14436:6;14433:14;14413:18;14410:38;14407:84;;;14463:18;;:::i;:::-;14407:84;14228:269;14177:320;;;:::o;14503:220::-;14643:34;14639:1;14631:6;14627:14;14620:58;14712:3;14707:2;14699:6;14695:15;14688:28;14503:220;:::o;14729:366::-;14871:3;14892:67;14956:2;14951:3;14892:67;:::i;:::-;14885:74;;14968:93;15057:3;14968:93;:::i;:::-;15086:2;15081:3;15077:12;15070:19;;14729:366;;;:::o;15101:419::-;15267:4;15305:2;15294:9;15290:18;15282:26;;15354:9;15348:4;15344:20;15340:1;15329:9;15325:17;15318:47;15382:131;15508:4;15382:131;:::i;:::-;15374:139;;15101:419;;;:::o;15526:248::-;15666:34;15662:1;15654:6;15650:14;15643:58;15735:31;15730:2;15722:6;15718:15;15711:56;15526:248;:::o;15780:366::-;15922:3;15943:67;16007:2;16002:3;15943:67;:::i;:::-;15936:74;;16019:93;16108:3;16019:93;:::i;:::-;16137:2;16132:3;16128:12;16121:19;;15780:366;;;:::o;16152:419::-;16318:4;16356:2;16345:9;16341:18;16333:26;;16405:9;16399:4;16395:20;16391:1;16380:9;16376:17;16369:47;16433:131;16559:4;16433:131;:::i;:::-;16425:139;;16152:419;;;:::o;16577:179::-;16717:31;16713:1;16705:6;16701:14;16694:55;16577:179;:::o;16762:366::-;16904:3;16925:67;16989:2;16984:3;16925:67;:::i;:::-;16918:74;;17001:93;17090:3;17001:93;:::i;:::-;17119:2;17114:3;17110:12;17103:19;;16762:366;;;:::o;17134:419::-;17300:4;17338:2;17327:9;17323:18;17315:26;;17387:9;17381:4;17377:20;17373:1;17362:9;17358:17;17351:47;17415:131;17541:4;17415:131;:::i;:::-;17407:139;;17134:419;;;:::o;17559:177::-;17699:29;17695:1;17687:6;17683:14;17676:53;17559:177;:::o;17742:366::-;17884:3;17905:67;17969:2;17964:3;17905:67;:::i;:::-;17898:74;;17981:93;18070:3;17981:93;:::i;:::-;18099:2;18094:3;18090:12;18083:19;;17742:366;;;:::o;18114:419::-;18280:4;18318:2;18307:9;18303:18;18295:26;;18367:9;18361:4;18357:20;18353:1;18342:9;18338:17;18331:47;18395:131;18521:4;18395:131;:::i;:::-;18387:139;;18114:419;;;:::o;18539:224::-;18679:34;18675:1;18667:6;18663:14;18656:58;18748:7;18743:2;18735:6;18731:15;18724:32;18539:224;:::o;18769:366::-;18911:3;18932:67;18996:2;18991:3;18932:67;:::i;:::-;18925:74;;19008:93;19097:3;19008:93;:::i;:::-;19126:2;19121:3;19117:12;19110:19;;18769:366;;;:::o;19141:419::-;19307:4;19345:2;19334:9;19330:18;19322:26;;19394:9;19388:4;19384:20;19380:1;19369:9;19365:17;19358:47;19422:131;19548:4;19422:131;:::i;:::-;19414:139;;19141:419;;;:::o;19566:181::-;19706:33;19702:1;19694:6;19690:14;19683:57;19566:181;:::o;19753:366::-;19895:3;19916:67;19980:2;19975:3;19916:67;:::i;:::-;19909:74;;19992:93;20081:3;19992:93;:::i;:::-;20110:2;20105:3;20101:12;20094:19;;19753:366;;;:::o;20125:419::-;20291:4;20329:2;20318:9;20314:18;20306:26;;20378:9;20372:4;20368:20;20364:1;20353:9;20349:17;20342:47;20406:131;20532:4;20406:131;:::i;:::-;20398:139;;20125:419;;;:::o;20550:232::-;20690:34;20686:1;20678:6;20674:14;20667:58;20759:15;20754:2;20746:6;20742:15;20735:40;20550:232;:::o;20788:366::-;20930:3;20951:67;21015:2;21010:3;20951:67;:::i;:::-;20944:74;;21027:93;21116:3;21027:93;:::i;:::-;21145:2;21140:3;21136:12;21129:19;;20788:366;;;:::o;21160:419::-;21326:4;21364:2;21353:9;21349:18;21341:26;;21413:9;21407:4;21403:20;21399:1;21388:9;21384:17;21377:47;21441:131;21567:4;21441:131;:::i;:::-;21433:139;;21160:419;;;:::o;21585:223::-;21725:34;21721:1;21713:6;21709:14;21702:58;21794:6;21789:2;21781:6;21777:15;21770:31;21585:223;:::o;21814:366::-;21956:3;21977:67;22041:2;22036:3;21977:67;:::i;:::-;21970:74;;22053:93;22142:3;22053:93;:::i;:::-;22171:2;22166:3;22162:12;22155:19;;21814:366;;;:::o;22186:419::-;22352:4;22390:2;22379:9;22375:18;22367:26;;22439:9;22433:4;22429:20;22425:1;22414:9;22410:17;22403:47;22467:131;22593:4;22467:131;:::i;:::-;22459:139;;22186:419;;;:::o;22611:230::-;22751:34;22747:1;22739:6;22735:14;22728:58;22820:13;22815:2;22807:6;22803:15;22796:38;22611:230;:::o;22847:366::-;22989:3;23010:67;23074:2;23069:3;23010:67;:::i;:::-;23003:74;;23086:93;23175:3;23086:93;:::i;:::-;23204:2;23199:3;23195:12;23188:19;;22847:366;;;:::o;23219:419::-;23385:4;23423:2;23412:9;23408:18;23400:26;;23472:9;23466:4;23462:20;23458:1;23447:9;23443:17;23436:47;23500:131;23626:4;23500:131;:::i;:::-;23492:139;;23219:419;;;:::o;23644:231::-;23784:34;23780:1;23772:6;23768:14;23761:58;23853:14;23848:2;23840:6;23836:15;23829:39;23644:231;:::o;23881:366::-;24023:3;24044:67;24108:2;24103:3;24044:67;:::i;:::-;24037:74;;24120:93;24209:3;24120:93;:::i;:::-;24238:2;24233:3;24229:12;24222:19;;23881:366;;;:::o;24253:419::-;24419:4;24457:2;24446:9;24442:18;24434:26;;24506:9;24500:4;24496:20;24492:1;24481:9;24477:17;24470:47;24534:131;24660:4;24534:131;:::i;:::-;24526:139;;24253:419;;;:::o;24678:180::-;24726:77;24723:1;24716:88;24823:4;24820:1;24813:15;24847:4;24844:1;24837:15;24864:174;25004:26;25000:1;24992:6;24988:14;24981:50;24864:174;:::o;25044:366::-;25186:3;25207:67;25271:2;25266:3;25207:67;:::i;:::-;25200:74;;25283:93;25372:3;25283:93;:::i;:::-;25401:2;25396:3;25392:12;25385:19;;25044:366;;;:::o;25416:419::-;25582:4;25620:2;25609:9;25605:18;25597:26;;25669:9;25663:4;25659:20;25655:1;25644:9;25640:17;25633:47;25697:131;25823:4;25697:131;:::i;:::-;25689:139;;25416:419;;;:::o;25841:180::-;25889:77;25886:1;25879:88;25986:4;25983:1;25976:15;26010:4;26007:1;26000:15;26027:233;26066:3;26089:24;26107:5;26089:24;:::i;:::-;26080:33;;26135:66;26128:5;26125:77;26122:103;;;26205:18;;:::i;:::-;26122:103;26252:1;26245:5;26241:13;26234:20;;26027:233;;;:::o;26266:228::-;26406:34;26402:1;26394:6;26390:14;26383:58;26475:11;26470:2;26462:6;26458:15;26451:36;26266:228;:::o;26500:366::-;26642:3;26663:67;26727:2;26722:3;26663:67;:::i;:::-;26656:74;;26739:93;26828:3;26739:93;:::i;:::-;26857:2;26852:3;26848:12;26841:19;;26500:366;;;:::o;26872:419::-;27038:4;27076:2;27065:9;27061:18;27053:26;;27125:9;27119:4;27115:20;27111:1;27100:9;27096:17;27089:47;27153:131;27279:4;27153:131;:::i;:::-;27145:139;;26872:419;;;:::o;27297:148::-;27399:11;27436:3;27421:18;;27297:148;;;;:::o;27451:377::-;27557:3;27585:39;27618:5;27585:39;:::i;:::-;27640:89;27722:6;27717:3;27640:89;:::i;:::-;27633:96;;27738:52;27783:6;27778:3;27771:4;27764:5;27760:16;27738:52;:::i;:::-;27815:6;27810:3;27806:16;27799:23;;27561:267;27451:377;;;;:::o;27834:435::-;28014:3;28036:95;28127:3;28118:6;28036:95;:::i;:::-;28029:102;;28148:95;28239:3;28230:6;28148:95;:::i;:::-;28141:102;;28260:3;28253:10;;27834:435;;;;;:::o;28275:225::-;28415:34;28411:1;28403:6;28399:14;28392:58;28484:8;28479:2;28471:6;28467:15;28460:33;28275:225;:::o;28506:366::-;28648:3;28669:67;28733:2;28728:3;28669:67;:::i;:::-;28662:74;;28745:93;28834:3;28745:93;:::i;:::-;28863:2;28858:3;28854:12;28847:19;;28506:366;;;:::o;28878:419::-;29044:4;29082:2;29071:9;29067:18;29059:26;;29131:9;29125:4;29121:20;29117:1;29106:9;29102:17;29095:47;29159:131;29285:4;29159:131;:::i;:::-;29151:139;;28878:419;;;:::o;29303:169::-;29443:21;29439:1;29431:6;29427:14;29420:45;29303:169;:::o;29478:366::-;29620:3;29641:67;29705:2;29700:3;29641:67;:::i;:::-;29634:74;;29717:93;29806:3;29717:93;:::i;:::-;29835:2;29830:3;29826:12;29819:19;;29478:366;;;:::o;29850:419::-;30016:4;30054:2;30043:9;30039:18;30031:26;;30103:9;30097:4;30093:20;30089:1;30078:9;30074:17;30067:47;30131:131;30257:4;30131:131;:::i;:::-;30123:139;;29850:419;;;:::o;30275:224::-;30415:34;30411:1;30403:6;30399:14;30392:58;30484:7;30479:2;30471:6;30467:15;30460:32;30275:224;:::o;30505:366::-;30647:3;30668:67;30732:2;30727:3;30668:67;:::i;:::-;30661:74;;30744:93;30833:3;30744:93;:::i;:::-;30862:2;30857:3;30853:12;30846:19;;30505:366;;;:::o;30877:419::-;31043:4;31081:2;31070:9;31066:18;31058:26;;31130:9;31124:4;31120:20;31116:1;31105:9;31101:17;31094:47;31158:131;31284:4;31158:131;:::i;:::-;31150:139;;30877:419;;;:::o;31302:223::-;31442:34;31438:1;31430:6;31426:14;31419:58;31511:6;31506:2;31498:6;31494:15;31487:31;31302:223;:::o;31531:366::-;31673:3;31694:67;31758:2;31753:3;31694:67;:::i;:::-;31687:74;;31770:93;31859:3;31770:93;:::i;:::-;31888:2;31883:3;31879:12;31872:19;;31531:366;;;:::o;31903:419::-;32069:4;32107:2;32096:9;32092:18;32084:26;;32156:9;32150:4;32146:20;32142:1;32131:9;32127:17;32120:47;32184:131;32310:4;32184:131;:::i;:::-;32176:139;;31903:419;;;:::o;32328:182::-;32468:34;32464:1;32456:6;32452:14;32445:58;32328:182;:::o;32516:366::-;32658:3;32679:67;32743:2;32738:3;32679:67;:::i;:::-;32672:74;;32755:93;32844:3;32755:93;:::i;:::-;32873:2;32868:3;32864:12;32857:19;;32516:366;;;:::o;32888:419::-;33054:4;33092:2;33081:9;33077:18;33069:26;;33141:9;33135:4;33131:20;33127:1;33116:9;33112:17;33105:47;33169:131;33295:4;33169:131;:::i;:::-;33161:139;;32888:419;;;:::o;33313:175::-;33453:27;33449:1;33441:6;33437:14;33430:51;33313:175;:::o;33494:366::-;33636:3;33657:67;33721:2;33716:3;33657:67;:::i;:::-;33650:74;;33733:93;33822:3;33733:93;:::i;:::-;33851:2;33846:3;33842:12;33835:19;;33494:366;;;:::o;33866:419::-;34032:4;34070:2;34059:9;34055:18;34047:26;;34119:9;34113:4;34109:20;34105:1;34094:9;34090:17;34083:47;34147:131;34273:4;34147:131;:::i;:::-;34139:139;;33866:419;;;:::o;34291:237::-;34431:34;34427:1;34419:6;34415:14;34408:58;34500:20;34495:2;34487:6;34483:15;34476:45;34291:237;:::o;34534:366::-;34676:3;34697:67;34761:2;34756:3;34697:67;:::i;:::-;34690:74;;34773:93;34862:3;34773:93;:::i;:::-;34891:2;34886:3;34882:12;34875:19;;34534:366;;;:::o;34906:419::-;35072:4;35110:2;35099:9;35095:18;35087:26;;35159:9;35153:4;35149:20;35145:1;35134:9;35130:17;35123:47;35187:131;35313:4;35187:131;:::i;:::-;35179:139;;34906:419;;;:::o;35331:180::-;35379:77;35376:1;35369:88;35476:4;35473:1;35466:15;35500:4;35497:1;35490:15;35517:170;35657:22;35653:1;35645:6;35641:14;35634:46;35517:170;:::o;35693:366::-;35835:3;35856:67;35920:2;35915:3;35856:67;:::i;:::-;35849:74;;35932:93;36021:3;35932:93;:::i;:::-;36050:2;36045:3;36041:12;36034:19;;35693:366;;;:::o;36065:419::-;36231:4;36269:2;36258:9;36254:18;36246:26;;36318:9;36312:4;36308:20;36304:1;36293:9;36289:17;36282:47;36346:131;36472:4;36346:131;:::i;:::-;36338:139;;36065:419;;;:::o;36490:166::-;36630:18;36626:1;36618:6;36614:14;36607:42;36490:166;:::o;36662:366::-;36804:3;36825:67;36889:2;36884:3;36825:67;:::i;:::-;36818:74;;36901:93;36990:3;36901:93;:::i;:::-;37019:2;37014:3;37010:12;37003:19;;36662:366;;;:::o;37034:419::-;37200:4;37238:2;37227:9;37223:18;37215:26;;37287:9;37281:4;37277:20;37273:1;37262:9;37258:17;37251:47;37315:131;37441:4;37315:131;:::i;:::-;37307:139;;37034:419;;;:::o;37459:98::-;37510:6;37544:5;37538:12;37528:22;;37459:98;;;:::o;37563:168::-;37646:11;37680:6;37675:3;37668:19;37720:4;37715:3;37711:14;37696:29;;37563:168;;;;:::o;37737:360::-;37823:3;37851:38;37883:5;37851:38;:::i;:::-;37905:70;37968:6;37963:3;37905:70;:::i;:::-;37898:77;;37984:52;38029:6;38024:3;38017:4;38010:5;38006:16;37984:52;:::i;:::-;38061:29;38083:6;38061:29;:::i;:::-;38056:3;38052:39;38045:46;;37827:270;37737:360;;;;:::o;38103:640::-;38298:4;38336:3;38325:9;38321:19;38313:27;;38350:71;38418:1;38407:9;38403:17;38394:6;38350:71;:::i;:::-;38431:72;38499:2;38488:9;38484:18;38475:6;38431:72;:::i;:::-;38513;38581:2;38570:9;38566:18;38557:6;38513:72;:::i;:::-;38632:9;38626:4;38622:20;38617:2;38606:9;38602:18;38595:48;38660:76;38731:4;38722:6;38660:76;:::i;:::-;38652:84;;38103:640;;;;;;;:::o;38749:141::-;38805:5;38836:6;38830:13;38821:22;;38852:32;38878:5;38852:32;:::i;:::-;38749:141;;;;:::o;38896:349::-;38965:6;39014:2;39002:9;38993:7;38989:23;38985:32;38982:119;;;39020:79;;:::i;:::-;38982:119;39140:1;39165:63;39220:7;39211:6;39200:9;39196:22;39165:63;:::i;:::-;39155:73;;39111:127;38896:349;;;;:::o;39251:240::-;39391:34;39387:1;39379:6;39375:14;39368:58;39460:23;39455:2;39447:6;39443:15;39436:48;39251:240;:::o;39497:366::-;39639:3;39660:67;39724:2;39719:3;39660:67;:::i;:::-;39653:74;;39736:93;39825:3;39736:93;:::i;:::-;39854:2;39849:3;39845:12;39838:19;;39497:366;;;:::o;39869:419::-;40035:4;40073:2;40062:9;40058:18;40050:26;;40122:9;40116:4;40112:20;40108:1;40097:9;40093:17;40086:47;40150:131;40276:4;40150:131;:::i;:::-;40142:139;;39869:419;;;:::o;40294:182::-;40434:34;40430:1;40422:6;40418:14;40411:58;40294:182;:::o;40482:366::-;40624:3;40645:67;40709:2;40704:3;40645:67;:::i;:::-;40638:74;;40721:93;40810:3;40721:93;:::i;:::-;40839:2;40834:3;40830:12;40823:19;;40482:366;;;:::o;40854:419::-;41020:4;41058:2;41047:9;41043:18;41035:26;;41107:9;41101:4;41097:20;41093:1;41082:9;41078:17;41071:47;41135:131;41261:4;41135:131;:::i;:::-;41127:139;;40854:419;;;:::o;41279:178::-;41419:30;41415:1;41407:6;41403:14;41396:54;41279:178;:::o;41463:366::-;41605:3;41626:67;41690:2;41685:3;41626:67;:::i;:::-;41619:74;;41702:93;41791:3;41702:93;:::i;:::-;41820:2;41815:3;41811:12;41804:19;;41463:366;;;:::o;41835:419::-;42001:4;42039:2;42028:9;42024:18;42016:26;;42088:9;42082:4;42078:20;42074:1;42063:9;42059:17;42052:47;42116:131;42242:4;42116:131;:::i;:::-;42108:139;;41835:419;;;:::o;42260:191::-;42300:4;42320:20;42338:1;42320:20;:::i;:::-;42315:25;;42354:20;42372:1;42354:20;:::i;:::-;42349:25;;42393:1;42390;42387:8;42384:34;;;42398:18;;:::i;:::-;42384:34;42443:1;42440;42436:9;42428:17;;42260:191;;;;:::o;42457:305::-;42497:3;42516:20;42534:1;42516:20;:::i;:::-;42511:25;;42550:20;42568:1;42550:20;:::i;:::-;42545:25;;42704:1;42636:66;42632:74;42629:1;42626:81;42623:107;;;42710:18;;:::i;:::-;42623:107;42754:1;42751;42747:9;42740:16;;42457:305;;;;:::o;42768:180::-;42816:77;42813:1;42806:88;42913:4;42910:1;42903:15;42937:4;42934:1;42927:15
Swarm Source
ipfs://837fa68180ac740c3197a11bd5f4ece77dd4e8d62507ab2b2fbb87ed3578c094
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.