ERC-1155
Overview
Max Total Supply
612
Holders
151
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
SkulSerum
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-01-26 */ // 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/cryptography/ECDSA.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/ECDSA.sol) pragma solidity ^0.8.0; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS, InvalidSignatureV // Deprecated in v4.8 } function _throwError(RecoverError error) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert("ECDSA: invalid signature"); } else if (error == RecoverError.InvalidSignatureLength) { revert("ECDSA: invalid signature length"); } else if (error == RecoverError.InvalidSignatureS) { revert("ECDSA: invalid signature 's' value"); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature` or error string. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. /// @solidity memory-safe-assembly assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return tryRecover(hash, v, r, s); } else { return (address(0), RecoverError.InvalidSignatureLength); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, signature); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] * * _Available since v4.3._ */ function tryRecover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address, RecoverError) { bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff); uint8 v = uint8((uint256(vs) >> 255) + 27); return tryRecover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately. * * _Available since v4.2._ */ function recover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, r, vs); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `v`, * `r` and `s` signature fields separately. * * _Available since v4.3._ */ function tryRecover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address, RecoverError) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return (address(0), RecoverError.InvalidSignatureS); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); if (signer == address(0)) { return (address(0), RecoverError.InvalidSignature); } return (signer, RecoverError.NoError); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, v, r, s); _throwError(error); return recovered; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } /** * @dev Returns an Ethereum Signed Message, created from `s`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); } } // File: @openzeppelin/contracts/security/ReentrancyGuard.sol // OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be _NOT_ENTERED require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File: @openzeppelin/contracts/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/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/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: contracts/lib/signed.sol pragma solidity ^0.8.0; contract Signed is Ownable { using Strings for uint256; using ECDSA for bytes32; string private _secret; address private _signer; function setSecret(string calldata secret) external onlyOwner { _secret = secret; } function setSigner(address signer) external onlyOwner { _signer = signer; } function createHash(uint256 nftId, uint256 serumId) internal view returns (bytes32) { return keccak256( abi.encode(address(this), msg.sender, nftId, serumId, _secret) ); } function getSigner(bytes32 hash, bytes memory signature) internal pure returns (address) { return hash.toEthSignedMessageHash().recover(signature); } function isAuthorizedSigner(address extracted) internal view virtual returns (bool) { return extracted == _signer; } function verifySignature( bytes calldata signature, uint256 nftId, uint256 serumId ) internal view { address extracted = getSigner(createHash(nftId, serumId), signature); require(isAuthorizedSigner(extracted), "Signature verification failed"); } } // 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/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/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/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/ERC1155/IERC1155Receiver.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol) pragma solidity ^0.8.0; /** * @dev _Available since v3.1._ */ interface IERC1155Receiver is IERC165 { /** * @dev Handles the receipt of a single ERC1155 token type. This function is * called at the end of a `safeTransferFrom` after the balance has been updated. * * NOTE: To accept the transfer, this must return * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` * (i.e. 0xf23a6e61, or its own function selector). * * @param operator The address which initiated the transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param id The ID of the token being transferred * @param value The amount of tokens being transferred * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed */ function onERC1155Received( address operator, address from, uint256 id, uint256 value, bytes calldata data ) external returns (bytes4); /** * @dev Handles the receipt of a multiple ERC1155 token types. This function * is called at the end of a `safeBatchTransferFrom` after the balances have * been updated. * * NOTE: To accept the transfer(s), this must return * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` * (i.e. 0xbc197c81, or its own function selector). * * @param operator The address which initiated the batch transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param ids An array containing ids of each token being transferred (order and length must match values array) * @param values An array containing amounts of each token being transferred (order and length must match ids array) * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed */ function onERC1155BatchReceived( address operator, address from, uint256[] calldata ids, uint256[] calldata values, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/token/ERC1155/IERC1155.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC1155/IERC1155.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC1155 compliant contract, as defined in the * https://eips.ethereum.org/EIPS/eip-1155[EIP]. * * _Available since v3.1._ */ interface IERC1155 is IERC165 { /** * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`. */ event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value); /** * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all * transfers. */ event TransferBatch( address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values ); /** * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to * `approved`. */ event ApprovalForAll(address indexed account, address indexed operator, bool approved); /** * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI. * * If an {URI} event was emitted for `id`, the standard * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value * returned by {IERC1155MetadataURI-uri}. */ event URI(string value, uint256 indexed id); /** * @dev Returns the amount of tokens of token type `id` owned by `account`. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) external view returns (uint256); /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) external view returns (uint256[] memory); /** * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`, * * Emits an {ApprovalForAll} event. * * Requirements: * * - `operator` cannot be the caller. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns true if `operator` is approved to transfer ``account``'s tokens. * * See {setApprovalForAll}. */ function isApprovedForAll(address account, address operator) external view returns (bool); /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If the caller is not `from`, it must have been approved to spend ``from``'s tokens via {setApprovalForAll}. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes calldata data ) external; /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function safeBatchTransferFrom( address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data ) external; } // File: @openzeppelin/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol // OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol) pragma solidity ^0.8.0; /** * @dev Interface of the optional ERC1155MetadataExtension interface, as defined * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP]. * * _Available since v3.1._ */ interface IERC1155MetadataURI is IERC1155 { /** * @dev Returns the URI for token type `id`. * * If the `\{id\}` substring is present in the URI, it must be replaced by * clients with the actual token type ID. */ function uri(uint256 id) external view returns (string memory); } // File: @openzeppelin/contracts/token/ERC1155/ERC1155.sol // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC1155/ERC1155.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the basic standard multi-token. * See https://eips.ethereum.org/EIPS/eip-1155 * Originally based on code by Enjin: https://github.com/enjin/erc-1155 * * _Available since v3.1._ */ contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI { using Address for address; // Mapping from token ID to account balances mapping(uint256 => mapping(address => uint256)) private _balances; // Mapping from account to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json string private _uri; /** * @dev See {_setURI}. */ constructor(string memory uri_) { _setURI(uri_); } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC1155).interfaceId || interfaceId == type(IERC1155MetadataURI).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC1155MetadataURI-uri}. * * This implementation returns the same URI for *all* token types. It relies * on the token type ID substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * Clients calling this function must replace the `\{id\}` substring with the * actual token type ID. */ function uri(uint256) public view virtual override returns (string memory) { return _uri; } /** * @dev See {IERC1155-balanceOf}. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) public view virtual override returns (uint256) { require(account != address(0), "ERC1155: address zero is not a valid owner"); return _balances[id][account]; } /** * @dev See {IERC1155-balanceOfBatch}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] memory accounts, uint256[] memory ids) public view virtual override returns (uint256[] memory) { require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch"); uint256[] memory batchBalances = new uint256[](accounts.length); for (uint256 i = 0; i < accounts.length; ++i) { batchBalances[i] = balanceOf(accounts[i], ids[i]); } return batchBalances; } /** * @dev See {IERC1155-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC1155-isApprovedForAll}. */ function isApprovedForAll(address account, address operator) public view virtual override returns (bool) { return _operatorApprovals[account][operator]; } /** * @dev See {IERC1155-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) public virtual override { require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: caller is not token owner or approved" ); _safeTransferFrom(from, to, id, amount, data); } /** * @dev See {IERC1155-safeBatchTransferFrom}. */ function safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) public virtual override { require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: caller is not token owner or approved" ); _safeBatchTransferFrom(from, to, ids, amounts, data); } /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: transfer to the zero address"); address operator = _msgSender(); uint256[] memory ids = _asSingletonArray(id); uint256[] memory amounts = _asSingletonArray(amount); _beforeTokenTransfer(operator, from, to, ids, amounts, data); uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); unchecked { _balances[id][from] = fromBalance - amount; } _balances[id][to] += amount; emit TransferSingle(operator, from, to, id, amount); _afterTokenTransfer(operator, from, to, ids, amounts, data); _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function _safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); require(to != address(0), "ERC1155: transfer to the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, to, ids, amounts, data); for (uint256 i = 0; i < ids.length; ++i) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); unchecked { _balances[id][from] = fromBalance - amount; } _balances[id][to] += amount; } emit TransferBatch(operator, from, to, ids, amounts); _afterTokenTransfer(operator, from, to, ids, amounts, data); _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data); } /** * @dev Sets a new URI for all token types, by relying on the token type ID * substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * By this mechanism, any occurrence of the `\{id\}` substring in either the * URI or any of the amounts in the JSON file at said URI will be replaced by * clients with the token type ID. * * For example, the `https://token-cdn-domain/\{id\}.json` URI would be * interpreted by clients as * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json` * for token type ID 0x4cce0. * * See {uri}. * * Because these URIs cannot be meaningfully represented by the {URI} event, * this function emits no events. */ function _setURI(string memory newuri) internal virtual { _uri = newuri; } /** * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _mint( address to, uint256 id, uint256 amount, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: mint to the zero address"); address operator = _msgSender(); uint256[] memory ids = _asSingletonArray(id); uint256[] memory amounts = _asSingletonArray(amount); _beforeTokenTransfer(operator, address(0), to, ids, amounts, data); _balances[id][to] += amount; emit TransferSingle(operator, address(0), to, id, amount); _afterTokenTransfer(operator, address(0), to, ids, amounts, data); _doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function _mintBatch( address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: mint to the zero address"); require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); address operator = _msgSender(); _beforeTokenTransfer(operator, address(0), to, ids, amounts, data); for (uint256 i = 0; i < ids.length; i++) { _balances[ids[i]][to] += amounts[i]; } emit TransferBatch(operator, address(0), to, ids, amounts); _afterTokenTransfer(operator, address(0), to, ids, amounts, data); _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data); } /** * @dev Destroys `amount` tokens of token type `id` from `from` * * Emits a {TransferSingle} event. * * Requirements: * * - `from` cannot be the zero address. * - `from` must have at least `amount` tokens of token type `id`. */ function _burn( address from, uint256 id, uint256 amount ) internal virtual { require(from != address(0), "ERC1155: burn from the zero address"); address operator = _msgSender(); uint256[] memory ids = _asSingletonArray(id); uint256[] memory amounts = _asSingletonArray(amount); _beforeTokenTransfer(operator, from, address(0), ids, amounts, ""); uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: burn amount exceeds balance"); unchecked { _balances[id][from] = fromBalance - amount; } emit TransferSingle(operator, from, address(0), id, amount); _afterTokenTransfer(operator, from, address(0), ids, amounts, ""); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. */ function _burnBatch( address from, uint256[] memory ids, uint256[] memory amounts ) internal virtual { require(from != address(0), "ERC1155: burn from the zero address"); require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, address(0), ids, amounts, ""); for (uint256 i = 0; i < ids.length; i++) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: burn amount exceeds balance"); unchecked { _balances[id][from] = fromBalance - amount; } } emit TransferBatch(operator, from, address(0), ids, amounts); _afterTokenTransfer(operator, from, address(0), ids, amounts, ""); } /** * @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, "ERC1155: setting approval status for self"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Hook that is called before any token transfer. This includes minting * and burning, as well as batched variants. * * The same hook is called on both single and batched variants. For single * transfers, the length of the `ids` and `amounts` arrays will be 1. * * Calling conditions (for each `id` and `amount` pair): * * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens * of token type `id` will be transferred to `to`. * - When `from` is zero, `amount` tokens of token type `id` will be minted * for `to`. * - when `to` is zero, `amount` of ``from``'s tokens of token type `id` * will be burned. * - `from` and `to` are never both zero. * - `ids` and `amounts` have the same, non-zero length. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual {} /** * @dev Hook that is called after any token transfer. This includes minting * and burning, as well as batched variants. * * The same hook is called on both single and batched variants. For single * transfers, the length of the `id` and `amount` arrays will be 1. * * Calling conditions (for each `id` and `amount` pair): * * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens * of token type `id` will be transferred to `to`. * - When `from` is zero, `amount` tokens of token type `id` will be minted * for `to`. * - when `to` is zero, `amount` of ``from``'s tokens of token type `id` * will be burned. * - `from` and `to` are never both zero. * - `ids` and `amounts` have the same, non-zero length. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual {} function _doSafeTransferAcceptanceCheck( address operator, address from, address to, uint256 id, uint256 amount, bytes memory data ) private { if (to.isContract()) { try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) { if (response != IERC1155Receiver.onERC1155Received.selector) { revert("ERC1155: ERC1155Receiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non-ERC1155Receiver implementer"); } } } function _doSafeBatchTransferAcceptanceCheck( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) private { if (to.isContract()) { try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns ( bytes4 response ) { if (response != IERC1155Receiver.onERC1155BatchReceived.selector) { revert("ERC1155: ERC1155Receiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non-ERC1155Receiver implementer"); } } } function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) { uint256[] memory array = new uint256[](1); array[0] = element; return array; } } // File: contracts/SkullSerum.sol pragma solidity ^0.8.4; contract SkulSerum is ERC1155, Ownable, Signed, Pausable, ReentrancyGuard { using Strings for uint256; IERC721 public skulNFT; string public baseURI; constructor(address _skulNFT) ERC1155("") { setSkulNFT(_skulNFT); } function pause() public onlyOwner { _pause(); } function unpause() public onlyOwner { _unpause(); } mapping(uint256 => bool) alreadyClaim; mapping(uint256 => bool) alreadyEvade; mapping(uint256 => address) stakerAddress; function setURI(string memory newuri) public onlyOwner { baseURI = newuri; } function setSkulNFT(address _skulNFT) public onlyOwner { skulNFT = IERC721(_skulNFT); } function stakeSkul(uint256[] calldata nftIds) public whenNotPaused nonReentrant { for (uint256 i; i < nftIds.length; i++) { require( skulNFT.ownerOf(nftIds[i]) == msg.sender, "Can't stake tokens you don't own!" ); require( alreadyEvade[nftIds[i]] == false, "Skul NFT already evaded" ); skulNFT.transferFrom(msg.sender, address(this), nftIds[i]); stakerAddress[nftIds[i]] = msg.sender; alreadyEvade[nftIds[i]] = true; } } function claim( uint256[] calldata nftIds, bytes[] calldata signatures, uint256[] calldata serumIds ) public nonReentrant whenNotPaused { require( nftIds.length <= 5 && signatures.length <= 5 && serumIds.length <= 5, "Can't claim more than 5" ); require( nftIds.length == signatures.length && nftIds.length == serumIds.length, "Input array length must be same" ); for (uint256 i; i < nftIds.length; i++) { require( alreadyClaim[nftIds[i]] == false, "Skul NFT Already used for claim" ); require( stakerAddress[nftIds[i]] == msg.sender, "Skul NFT not staked / Not Staker" ); verifySignature(signatures[i], nftIds[i], serumIds[i]); skulNFT.transferFrom(address(this), msg.sender, nftIds[i]); alreadyClaim[nftIds[i]] = true; _mint(msg.sender, serumIds[i], 1, ""); } } function _beforeTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal override whenNotPaused { super._beforeTokenTransfer(operator, from, to, ids, amounts, data); } function uri(uint256 tokenId) public view virtual override returns (string memory) { return string(abi.encodePacked(baseURI, tokenId.toString())); } function burnStakedSkul(uint256[] calldata nftIds) external onlyOwner { for (uint256 i; i < nftIds.length; i++) { skulNFT.transferFrom( address(this), address(0x00000dead), nftIds[i] ); } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_skulNFT","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","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":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","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":"uint256[]","name":"nftIds","type":"uint256[]"}],"name":"burnStakedSkul","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"nftIds","type":"uint256[]"},{"internalType":"bytes[]","name":"signatures","type":"bytes[]"},{"internalType":"uint256[]","name":"serumIds","type":"uint256[]"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","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":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"secret","type":"string"}],"name":"setSecret","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"signer","type":"address"}],"name":"setSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_skulNFT","type":"address"}],"name":"setSkulNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newuri","type":"string"}],"name":"setURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"skulNFT","outputs":[{"internalType":"contract IERC721","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"nftIds","type":"uint256[]"}],"name":"stakeSkul","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":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b506040516200526f3803806200526f833981810160405281019062000037919062000374565b604051806020016040528060008152506200005881620000b460201b60201c565b50620000796200006d620000d060201b60201c565b620000d860201b60201c565b6000600560146101000a81548160ff0219169083151502179055506001600681905550620000ad816200019e60201b60201c565b50620004e1565b8060029080519060200190620000cc929190620002ad565b5050565b600033905090565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620001ae620001f260201b60201c565b80600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b62000202620000d060201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620002286200028360201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000281576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200027890620003cd565b60405180910390fd5b565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620002bb9062000434565b90600052602060002090601f016020900481019282620002df57600085556200032b565b82601f10620002fa57805160ff19168380011785556200032b565b828001600101855582156200032b579182015b828111156200032a5782518255916020019190600101906200030d565b5b5090506200033a91906200033e565b5090565b5b80821115620003595760008160009055506001016200033f565b5090565b6000815190506200036e81620004c7565b92915050565b6000602082840312156200038d576200038c62000499565b5b60006200039d848285016200035d565b91505092915050565b6000620003b5602083620003ef565b9150620003c2826200049e565b602082019050919050565b60006020820190508181036000830152620003e881620003a6565b9050919050565b600082825260208201905092915050565b60006200040d8262000414565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600060028204905060018216806200044d57607f821691505b602082108114156200046457620004636200046a565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600080fd5b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b620004d28162000400565b8114620004de57600080fd5b50565b614d7e80620004f16000396000f3fe608060405234801561001057600080fd5b506004361061014c5760003560e01c80636c0360eb116100c3578063a22cb4651161007c578063a22cb4651461034f578063d0f736b91461036b578063e18d90d014610387578063e985e9c5146103a3578063f242432a146103d3578063f2fde38b146103ef5761014c565b80636c0360eb146102c75780636c19e783146102e5578063715018a6146103015780637ed6c9261461030b5780638456cb59146103275780638da5cb5b146103315761014c565b80633f4ba83a116101155780633f4ba83a14610219578063419462f6146102235780634a7b6b1f1461023f5780634e1273f41461025d5780634f36ccf31461028d5780635c975abb146102a95761014c565b8062fdd58e1461015157806301ffc9a71461018157806302fe5305146101b15780630e89341c146101cd5780632eb2c2d6146101fd575b600080fd5b61016b600480360381019061016691906131c7565b61040b565b6040516101789190614091565b60405180910390f35b61019b60048036038101906101969190613380565b6104d4565b6040516101a89190613cd4565b60405180910390f35b6101cb60048036038101906101c69190613427565b6105b6565b005b6101e760048036038101906101e29190613470565b6105d8565b6040516101f49190613d4f565b60405180910390f35b61021760048036038101906102129190613021565b61060c565b005b6102216106ad565b005b61023d6004803603810190610238919061327f565b6106bf565b005b610247610799565b6040516102549190613d34565b60405180910390f35b61027760048036038101906102729190613207565b6107bf565b6040516102849190613c7b565b60405180910390f35b6102a760048036038101906102a291906132cc565b6108d8565b005b6102b1610c99565b6040516102be9190613cd4565b60405180910390f35b6102cf610cb0565b6040516102dc9190613d4f565b60405180910390f35b6102ff60048036038101906102fa9190612f87565b610d3e565b005b610309610d8a565b005b610325600480360381019061032091906133da565b610d9e565b005b61032f610dbc565b005b610339610dce565b6040516103469190613b0d565b60405180910390f35b61036960048036038101906103649190613187565b610df8565b005b6103856004803603810190610380919061327f565b610e0e565b005b6103a1600480360381019061039c9190612f87565b611157565b005b6103bd60048036038101906103b89190612fe1565b6111a3565b6040516103ca9190613cd4565b60405180910390f35b6103ed60048036038101906103e891906130f0565b611237565b005b61040960048036038101906104049190612f87565b6112d8565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561047c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161047390613e71565b60405180910390fd5b60008083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061059f57507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806105af57506105ae8261135c565b5b9050919050565b6105be6113c6565b80600890805190602001906105d4929190612ac2565b5050565b606060086105e583611444565b6040516020016105f6929190613ac3565b6040516020818303038152906040529050919050565b61061461151c565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16148061065a57506106598561065461151c565b6111a3565b5b610699576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161069090613e91565b60405180910390fd5b6106a68585858585611524565b5050505050565b6106b56113c6565b6106bd611846565b565b6106c76113c6565b60005b8282905081101561079457600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3061dead86868681811061072a57610729614573565b5b905060200201356040518463ffffffff1660e01b815260040161074f93929190613b90565b600060405180830381600087803b15801561076957600080fd5b505af115801561077d573d6000803e3d6000fd5b50505050808061078c90614464565b9150506106ca565b505050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60608151835114610805576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107fc90613ff1565b60405180910390fd5b6000835167ffffffffffffffff811115610822576108216145a2565b5b6040519080825280602002602001820160405280156108505781602001602082028036833780820191505090505b50905060005b84518110156108cd5761089d85828151811061087557610874614573565b5b60200260200101518583815181106108905761088f614573565b5b602002602001015161040b565b8282815181106108b0576108af614573565b5b602002602001018181525050806108c690614464565b9050610856565b508091505092915050565b6108e06118a9565b6108e86118f9565b60058686905011158015610900575060058484905011155b8015610910575060058282905011155b61094f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094690613e31565b60405180910390fd5b838390508686905014801561096957508181905086869050145b6109a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099f90613e11565b60405180910390fd5b60005b86869050811015610c885760001515600960008989858181106109d1576109d0614573565b5b90506020020135815260200190815260200160002060009054906101000a900460ff16151514610a36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2d90613f11565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16600b6000898985818110610a6457610a63614573565b5b90506020020135815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610af0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae790613fb1565b60405180910390fd5b610b51858583818110610b0657610b05614573565b5b9050602002810190610b1891906140d5565b898985818110610b2b57610b2a614573565b5b90506020020135868686818110610b4557610b44614573565b5b90506020020135611943565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd30338a8a86818110610ba457610ba3614573565b5b905060200201356040518463ffffffff1660e01b8152600401610bc993929190613b90565b600060405180830381600087803b158015610be357600080fd5b505af1158015610bf7573d6000803e3d6000fd5b50505050600160096000898985818110610c1457610c13614573565b5b90506020020135815260200190815260200160002060006101000a81548160ff021916908315150217905550610c7533848484818110610c5757610c56614573565b5b905060200201356001604051806020016040528060008152506119ed565b8080610c8090614464565b9150506109ab565b50610c91611b9e565b505050505050565b6000600560149054906101000a900460ff16905090565b60088054610cbd90614401565b80601f0160208091040260200160405190810160405280929190818152602001828054610ce990614401565b8015610d365780601f10610d0b57610100808354040283529160200191610d36565b820191906000526020600020905b815481529060010190602001808311610d1957829003601f168201915b505050505081565b610d466113c6565b80600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610d926113c6565b610d9c6000611ba8565b565b610da66113c6565b818160049190610db7929190612b48565b505050565b610dc46113c6565b610dcc611c6e565b565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610e0a610e0361151c565b8383611cd1565b5050565b610e166118f9565b610e1e6118a9565b60005b8282905081101561114a573373ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e858585818110610e9457610e93614573565b5b905060200201356040518263ffffffff1660e01b8152600401610eb79190614091565b60206040518083038186803b158015610ecf57600080fd5b505afa158015610ee3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f079190612fb4565b73ffffffffffffffffffffffffffffffffffffffff1614610f5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5490613f31565b60405180910390fd5b60001515600a6000858585818110610f7857610f77614573565b5b90506020020135815260200190815260200160002060009054906101000a900460ff16151514610fdd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd490613dd1565b60405180910390fd5b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd33308686868181106110305761102f614573565b5b905060200201356040518463ffffffff1660e01b815260040161105593929190613b90565b600060405180830381600087803b15801561106f57600080fd5b505af1158015611083573d6000803e3d6000fd5b5050505033600b600085858581811061109f5761109e614573565b5b90506020020135815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600a600085858581811061110b5761110a614573565b5b90506020020135815260200190815260200160002060006101000a81548160ff021916908315150217905550808061114290614464565b915050610e21565b50611153611b9e565b5050565b61115f6113c6565b80600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61123f61151c565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16148061128557506112848561127f61151c565b6111a3565b5b6112c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112bb90613e91565b60405180910390fd5b6112d18585858585611e3e565b5050505050565b6112e06113c6565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611350576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134790613e51565b60405180910390fd5b61135981611ba8565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6113ce61151c565b73ffffffffffffffffffffffffffffffffffffffff166113ec610dce565b73ffffffffffffffffffffffffffffffffffffffff1614611442576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143990613f71565b60405180910390fd5b565b606060006001611453846120da565b01905060008167ffffffffffffffff811115611472576114716145a2565b5b6040519080825280601f01601f1916602001820160405280156114a45781602001600182028036833780820191505090505b509050600082602001820190505b600115611511578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816114fb576114fa6144e6565b5b049450600085141561150c57611511565b6114b2565b819350505050919050565b600033905090565b8151835114611568576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155f90614011565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156115d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115cf90613ef1565b60405180910390fd5b60006115e261151c565b90506115f281878787878761222d565b60005b84518110156117a357600085828151811061161357611612614573565b5b60200260200101519050600085838151811061163257611631614573565b5b60200260200101519050600080600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156116d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ca90613f51565b60405180910390fd5b81810360008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461178891906142a8565b925050819055505050508061179c90614464565b90506115f5565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161181a929190613c9d565b60405180910390a461183081878787878761224b565b61183e818787878787612253565b505050505050565b61184e61243a565b6000600560146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa61189261151c565b60405161189f9190613b0d565b60405180910390a1565b600260065414156118ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e690614051565b60405180910390fd5b6002600681905550565b611901610c99565b15611941576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193890613ed1565b60405180910390fd5b565b600061199c6119528484612483565b86868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506124bd565b90506119a7816124e2565b6119e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119dd90613f91565b60405180910390fd5b5050505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611a5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5490614031565b60405180910390fd5b6000611a6761151c565b90506000611a748561253c565b90506000611a818561253c565b9050611a928360008985858961222d565b8460008088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611af191906142a8565b925050819055508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628989604051611b6f9291906140ac565b60405180910390a4611b868360008985858961224b565b611b95836000898989896125b6565b50505050505050565b6001600681905550565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611c766118f9565b6001600560146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611cba61151c565b604051611cc79190613b0d565b60405180910390a1565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611d40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3790613fd1565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611e319190613cd4565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611eae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea590613ef1565b60405180910390fd5b6000611eb861151c565b90506000611ec58561253c565b90506000611ed28561253c565b9050611ee283898985858961222d565b600080600088815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905085811015611f79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7090613f51565b60405180910390fd5b85810360008089815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560008089815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461202e91906142a8565b925050819055508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628a8a6040516120ab9291906140ac565b60405180910390a46120c1848a8a86868a61224b565b6120cf848a8a8a8a8a6125b6565b505050505050505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612138577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000838161212e5761212d6144e6565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612175576d04ee2d6d415b85acef8100000000838161216b5761216a6144e6565b5b0492506020810190505b662386f26fc1000083106121a457662386f26fc10000838161219a576121996144e6565b5b0492506010810190505b6305f5e10083106121cd576305f5e10083816121c3576121c26144e6565b5b0492506008810190505b61271083106121f25761271083816121e8576121e76144e6565b5b0492506004810190505b60648310612215576064838161220b5761220a6144e6565b5b0492506002810190505b600a8310612224576001810190505b80915050919050565b6122356118f9565b61224386868686868661279d565b505050505050565b505050505050565b6122728473ffffffffffffffffffffffffffffffffffffffff166127a5565b15612432578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b81526004016122b8959493929190613b28565b602060405180830381600087803b1580156122d257600080fd5b505af192505050801561230357506040513d601f19601f8201168201806040525081019061230091906133ad565b60015b6123a95761230f6145d1565b806308c379a0141561236c5750612324614c56565b8061232f575061236e565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123639190613d4f565b60405180910390fd5b505b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a090614071565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612430576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242790613d91565b60405180910390fd5b505b505050505050565b612442610c99565b612481576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161247890613db1565b60405180910390fd5b565b600030338484600460405160200161249f959493929190613c21565b60405160208183030381529060405280519060200120905092915050565b60006124da826124cc856127c8565b6127f890919063ffffffff16565b905092915050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149050919050565b60606000600167ffffffffffffffff81111561255b5761255a6145a2565b5b6040519080825280602002602001820160405280156125895781602001602082028036833780820191505090505b50905082816000815181106125a1576125a0614573565b5b60200260200101818152505080915050919050565b6125d58473ffffffffffffffffffffffffffffffffffffffff166127a5565b15612795578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b815260040161261b959493929190613bc7565b602060405180830381600087803b15801561263557600080fd5b505af192505050801561266657506040513d601f19601f8201168201806040525081019061266391906133ad565b60015b61270c576126726145d1565b806308c379a014156126cf5750612687614c56565b8061269257506126d1565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126c69190613d4f565b60405180910390fd5b505b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161270390614071565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612793576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161278a90613d91565b60405180910390fd5b505b505050505050565b505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000816040516020016127db9190613ae7565b604051602081830303815290604052805190602001209050919050565b6000806000612807858561281f565b9150915061281481612871565b819250505092915050565b6000806041835114156128615760008060006020860151925060408601519150606086015160001a9050612855878285856129df565b9450945050505061286a565b60006002915091505b9250929050565b6000600481111561288557612884614515565b5b81600481111561289857612897614515565b5b14156128a3576129dc565b600160048111156128b7576128b6614515565b5b8160048111156128ca576128c9614515565b5b141561290b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161290290613d71565b60405180910390fd5b6002600481111561291f5761291e614515565b5b81600481111561293257612931614515565b5b1415612973576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161296a90613df1565b60405180910390fd5b6003600481111561298757612986614515565b5b81600481111561299a57612999614515565b5b14156129db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129d290613eb1565b60405180910390fd5b5b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115612a1a576000600391509150612ab9565b600060018787878760405160008152602001604052604051612a3f9493929190613cef565b6020604051602081039080840390855afa158015612a61573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612ab057600060019250925050612ab9565b80600092509250505b94509492505050565b828054612ace90614401565b90600052602060002090601f016020900481019282612af05760008555612b37565b82601f10612b0957805160ff1916838001178555612b37565b82800160010185558215612b37579182015b82811115612b36578251825591602001919060010190612b1b565b5b509050612b449190612bce565b5090565b828054612b5490614401565b90600052602060002090601f016020900481019282612b765760008555612bbd565b82601f10612b8f57803560ff1916838001178555612bbd565b82800160010185558215612bbd579182015b82811115612bbc578235825591602001919060010190612ba1565b5b509050612bca9190612bce565b5090565b5b80821115612be7576000816000905550600101612bcf565b5090565b6000612bfe612bf98461415d565b614138565b90508083825260208201905082856020860282011115612c2157612c20614607565b5b60005b85811015612c515781612c378882612d4f565b845260208401935060208301925050600181019050612c24565b5050509392505050565b6000612c6e612c6984614189565b614138565b90508083825260208201905082856020860282011115612c9157612c90614607565b5b60005b85811015612cc15781612ca78882612f72565b845260208401935060208301925050600181019050612c94565b5050509392505050565b6000612cde612cd9846141b5565b614138565b905082815260208101848484011115612cfa57612cf9614611565b5b612d058482856143bf565b509392505050565b6000612d20612d1b846141e6565b614138565b905082815260208101848484011115612d3c57612d3b614611565b5b612d478482856143bf565b509392505050565b600081359050612d5e81614cec565b92915050565b600081519050612d7381614cec565b92915050565b600082601f830112612d8e57612d8d6145f8565b5b8135612d9e848260208601612beb565b91505092915050565b60008083601f840112612dbd57612dbc6145f8565b5b8235905067ffffffffffffffff811115612dda57612dd96145f3565b5b602083019150836020820283011115612df657612df5614607565b5b9250929050565b60008083601f840112612e1357612e126145f8565b5b8235905067ffffffffffffffff811115612e3057612e2f6145f3565b5b602083019150836020820283011115612e4c57612e4b614607565b5b9250929050565b600082601f830112612e6857612e676145f8565b5b8135612e78848260208601612c5b565b91505092915050565b600081359050612e9081614d03565b92915050565b600081359050612ea581614d1a565b92915050565b600081519050612eba81614d1a565b92915050565b600082601f830112612ed557612ed46145f8565b5b8135612ee5848260208601612ccb565b91505092915050565b60008083601f840112612f0457612f036145f8565b5b8235905067ffffffffffffffff811115612f2157612f206145f3565b5b602083019150836001820283011115612f3d57612f3c614607565b5b9250929050565b600082601f830112612f5957612f586145f8565b5b8135612f69848260208601612d0d565b91505092915050565b600081359050612f8181614d31565b92915050565b600060208284031215612f9d57612f9c61461b565b5b6000612fab84828501612d4f565b91505092915050565b600060208284031215612fca57612fc961461b565b5b6000612fd884828501612d64565b91505092915050565b60008060408385031215612ff857612ff761461b565b5b600061300685828601612d4f565b925050602061301785828601612d4f565b9150509250929050565b600080600080600060a0868803121561303d5761303c61461b565b5b600061304b88828901612d4f565b955050602061305c88828901612d4f565b945050604086013567ffffffffffffffff81111561307d5761307c614616565b5b61308988828901612e53565b935050606086013567ffffffffffffffff8111156130aa576130a9614616565b5b6130b688828901612e53565b925050608086013567ffffffffffffffff8111156130d7576130d6614616565b5b6130e388828901612ec0565b9150509295509295909350565b600080600080600060a0868803121561310c5761310b61461b565b5b600061311a88828901612d4f565b955050602061312b88828901612d4f565b945050604061313c88828901612f72565b935050606061314d88828901612f72565b925050608086013567ffffffffffffffff81111561316e5761316d614616565b5b61317a88828901612ec0565b9150509295509295909350565b6000806040838503121561319e5761319d61461b565b5b60006131ac85828601612d4f565b92505060206131bd85828601612e81565b9150509250929050565b600080604083850312156131de576131dd61461b565b5b60006131ec85828601612d4f565b92505060206131fd85828601612f72565b9150509250929050565b6000806040838503121561321e5761321d61461b565b5b600083013567ffffffffffffffff81111561323c5761323b614616565b5b61324885828601612d79565b925050602083013567ffffffffffffffff81111561326957613268614616565b5b61327585828601612e53565b9150509250929050565b600080602083850312156132965761329561461b565b5b600083013567ffffffffffffffff8111156132b4576132b3614616565b5b6132c085828601612dfd565b92509250509250929050565b600080600080600080606087890312156132e9576132e861461b565b5b600087013567ffffffffffffffff81111561330757613306614616565b5b61331389828a01612dfd565b9650965050602087013567ffffffffffffffff81111561333657613335614616565b5b61334289828a01612da7565b9450945050604087013567ffffffffffffffff81111561336557613364614616565b5b61337189828a01612dfd565b92509250509295509295509295565b6000602082840312156133965761339561461b565b5b60006133a484828501612e96565b91505092915050565b6000602082840312156133c3576133c261461b565b5b60006133d184828501612eab565b91505092915050565b600080602083850312156133f1576133f061461b565b5b600083013567ffffffffffffffff81111561340f5761340e614616565b5b61341b85828601612eee565b92509250509250929050565b60006020828403121561343d5761343c61461b565b5b600082013567ffffffffffffffff81111561345b5761345a614616565b5b61346784828501612f44565b91505092915050565b6000602082840312156134865761348561461b565b5b600061349484828501612f72565b91505092915050565b60006134a98383613a96565b60208301905092915050565b6134be816142fe565b82525050565b60006134cf8261423c565b6134d9818561426a565b93506134e483614217565b8060005b838110156135155781516134fc888261349d565b97506135078361425d565b9250506001810190506134e8565b5085935050505092915050565b61352b81614310565b82525050565b61353a8161431c565b82525050565b61355161354c8261431c565b6144ad565b82525050565b600061356282614247565b61356c818561427b565b935061357c8185602086016143ce565b61358581614620565b840191505092915050565b61359981614389565b82525050565b60006135aa82614252565b6135b4818561428c565b93506135c48185602086016143ce565b6135cd81614620565b840191505092915050565b60006135e382614252565b6135ed818561429d565b93506135fd8185602086016143ce565b80840191505092915050565b6000815461361681614401565b613620818661428c565b9450600182166000811461363b576001811461364d57613680565b60ff1983168652602086019350613680565b61365685614227565b60005b8381101561367857815481890152600182019150602081019050613659565b808801955050505b50505092915050565b6000815461369681614401565b6136a0818661429d565b945060018216600081146136bb57600181146136cc576136ff565b60ff198316865281860193506136ff565b6136d585614227565b60005b838110156136f7578154818901526001820191506020810190506136d8565b838801955050505b50505092915050565b600061371560188361428c565b91506137208261463e565b602082019050919050565b600061373860288361428c565b915061374382614667565b604082019050919050565b600061375b60148361428c565b9150613766826146b6565b602082019050919050565b600061377e60178361428c565b9150613789826146df565b602082019050919050565b60006137a1601f8361428c565b91506137ac82614708565b602082019050919050565b60006137c4601c8361429d565b91506137cf82614731565b601c82019050919050565b60006137e7601f8361428c565b91506137f28261475a565b602082019050919050565b600061380a60178361428c565b915061381582614783565b602082019050919050565b600061382d60268361428c565b9150613838826147ac565b604082019050919050565b6000613850602a8361428c565b915061385b826147fb565b604082019050919050565b6000613873602e8361428c565b915061387e8261484a565b604082019050919050565b600061389660228361428c565b91506138a182614899565b604082019050919050565b60006138b960108361428c565b91506138c4826148e8565b602082019050919050565b60006138dc60258361428c565b91506138e782614911565b604082019050919050565b60006138ff601f8361428c565b915061390a82614960565b602082019050919050565b600061392260218361428c565b915061392d82614989565b604082019050919050565b6000613945602a8361428c565b9150613950826149d8565b604082019050919050565b600061396860208361428c565b915061397382614a27565b602082019050919050565b600061398b601d8361428c565b915061399682614a50565b602082019050919050565b60006139ae60208361428c565b91506139b982614a79565b602082019050919050565b60006139d160298361428c565b91506139dc82614aa2565b604082019050919050565b60006139f460298361428c565b91506139ff82614af1565b604082019050919050565b6000613a1760288361428c565b9150613a2282614b40565b604082019050919050565b6000613a3a60218361428c565b9150613a4582614b8f565b604082019050919050565b6000613a5d601f8361428c565b9150613a6882614bde565b602082019050919050565b6000613a8060348361428c565b9150613a8b82614c07565b604082019050919050565b613a9f81614372565b82525050565b613aae81614372565b82525050565b613abd8161437c565b82525050565b6000613acf8285613689565b9150613adb82846135d8565b91508190509392505050565b6000613af2826137b7565b9150613afe8284613540565b60208201915081905092915050565b6000602082019050613b2260008301846134b5565b92915050565b600060a082019050613b3d60008301886134b5565b613b4a60208301876134b5565b8181036040830152613b5c81866134c4565b90508181036060830152613b7081856134c4565b90508181036080830152613b848184613557565b90509695505050505050565b6000606082019050613ba560008301866134b5565b613bb260208301856134b5565b613bbf6040830184613aa5565b949350505050565b600060a082019050613bdc60008301886134b5565b613be960208301876134b5565b613bf66040830186613aa5565b613c036060830185613aa5565b8181036080830152613c158184613557565b90509695505050505050565b600060a082019050613c3660008301886134b5565b613c4360208301876134b5565b613c506040830186613aa5565b613c5d6060830185613aa5565b8181036080830152613c6f8184613609565b90509695505050505050565b60006020820190508181036000830152613c9581846134c4565b905092915050565b60006040820190508181036000830152613cb781856134c4565b90508181036020830152613ccb81846134c4565b90509392505050565b6000602082019050613ce96000830184613522565b92915050565b6000608082019050613d046000830187613531565b613d116020830186613ab4565b613d1e6040830185613531565b613d2b6060830184613531565b95945050505050565b6000602082019050613d496000830184613590565b92915050565b60006020820190508181036000830152613d69818461359f565b905092915050565b60006020820190508181036000830152613d8a81613708565b9050919050565b60006020820190508181036000830152613daa8161372b565b9050919050565b60006020820190508181036000830152613dca8161374e565b9050919050565b60006020820190508181036000830152613dea81613771565b9050919050565b60006020820190508181036000830152613e0a81613794565b9050919050565b60006020820190508181036000830152613e2a816137da565b9050919050565b60006020820190508181036000830152613e4a816137fd565b9050919050565b60006020820190508181036000830152613e6a81613820565b9050919050565b60006020820190508181036000830152613e8a81613843565b9050919050565b60006020820190508181036000830152613eaa81613866565b9050919050565b60006020820190508181036000830152613eca81613889565b9050919050565b60006020820190508181036000830152613eea816138ac565b9050919050565b60006020820190508181036000830152613f0a816138cf565b9050919050565b60006020820190508181036000830152613f2a816138f2565b9050919050565b60006020820190508181036000830152613f4a81613915565b9050919050565b60006020820190508181036000830152613f6a81613938565b9050919050565b60006020820190508181036000830152613f8a8161395b565b9050919050565b60006020820190508181036000830152613faa8161397e565b9050919050565b60006020820190508181036000830152613fca816139a1565b9050919050565b60006020820190508181036000830152613fea816139c4565b9050919050565b6000602082019050818103600083015261400a816139e7565b9050919050565b6000602082019050818103600083015261402a81613a0a565b9050919050565b6000602082019050818103600083015261404a81613a2d565b9050919050565b6000602082019050818103600083015261406a81613a50565b9050919050565b6000602082019050818103600083015261408a81613a73565b9050919050565b60006020820190506140a66000830184613aa5565b92915050565b60006040820190506140c16000830185613aa5565b6140ce6020830184613aa5565b9392505050565b600080833560016020038436030381126140f2576140f1614602565b5b80840192508235915067ffffffffffffffff821115614114576141136145fd565b5b6020830192506001820236038313156141305761412f61460c565b5b509250929050565b6000614142614153565b905061414e8282614433565b919050565b6000604051905090565b600067ffffffffffffffff821115614178576141776145a2565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156141a4576141a36145a2565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156141d0576141cf6145a2565b5b6141d982614620565b9050602081019050919050565b600067ffffffffffffffff821115614201576142006145a2565b5b61420a82614620565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006142b382614372565b91506142be83614372565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156142f3576142f26144b7565b5b828201905092915050565b600061430982614352565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60006143948261439b565b9050919050565b60006143a6826143ad565b9050919050565b60006143b882614352565b9050919050565b82818337600083830152505050565b60005b838110156143ec5780820151818401526020810190506143d1565b838111156143fb576000848401525b50505050565b6000600282049050600182168061441957607f821691505b6020821081141561442d5761442c614544565b5b50919050565b61443c82614620565b810181811067ffffffffffffffff8211171561445b5761445a6145a2565b5b80604052505050565b600061446f82614372565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156144a2576144a16144b7565b5b600182019050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060033d11156145f05760046000803e6145ed600051614631565b90505b90565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160e01c9050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f536b756c204e465420616c726561647920657661646564000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b7f496e707574206172726179206c656e677468206d7573742062652073616d6500600082015250565b7f43616e277420636c61696d206d6f7265207468616e2035000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2061646472657373207a65726f206973206e6f742061207660008201527f616c6964206f776e657200000000000000000000000000000000000000000000602082015250565b7f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60008201527f6572206f7220617070726f766564000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f536b756c204e465420416c7265616479207573656420666f7220636c61696d00600082015250565b7f43616e2774207374616b6520746f6b656e7320796f7520646f6e2774206f776e60008201527f2100000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f5369676e617475726520766572696669636174696f6e206661696c6564000000600082015250565b7f536b756c204e4654206e6f74207374616b6564202f204e6f74205374616b6572600082015250565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f455243313135353a207472616e7366657220746f206e6f6e2d4552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b600060443d1015614c6657614ce9565b614c6e614153565b60043d036004823e80513d602482011167ffffffffffffffff82111715614c96575050614ce9565b808201805167ffffffffffffffff811115614cb45750505050614ce9565b80602083010160043d038501811115614cd1575050505050614ce9565b614ce082602001850186614433565b82955050505050505b90565b614cf5816142fe565b8114614d0057600080fd5b50565b614d0c81614310565b8114614d1757600080fd5b50565b614d2381614326565b8114614d2e57600080fd5b50565b614d3a81614372565b8114614d4557600080fd5b5056fea2646970667358221220123580584a1442918f9b29e68acce99b6df065f26df88701137c1306a4731f0964736f6c634300080700330000000000000000000000003a987f099e7f1d0ca6403570a9d5a69b819f86ee
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061014c5760003560e01c80636c0360eb116100c3578063a22cb4651161007c578063a22cb4651461034f578063d0f736b91461036b578063e18d90d014610387578063e985e9c5146103a3578063f242432a146103d3578063f2fde38b146103ef5761014c565b80636c0360eb146102c75780636c19e783146102e5578063715018a6146103015780637ed6c9261461030b5780638456cb59146103275780638da5cb5b146103315761014c565b80633f4ba83a116101155780633f4ba83a14610219578063419462f6146102235780634a7b6b1f1461023f5780634e1273f41461025d5780634f36ccf31461028d5780635c975abb146102a95761014c565b8062fdd58e1461015157806301ffc9a71461018157806302fe5305146101b15780630e89341c146101cd5780632eb2c2d6146101fd575b600080fd5b61016b600480360381019061016691906131c7565b61040b565b6040516101789190614091565b60405180910390f35b61019b60048036038101906101969190613380565b6104d4565b6040516101a89190613cd4565b60405180910390f35b6101cb60048036038101906101c69190613427565b6105b6565b005b6101e760048036038101906101e29190613470565b6105d8565b6040516101f49190613d4f565b60405180910390f35b61021760048036038101906102129190613021565b61060c565b005b6102216106ad565b005b61023d6004803603810190610238919061327f565b6106bf565b005b610247610799565b6040516102549190613d34565b60405180910390f35b61027760048036038101906102729190613207565b6107bf565b6040516102849190613c7b565b60405180910390f35b6102a760048036038101906102a291906132cc565b6108d8565b005b6102b1610c99565b6040516102be9190613cd4565b60405180910390f35b6102cf610cb0565b6040516102dc9190613d4f565b60405180910390f35b6102ff60048036038101906102fa9190612f87565b610d3e565b005b610309610d8a565b005b610325600480360381019061032091906133da565b610d9e565b005b61032f610dbc565b005b610339610dce565b6040516103469190613b0d565b60405180910390f35b61036960048036038101906103649190613187565b610df8565b005b6103856004803603810190610380919061327f565b610e0e565b005b6103a1600480360381019061039c9190612f87565b611157565b005b6103bd60048036038101906103b89190612fe1565b6111a3565b6040516103ca9190613cd4565b60405180910390f35b6103ed60048036038101906103e891906130f0565b611237565b005b61040960048036038101906104049190612f87565b6112d8565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561047c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161047390613e71565b60405180910390fd5b60008083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061059f57507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806105af57506105ae8261135c565b5b9050919050565b6105be6113c6565b80600890805190602001906105d4929190612ac2565b5050565b606060086105e583611444565b6040516020016105f6929190613ac3565b6040516020818303038152906040529050919050565b61061461151c565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16148061065a57506106598561065461151c565b6111a3565b5b610699576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161069090613e91565b60405180910390fd5b6106a68585858585611524565b5050505050565b6106b56113c6565b6106bd611846565b565b6106c76113c6565b60005b8282905081101561079457600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3061dead86868681811061072a57610729614573565b5b905060200201356040518463ffffffff1660e01b815260040161074f93929190613b90565b600060405180830381600087803b15801561076957600080fd5b505af115801561077d573d6000803e3d6000fd5b50505050808061078c90614464565b9150506106ca565b505050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60608151835114610805576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107fc90613ff1565b60405180910390fd5b6000835167ffffffffffffffff811115610822576108216145a2565b5b6040519080825280602002602001820160405280156108505781602001602082028036833780820191505090505b50905060005b84518110156108cd5761089d85828151811061087557610874614573565b5b60200260200101518583815181106108905761088f614573565b5b602002602001015161040b565b8282815181106108b0576108af614573565b5b602002602001018181525050806108c690614464565b9050610856565b508091505092915050565b6108e06118a9565b6108e86118f9565b60058686905011158015610900575060058484905011155b8015610910575060058282905011155b61094f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094690613e31565b60405180910390fd5b838390508686905014801561096957508181905086869050145b6109a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099f90613e11565b60405180910390fd5b60005b86869050811015610c885760001515600960008989858181106109d1576109d0614573565b5b90506020020135815260200190815260200160002060009054906101000a900460ff16151514610a36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2d90613f11565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16600b6000898985818110610a6457610a63614573565b5b90506020020135815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610af0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae790613fb1565b60405180910390fd5b610b51858583818110610b0657610b05614573565b5b9050602002810190610b1891906140d5565b898985818110610b2b57610b2a614573565b5b90506020020135868686818110610b4557610b44614573565b5b90506020020135611943565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd30338a8a86818110610ba457610ba3614573565b5b905060200201356040518463ffffffff1660e01b8152600401610bc993929190613b90565b600060405180830381600087803b158015610be357600080fd5b505af1158015610bf7573d6000803e3d6000fd5b50505050600160096000898985818110610c1457610c13614573565b5b90506020020135815260200190815260200160002060006101000a81548160ff021916908315150217905550610c7533848484818110610c5757610c56614573565b5b905060200201356001604051806020016040528060008152506119ed565b8080610c8090614464565b9150506109ab565b50610c91611b9e565b505050505050565b6000600560149054906101000a900460ff16905090565b60088054610cbd90614401565b80601f0160208091040260200160405190810160405280929190818152602001828054610ce990614401565b8015610d365780601f10610d0b57610100808354040283529160200191610d36565b820191906000526020600020905b815481529060010190602001808311610d1957829003601f168201915b505050505081565b610d466113c6565b80600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610d926113c6565b610d9c6000611ba8565b565b610da66113c6565b818160049190610db7929190612b48565b505050565b610dc46113c6565b610dcc611c6e565b565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610e0a610e0361151c565b8383611cd1565b5050565b610e166118f9565b610e1e6118a9565b60005b8282905081101561114a573373ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e858585818110610e9457610e93614573565b5b905060200201356040518263ffffffff1660e01b8152600401610eb79190614091565b60206040518083038186803b158015610ecf57600080fd5b505afa158015610ee3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f079190612fb4565b73ffffffffffffffffffffffffffffffffffffffff1614610f5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5490613f31565b60405180910390fd5b60001515600a6000858585818110610f7857610f77614573565b5b90506020020135815260200190815260200160002060009054906101000a900460ff16151514610fdd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd490613dd1565b60405180910390fd5b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd33308686868181106110305761102f614573565b5b905060200201356040518463ffffffff1660e01b815260040161105593929190613b90565b600060405180830381600087803b15801561106f57600080fd5b505af1158015611083573d6000803e3d6000fd5b5050505033600b600085858581811061109f5761109e614573565b5b90506020020135815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600a600085858581811061110b5761110a614573565b5b90506020020135815260200190815260200160002060006101000a81548160ff021916908315150217905550808061114290614464565b915050610e21565b50611153611b9e565b5050565b61115f6113c6565b80600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61123f61151c565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16148061128557506112848561127f61151c565b6111a3565b5b6112c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112bb90613e91565b60405180910390fd5b6112d18585858585611e3e565b5050505050565b6112e06113c6565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611350576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134790613e51565b60405180910390fd5b61135981611ba8565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6113ce61151c565b73ffffffffffffffffffffffffffffffffffffffff166113ec610dce565b73ffffffffffffffffffffffffffffffffffffffff1614611442576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143990613f71565b60405180910390fd5b565b606060006001611453846120da565b01905060008167ffffffffffffffff811115611472576114716145a2565b5b6040519080825280601f01601f1916602001820160405280156114a45781602001600182028036833780820191505090505b509050600082602001820190505b600115611511578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816114fb576114fa6144e6565b5b049450600085141561150c57611511565b6114b2565b819350505050919050565b600033905090565b8151835114611568576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155f90614011565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156115d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115cf90613ef1565b60405180910390fd5b60006115e261151c565b90506115f281878787878761222d565b60005b84518110156117a357600085828151811061161357611612614573565b5b60200260200101519050600085838151811061163257611631614573565b5b60200260200101519050600080600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156116d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ca90613f51565b60405180910390fd5b81810360008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461178891906142a8565b925050819055505050508061179c90614464565b90506115f5565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161181a929190613c9d565b60405180910390a461183081878787878761224b565b61183e818787878787612253565b505050505050565b61184e61243a565b6000600560146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa61189261151c565b60405161189f9190613b0d565b60405180910390a1565b600260065414156118ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e690614051565b60405180910390fd5b6002600681905550565b611901610c99565b15611941576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193890613ed1565b60405180910390fd5b565b600061199c6119528484612483565b86868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506124bd565b90506119a7816124e2565b6119e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119dd90613f91565b60405180910390fd5b5050505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611a5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5490614031565b60405180910390fd5b6000611a6761151c565b90506000611a748561253c565b90506000611a818561253c565b9050611a928360008985858961222d565b8460008088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611af191906142a8565b925050819055508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628989604051611b6f9291906140ac565b60405180910390a4611b868360008985858961224b565b611b95836000898989896125b6565b50505050505050565b6001600681905550565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611c766118f9565b6001600560146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611cba61151c565b604051611cc79190613b0d565b60405180910390a1565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611d40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3790613fd1565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611e319190613cd4565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611eae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea590613ef1565b60405180910390fd5b6000611eb861151c565b90506000611ec58561253c565b90506000611ed28561253c565b9050611ee283898985858961222d565b600080600088815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905085811015611f79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7090613f51565b60405180910390fd5b85810360008089815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560008089815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461202e91906142a8565b925050819055508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628a8a6040516120ab9291906140ac565b60405180910390a46120c1848a8a86868a61224b565b6120cf848a8a8a8a8a6125b6565b505050505050505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612138577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000838161212e5761212d6144e6565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612175576d04ee2d6d415b85acef8100000000838161216b5761216a6144e6565b5b0492506020810190505b662386f26fc1000083106121a457662386f26fc10000838161219a576121996144e6565b5b0492506010810190505b6305f5e10083106121cd576305f5e10083816121c3576121c26144e6565b5b0492506008810190505b61271083106121f25761271083816121e8576121e76144e6565b5b0492506004810190505b60648310612215576064838161220b5761220a6144e6565b5b0492506002810190505b600a8310612224576001810190505b80915050919050565b6122356118f9565b61224386868686868661279d565b505050505050565b505050505050565b6122728473ffffffffffffffffffffffffffffffffffffffff166127a5565b15612432578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b81526004016122b8959493929190613b28565b602060405180830381600087803b1580156122d257600080fd5b505af192505050801561230357506040513d601f19601f8201168201806040525081019061230091906133ad565b60015b6123a95761230f6145d1565b806308c379a0141561236c5750612324614c56565b8061232f575061236e565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123639190613d4f565b60405180910390fd5b505b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a090614071565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612430576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242790613d91565b60405180910390fd5b505b505050505050565b612442610c99565b612481576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161247890613db1565b60405180910390fd5b565b600030338484600460405160200161249f959493929190613c21565b60405160208183030381529060405280519060200120905092915050565b60006124da826124cc856127c8565b6127f890919063ffffffff16565b905092915050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149050919050565b60606000600167ffffffffffffffff81111561255b5761255a6145a2565b5b6040519080825280602002602001820160405280156125895781602001602082028036833780820191505090505b50905082816000815181106125a1576125a0614573565b5b60200260200101818152505080915050919050565b6125d58473ffffffffffffffffffffffffffffffffffffffff166127a5565b15612795578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b815260040161261b959493929190613bc7565b602060405180830381600087803b15801561263557600080fd5b505af192505050801561266657506040513d601f19601f8201168201806040525081019061266391906133ad565b60015b61270c576126726145d1565b806308c379a014156126cf5750612687614c56565b8061269257506126d1565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126c69190613d4f565b60405180910390fd5b505b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161270390614071565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612793576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161278a90613d91565b60405180910390fd5b505b505050505050565b505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000816040516020016127db9190613ae7565b604051602081830303815290604052805190602001209050919050565b6000806000612807858561281f565b9150915061281481612871565b819250505092915050565b6000806041835114156128615760008060006020860151925060408601519150606086015160001a9050612855878285856129df565b9450945050505061286a565b60006002915091505b9250929050565b6000600481111561288557612884614515565b5b81600481111561289857612897614515565b5b14156128a3576129dc565b600160048111156128b7576128b6614515565b5b8160048111156128ca576128c9614515565b5b141561290b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161290290613d71565b60405180910390fd5b6002600481111561291f5761291e614515565b5b81600481111561293257612931614515565b5b1415612973576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161296a90613df1565b60405180910390fd5b6003600481111561298757612986614515565b5b81600481111561299a57612999614515565b5b14156129db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129d290613eb1565b60405180910390fd5b5b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115612a1a576000600391509150612ab9565b600060018787878760405160008152602001604052604051612a3f9493929190613cef565b6020604051602081039080840390855afa158015612a61573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612ab057600060019250925050612ab9565b80600092509250505b94509492505050565b828054612ace90614401565b90600052602060002090601f016020900481019282612af05760008555612b37565b82601f10612b0957805160ff1916838001178555612b37565b82800160010185558215612b37579182015b82811115612b36578251825591602001919060010190612b1b565b5b509050612b449190612bce565b5090565b828054612b5490614401565b90600052602060002090601f016020900481019282612b765760008555612bbd565b82601f10612b8f57803560ff1916838001178555612bbd565b82800160010185558215612bbd579182015b82811115612bbc578235825591602001919060010190612ba1565b5b509050612bca9190612bce565b5090565b5b80821115612be7576000816000905550600101612bcf565b5090565b6000612bfe612bf98461415d565b614138565b90508083825260208201905082856020860282011115612c2157612c20614607565b5b60005b85811015612c515781612c378882612d4f565b845260208401935060208301925050600181019050612c24565b5050509392505050565b6000612c6e612c6984614189565b614138565b90508083825260208201905082856020860282011115612c9157612c90614607565b5b60005b85811015612cc15781612ca78882612f72565b845260208401935060208301925050600181019050612c94565b5050509392505050565b6000612cde612cd9846141b5565b614138565b905082815260208101848484011115612cfa57612cf9614611565b5b612d058482856143bf565b509392505050565b6000612d20612d1b846141e6565b614138565b905082815260208101848484011115612d3c57612d3b614611565b5b612d478482856143bf565b509392505050565b600081359050612d5e81614cec565b92915050565b600081519050612d7381614cec565b92915050565b600082601f830112612d8e57612d8d6145f8565b5b8135612d9e848260208601612beb565b91505092915050565b60008083601f840112612dbd57612dbc6145f8565b5b8235905067ffffffffffffffff811115612dda57612dd96145f3565b5b602083019150836020820283011115612df657612df5614607565b5b9250929050565b60008083601f840112612e1357612e126145f8565b5b8235905067ffffffffffffffff811115612e3057612e2f6145f3565b5b602083019150836020820283011115612e4c57612e4b614607565b5b9250929050565b600082601f830112612e6857612e676145f8565b5b8135612e78848260208601612c5b565b91505092915050565b600081359050612e9081614d03565b92915050565b600081359050612ea581614d1a565b92915050565b600081519050612eba81614d1a565b92915050565b600082601f830112612ed557612ed46145f8565b5b8135612ee5848260208601612ccb565b91505092915050565b60008083601f840112612f0457612f036145f8565b5b8235905067ffffffffffffffff811115612f2157612f206145f3565b5b602083019150836001820283011115612f3d57612f3c614607565b5b9250929050565b600082601f830112612f5957612f586145f8565b5b8135612f69848260208601612d0d565b91505092915050565b600081359050612f8181614d31565b92915050565b600060208284031215612f9d57612f9c61461b565b5b6000612fab84828501612d4f565b91505092915050565b600060208284031215612fca57612fc961461b565b5b6000612fd884828501612d64565b91505092915050565b60008060408385031215612ff857612ff761461b565b5b600061300685828601612d4f565b925050602061301785828601612d4f565b9150509250929050565b600080600080600060a0868803121561303d5761303c61461b565b5b600061304b88828901612d4f565b955050602061305c88828901612d4f565b945050604086013567ffffffffffffffff81111561307d5761307c614616565b5b61308988828901612e53565b935050606086013567ffffffffffffffff8111156130aa576130a9614616565b5b6130b688828901612e53565b925050608086013567ffffffffffffffff8111156130d7576130d6614616565b5b6130e388828901612ec0565b9150509295509295909350565b600080600080600060a0868803121561310c5761310b61461b565b5b600061311a88828901612d4f565b955050602061312b88828901612d4f565b945050604061313c88828901612f72565b935050606061314d88828901612f72565b925050608086013567ffffffffffffffff81111561316e5761316d614616565b5b61317a88828901612ec0565b9150509295509295909350565b6000806040838503121561319e5761319d61461b565b5b60006131ac85828601612d4f565b92505060206131bd85828601612e81565b9150509250929050565b600080604083850312156131de576131dd61461b565b5b60006131ec85828601612d4f565b92505060206131fd85828601612f72565b9150509250929050565b6000806040838503121561321e5761321d61461b565b5b600083013567ffffffffffffffff81111561323c5761323b614616565b5b61324885828601612d79565b925050602083013567ffffffffffffffff81111561326957613268614616565b5b61327585828601612e53565b9150509250929050565b600080602083850312156132965761329561461b565b5b600083013567ffffffffffffffff8111156132b4576132b3614616565b5b6132c085828601612dfd565b92509250509250929050565b600080600080600080606087890312156132e9576132e861461b565b5b600087013567ffffffffffffffff81111561330757613306614616565b5b61331389828a01612dfd565b9650965050602087013567ffffffffffffffff81111561333657613335614616565b5b61334289828a01612da7565b9450945050604087013567ffffffffffffffff81111561336557613364614616565b5b61337189828a01612dfd565b92509250509295509295509295565b6000602082840312156133965761339561461b565b5b60006133a484828501612e96565b91505092915050565b6000602082840312156133c3576133c261461b565b5b60006133d184828501612eab565b91505092915050565b600080602083850312156133f1576133f061461b565b5b600083013567ffffffffffffffff81111561340f5761340e614616565b5b61341b85828601612eee565b92509250509250929050565b60006020828403121561343d5761343c61461b565b5b600082013567ffffffffffffffff81111561345b5761345a614616565b5b61346784828501612f44565b91505092915050565b6000602082840312156134865761348561461b565b5b600061349484828501612f72565b91505092915050565b60006134a98383613a96565b60208301905092915050565b6134be816142fe565b82525050565b60006134cf8261423c565b6134d9818561426a565b93506134e483614217565b8060005b838110156135155781516134fc888261349d565b97506135078361425d565b9250506001810190506134e8565b5085935050505092915050565b61352b81614310565b82525050565b61353a8161431c565b82525050565b61355161354c8261431c565b6144ad565b82525050565b600061356282614247565b61356c818561427b565b935061357c8185602086016143ce565b61358581614620565b840191505092915050565b61359981614389565b82525050565b60006135aa82614252565b6135b4818561428c565b93506135c48185602086016143ce565b6135cd81614620565b840191505092915050565b60006135e382614252565b6135ed818561429d565b93506135fd8185602086016143ce565b80840191505092915050565b6000815461361681614401565b613620818661428c565b9450600182166000811461363b576001811461364d57613680565b60ff1983168652602086019350613680565b61365685614227565b60005b8381101561367857815481890152600182019150602081019050613659565b808801955050505b50505092915050565b6000815461369681614401565b6136a0818661429d565b945060018216600081146136bb57600181146136cc576136ff565b60ff198316865281860193506136ff565b6136d585614227565b60005b838110156136f7578154818901526001820191506020810190506136d8565b838801955050505b50505092915050565b600061371560188361428c565b91506137208261463e565b602082019050919050565b600061373860288361428c565b915061374382614667565b604082019050919050565b600061375b60148361428c565b9150613766826146b6565b602082019050919050565b600061377e60178361428c565b9150613789826146df565b602082019050919050565b60006137a1601f8361428c565b91506137ac82614708565b602082019050919050565b60006137c4601c8361429d565b91506137cf82614731565b601c82019050919050565b60006137e7601f8361428c565b91506137f28261475a565b602082019050919050565b600061380a60178361428c565b915061381582614783565b602082019050919050565b600061382d60268361428c565b9150613838826147ac565b604082019050919050565b6000613850602a8361428c565b915061385b826147fb565b604082019050919050565b6000613873602e8361428c565b915061387e8261484a565b604082019050919050565b600061389660228361428c565b91506138a182614899565b604082019050919050565b60006138b960108361428c565b91506138c4826148e8565b602082019050919050565b60006138dc60258361428c565b91506138e782614911565b604082019050919050565b60006138ff601f8361428c565b915061390a82614960565b602082019050919050565b600061392260218361428c565b915061392d82614989565b604082019050919050565b6000613945602a8361428c565b9150613950826149d8565b604082019050919050565b600061396860208361428c565b915061397382614a27565b602082019050919050565b600061398b601d8361428c565b915061399682614a50565b602082019050919050565b60006139ae60208361428c565b91506139b982614a79565b602082019050919050565b60006139d160298361428c565b91506139dc82614aa2565b604082019050919050565b60006139f460298361428c565b91506139ff82614af1565b604082019050919050565b6000613a1760288361428c565b9150613a2282614b40565b604082019050919050565b6000613a3a60218361428c565b9150613a4582614b8f565b604082019050919050565b6000613a5d601f8361428c565b9150613a6882614bde565b602082019050919050565b6000613a8060348361428c565b9150613a8b82614c07565b604082019050919050565b613a9f81614372565b82525050565b613aae81614372565b82525050565b613abd8161437c565b82525050565b6000613acf8285613689565b9150613adb82846135d8565b91508190509392505050565b6000613af2826137b7565b9150613afe8284613540565b60208201915081905092915050565b6000602082019050613b2260008301846134b5565b92915050565b600060a082019050613b3d60008301886134b5565b613b4a60208301876134b5565b8181036040830152613b5c81866134c4565b90508181036060830152613b7081856134c4565b90508181036080830152613b848184613557565b90509695505050505050565b6000606082019050613ba560008301866134b5565b613bb260208301856134b5565b613bbf6040830184613aa5565b949350505050565b600060a082019050613bdc60008301886134b5565b613be960208301876134b5565b613bf66040830186613aa5565b613c036060830185613aa5565b8181036080830152613c158184613557565b90509695505050505050565b600060a082019050613c3660008301886134b5565b613c4360208301876134b5565b613c506040830186613aa5565b613c5d6060830185613aa5565b8181036080830152613c6f8184613609565b90509695505050505050565b60006020820190508181036000830152613c9581846134c4565b905092915050565b60006040820190508181036000830152613cb781856134c4565b90508181036020830152613ccb81846134c4565b90509392505050565b6000602082019050613ce96000830184613522565b92915050565b6000608082019050613d046000830187613531565b613d116020830186613ab4565b613d1e6040830185613531565b613d2b6060830184613531565b95945050505050565b6000602082019050613d496000830184613590565b92915050565b60006020820190508181036000830152613d69818461359f565b905092915050565b60006020820190508181036000830152613d8a81613708565b9050919050565b60006020820190508181036000830152613daa8161372b565b9050919050565b60006020820190508181036000830152613dca8161374e565b9050919050565b60006020820190508181036000830152613dea81613771565b9050919050565b60006020820190508181036000830152613e0a81613794565b9050919050565b60006020820190508181036000830152613e2a816137da565b9050919050565b60006020820190508181036000830152613e4a816137fd565b9050919050565b60006020820190508181036000830152613e6a81613820565b9050919050565b60006020820190508181036000830152613e8a81613843565b9050919050565b60006020820190508181036000830152613eaa81613866565b9050919050565b60006020820190508181036000830152613eca81613889565b9050919050565b60006020820190508181036000830152613eea816138ac565b9050919050565b60006020820190508181036000830152613f0a816138cf565b9050919050565b60006020820190508181036000830152613f2a816138f2565b9050919050565b60006020820190508181036000830152613f4a81613915565b9050919050565b60006020820190508181036000830152613f6a81613938565b9050919050565b60006020820190508181036000830152613f8a8161395b565b9050919050565b60006020820190508181036000830152613faa8161397e565b9050919050565b60006020820190508181036000830152613fca816139a1565b9050919050565b60006020820190508181036000830152613fea816139c4565b9050919050565b6000602082019050818103600083015261400a816139e7565b9050919050565b6000602082019050818103600083015261402a81613a0a565b9050919050565b6000602082019050818103600083015261404a81613a2d565b9050919050565b6000602082019050818103600083015261406a81613a50565b9050919050565b6000602082019050818103600083015261408a81613a73565b9050919050565b60006020820190506140a66000830184613aa5565b92915050565b60006040820190506140c16000830185613aa5565b6140ce6020830184613aa5565b9392505050565b600080833560016020038436030381126140f2576140f1614602565b5b80840192508235915067ffffffffffffffff821115614114576141136145fd565b5b6020830192506001820236038313156141305761412f61460c565b5b509250929050565b6000614142614153565b905061414e8282614433565b919050565b6000604051905090565b600067ffffffffffffffff821115614178576141776145a2565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156141a4576141a36145a2565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156141d0576141cf6145a2565b5b6141d982614620565b9050602081019050919050565b600067ffffffffffffffff821115614201576142006145a2565b5b61420a82614620565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006142b382614372565b91506142be83614372565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156142f3576142f26144b7565b5b828201905092915050565b600061430982614352565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60006143948261439b565b9050919050565b60006143a6826143ad565b9050919050565b60006143b882614352565b9050919050565b82818337600083830152505050565b60005b838110156143ec5780820151818401526020810190506143d1565b838111156143fb576000848401525b50505050565b6000600282049050600182168061441957607f821691505b6020821081141561442d5761442c614544565b5b50919050565b61443c82614620565b810181811067ffffffffffffffff8211171561445b5761445a6145a2565b5b80604052505050565b600061446f82614372565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156144a2576144a16144b7565b5b600182019050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060033d11156145f05760046000803e6145ed600051614631565b90505b90565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160e01c9050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f536b756c204e465420616c726561647920657661646564000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b7f496e707574206172726179206c656e677468206d7573742062652073616d6500600082015250565b7f43616e277420636c61696d206d6f7265207468616e2035000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2061646472657373207a65726f206973206e6f742061207660008201527f616c6964206f776e657200000000000000000000000000000000000000000000602082015250565b7f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60008201527f6572206f7220617070726f766564000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f536b756c204e465420416c7265616479207573656420666f7220636c61696d00600082015250565b7f43616e2774207374616b6520746f6b656e7320796f7520646f6e2774206f776e60008201527f2100000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f5369676e617475726520766572696669636174696f6e206661696c6564000000600082015250565b7f536b756c204e4654206e6f74207374616b6564202f204e6f74205374616b6572600082015250565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f455243313135353a207472616e7366657220746f206e6f6e2d4552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b600060443d1015614c6657614ce9565b614c6e614153565b60043d036004823e80513d602482011167ffffffffffffffff82111715614c96575050614ce9565b808201805167ffffffffffffffff811115614cb45750505050614ce9565b80602083010160043d038501811115614cd1575050505050614ce9565b614ce082602001850186614433565b82955050505050505b90565b614cf5816142fe565b8114614d0057600080fd5b50565b614d0c81614310565b8114614d1757600080fd5b50565b614d2381614326565b8114614d2e57600080fd5b50565b614d3a81614372565b8114614d4557600080fd5b5056fea2646970667358221220123580584a1442918f9b29e68acce99b6df065f26df88701137c1306a4731f0964736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000003a987f099e7f1d0ca6403570a9d5a69b819f86ee
-----Decoded View---------------
Arg [0] : _skulNFT (address): 0x3A987f099e7F1d0cA6403570A9D5A69b819f86eE
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000003a987f099e7f1d0ca6403570a9d5a69b819f86ee
Deployed Bytecode Sourcemap
76161:3368:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60556:230;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59579:310;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76704:90;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;79017:212;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62499:438;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76493:65;;;:::i;:::-;;79237:289;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76276:22;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60952:524;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77553:1129;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29472:86;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76305:21;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33492:89;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32337:103;;;:::i;:::-;;33387:97;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76424:61;;;:::i;:::-;;31689:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61549:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76911:634;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76802:101;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61776:168;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62016:406;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32595:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60556:230;60642:7;60689:1;60670:21;;:7;:21;;;;60662:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;60756:9;:13;60766:2;60756:13;;;;;;;;;;;:22;60770:7;60756:22;;;;;;;;;;;;;;;;60749:29;;60556:230;;;;:::o;59579:310::-;59681:4;59733:26;59718:41;;;:11;:41;;;;:110;;;;59791:37;59776:52;;;:11;:52;;;;59718:110;:163;;;;59845:36;59869:11;59845:23;:36::i;:::-;59718:163;59698:183;;59579:310;;;:::o;76704:90::-;31575:13;:11;:13::i;:::-;76780:6:::1;76770:7;:16;;;;;;;;;;;;:::i;:::-;;76704:90:::0;:::o;79017:212::-;79130:13;79192:7;79201:18;:7;:16;:18::i;:::-;79175:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;79161:60;;79017:212;;;:::o;62499:438::-;62740:12;:10;:12::i;:::-;62732:20;;:4;:20;;;:60;;;;62756:36;62773:4;62779:12;:10;:12::i;:::-;62756:16;:36::i;:::-;62732:60;62710:156;;;;;;;;;;;;:::i;:::-;;;;;;;;;62877:52;62900:4;62906:2;62910:3;62915:7;62924:4;62877:22;:52::i;:::-;62499:438;;;;;:::o;76493:65::-;31575:13;:11;:13::i;:::-;76540:10:::1;:8;:10::i;:::-;76493:65::o:0;79237:289::-;31575:13;:11;:13::i;:::-;79323:9:::1;79318:201;79338:6;;:13;;79334:1;:17;79318:201;;;79373:7;;;;;;;;;;;:20;;;79420:4;79452:11;79483:6;;79490:1;79483:9;;;;;;;:::i;:::-;;;;;;;;79373:134;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;79353:3;;;;;:::i;:::-;;;;79318:201;;;;79237:289:::0;;:::o;76276:22::-;;;;;;;;;;;;;:::o;60952:524::-;61108:16;61169:3;:10;61150:8;:15;:29;61142:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;61238:30;61285:8;:15;61271:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61238:63;;61319:9;61314:122;61338:8;:15;61334:1;:19;61314:122;;;61394:30;61404:8;61413:1;61404:11;;;;;;;;:::i;:::-;;;;;;;;61417:3;61421:1;61417:6;;;;;;;;:::i;:::-;;;;;;;;61394:9;:30::i;:::-;61375:13;61389:1;61375:16;;;;;;;;:::i;:::-;;;;;;;:49;;;;;61355:3;;;;:::i;:::-;;;61314:122;;;;61455:13;61448:20;;;60952:524;;;;:::o;77553:1129::-;26305:21;:19;:21::i;:::-;29077:19:::1;:17;:19::i;:::-;77771:1:::2;77754:6;;:13;;:18;;:61;;;;;77814:1;77793:10;;:17;;:22;;77754:61;:102;;;;;77855:1;77836:8;;:15;;:20;;77754:102;77732:175;;;;;;;;;;;;:::i;:::-;;;;;;;;;77957:10;;:17;;77940:6;;:13;;:34;:87;;;;;78012:8;;:15;;77995:6;;:13;;:32;77940:87;77918:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;78102:9;78097:578;78117:6;;:13;;78113:1;:17;78097:578;;;78205:5;78178:32;;:12;:23;78191:6;;78198:1;78191:9;;;;;;;:::i;:::-;;;;;;;;78178:23;;;;;;;;;;;;;;;;;;;;;:32;;;78152:125;;;;;;;;;;;;:::i;:::-;;;;;;;;;78346:10;78318:38;;:13;:24;78332:6;;78339:1;78332:9;;;;;;;:::i;:::-;;;;;;;;78318:24;;;;;;;;;;;;;;;;;;;;;:38;;;78292:132;;;;;;;;;;;;:::i;:::-;;;;;;;;;78439:54;78455:10;;78466:1;78455:13;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;78470:6;;78477:1;78470:9;;;;;;;:::i;:::-;;;;;;;;78481:8;;78490:1;78481:11;;;;;;;:::i;:::-;;;;;;;;78439:15;:54::i;:::-;78508:7;;;;;;;;;;;:20;;;78537:4;78544:10;78556:6;;78563:1;78556:9;;;;;;;:::i;:::-;;;;;;;;78508:58;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;78607:4;78581:12;:23;78594:6;;78601:1;78594:9;;;;;;;:::i;:::-;;;;;;;;78581:23;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;78626:37;78632:10;78644:8;;78653:1;78644:11;;;;;;;:::i;:::-;;;;;;;;78657:1;78626:37;;;;;;;;;;;::::0;:5:::2;:37::i;:::-;78132:3;;;;;:::i;:::-;;;;78097:578;;;;26349:20:::0;:18;:20::i;:::-;77553:1129;;;;;;:::o;29472:86::-;29519:4;29543:7;;;;;;;;;;;29536:14;;29472:86;:::o;76305:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;33492:89::-;31575:13;:11;:13::i;:::-;33567:6:::1;33557:7;;:16;;;;;;;;;;;;;;;;;;33492:89:::0;:::o;32337:103::-;31575:13;:11;:13::i;:::-;32402:30:::1;32429:1;32402:18;:30::i;:::-;32337:103::o:0;33387:97::-;31575:13;:11;:13::i;:::-;33470:6:::1;;33460:7;:16;;;;;;;:::i;:::-;;33387:97:::0;;:::o;76424:61::-;31575:13;:11;:13::i;:::-;76469:8:::1;:6;:8::i;:::-;76424:61::o:0;31689:87::-;31735:7;31762:6;;;;;;;;;;;31755:13;;31689:87;:::o;61549:155::-;61644:52;61663:12;:10;:12::i;:::-;61677:8;61687;61644:18;:52::i;:::-;61549:155;;:::o;76911:634::-;29077:19;:17;:19::i;:::-;26305:21:::1;:19;:21::i;:::-;77039:9:::2;77034:504;77054:6;;:13;;77050:1;:17;77034:504;;;77145:10;77115:40;;:7;;;;;;;;;;;:15;;;77131:6;;77138:1;77131:9;;;;;;;:::i;:::-;;;;;;;;77115:26;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:40;;;77089:135;;;;;;;;;;;;:::i;:::-;;;;;;;;;77292:5;77265:32;;:12;:23;77278:6;;77285:1;77278:9;;;;;;;:::i;:::-;;;;;;;;77265:23;;;;;;;;;;;;;;;;;;;;;:32;;;77239:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;77371:7;;;;;;;;;;;:20;;;77392:10;77412:4;77419:6;;77426:1;77419:9;;;;;;;:::i;:::-;;;;;;;;77371:58;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;77471:10;77444:13;:24;77458:6;;77465:1;77458:9;;;;;;;:::i;:::-;;;;;;;;77444:24;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;77522:4;77496:12;:23;77509:6;;77516:1;77509:9;;;;;;;:::i;:::-;;;;;;;;77496:23;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;77069:3;;;;;:::i;:::-;;;;77034:504;;;;26349:20:::1;:18;:20::i;:::-;76911:634:::0;;:::o;76802:101::-;31575:13;:11;:13::i;:::-;76886:8:::1;76868:7;;:27;;;;;;;;;;;;;;;;;;76802:101:::0;:::o;61776:168::-;61875:4;61899:18;:27;61918:7;61899:27;;;;;;;;;;;;;;;:37;61927:8;61899:37;;;;;;;;;;;;;;;;;;;;;;;;;61892:44;;61776:168;;;;:::o;62016:406::-;62232:12;:10;:12::i;:::-;62224:20;;:4;:20;;;:60;;;;62248:36;62265:4;62271:12;:10;:12::i;:::-;62248:16;:36::i;:::-;62224:60;62202:156;;;;;;;;;;;;:::i;:::-;;;;;;;;;62369:45;62387:4;62393:2;62397;62401:6;62409:4;62369:17;:45::i;:::-;62016:406;;;;;:::o;32595:201::-;31575:13;:11;:13::i;:::-;32704:1:::1;32684:22;;:8;:22;;;;32676:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;32760:28;32779:8;32760:18;:28::i;:::-;32595:201:::0;:::o;50860:157::-;50945:4;50984:25;50969:40;;;:11;:40;;;;50962:47;;50860:157;;;:::o;31854:132::-;31929:12;:10;:12::i;:::-;31918:23;;:7;:5;:7::i;:::-;:23;;;31910:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;31854:132::o;13305:716::-;13361:13;13412:14;13449:1;13429:17;13440:5;13429:10;:17::i;:::-;:21;13412:38;;13465:20;13499:6;13488:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13465:41;;13521:11;13650:6;13646:2;13642:15;13634:6;13630:28;13623:35;;13687:288;13694:4;13687:288;;;13719:5;;;;;;;;13861:8;13856:2;13849:5;13845:14;13840:30;13835:3;13827:44;13917:2;13908:11;;;;;;:::i;:::-;;;;;13951:1;13942:5;:10;13938:21;;;13954:5;;13938:21;13687:288;;;13996:6;13989:13;;;;;13305:716;;;:::o;27585:98::-;27638:7;27665:10;27658:17;;27585:98;:::o;64733:1146::-;64960:7;:14;64946:3;:10;:28;64938:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;65052:1;65038:16;;:2;:16;;;;65030:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;65109:16;65128:12;:10;:12::i;:::-;65109:31;;65153:60;65174:8;65184:4;65190:2;65194:3;65199:7;65208:4;65153:20;:60::i;:::-;65231:9;65226:421;65250:3;:10;65246:1;:14;65226:421;;;65282:10;65295:3;65299:1;65295:6;;;;;;;;:::i;:::-;;;;;;;;65282:19;;65316:14;65333:7;65341:1;65333:10;;;;;;;;:::i;:::-;;;;;;;;65316:27;;65360:19;65382:9;:13;65392:2;65382:13;;;;;;;;;;;:19;65396:4;65382:19;;;;;;;;;;;;;;;;65360:41;;65439:6;65424:11;:21;;65416:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;65572:6;65558:11;:20;65536:9;:13;65546:2;65536:13;;;;;;;;;;;:19;65550:4;65536:19;;;;;;;;;;;;;;;:42;;;;65629:6;65608:9;:13;65618:2;65608:13;;;;;;;;;;;:17;65622:2;65608:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;65267:380;;;65262:3;;;;:::i;:::-;;;65226:421;;;;65694:2;65664:47;;65688:4;65664:47;;65678:8;65664:47;;;65698:3;65703:7;65664:47;;;;;;;:::i;:::-;;;;;;;;65724:59;65744:8;65754:4;65760:2;65764:3;65769:7;65778:4;65724:19;:59::i;:::-;65796:75;65832:8;65842:4;65848:2;65852:3;65857:7;65866:4;65796:35;:75::i;:::-;64927:952;64733:1146;;;;;:::o;30327:120::-;29336:16;:14;:16::i;:::-;30396:5:::1;30386:7;;:15;;;;;;;;;;;;;;;;;;30417:22;30426:12;:10;:12::i;:::-;30417:22;;;;;;:::i;:::-;;;;;;;;30327:120::o:0;26385:293::-;25787:1;26519:7;;:19;;26511:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;25787:1;26652:7;:18;;;;26385:293::o;29631:108::-;29702:8;:6;:8::i;:::-;29701:9;29693:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;29631:108::o;34239:300::-;34381:17;34401:48;34411:26;34422:5;34429:7;34411:10;:26::i;:::-;34439:9;;34401:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:9;:48::i;:::-;34381:68;;34468:29;34487:9;34468:18;:29::i;:::-;34460:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;34370:169;34239:300;;;;:::o;67197:729::-;67364:1;67350:16;;:2;:16;;;;67342:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;67417:16;67436:12;:10;:12::i;:::-;67417:31;;67459:20;67482:21;67500:2;67482:17;:21::i;:::-;67459:44;;67514:24;67541:25;67559:6;67541:17;:25::i;:::-;67514:52;;67579:66;67600:8;67618:1;67622:2;67626:3;67631:7;67640:4;67579:20;:66::i;:::-;67679:6;67658:9;:13;67668:2;67658:13;;;;;;;;;;;:17;67672:2;67658:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;67738:2;67701:52;;67734:1;67701:52;;67716:8;67701:52;;;67742:2;67746:6;67701:52;;;;;;;:::i;:::-;;;;;;;;67766:65;67786:8;67804:1;67808:2;67812:3;67817:7;67826:4;67766:19;:65::i;:::-;67844:74;67875:8;67893:1;67897:2;67901;67905:6;67913:4;67844:30;:74::i;:::-;67331:595;;;67197:729;;;;:::o;26686:213::-;25743:1;26869:7;:22;;;;26686:213::o;32956:191::-;33030:16;33049:6;;;;;;;;;;;33030:25;;33075:8;33066:6;;:17;;;;;;;;;;;;;;;;;;33130:8;33099:40;;33120:8;33099:40;;;;;;;;;;;;33019:128;32956:191;:::o;30068:118::-;29077:19;:17;:19::i;:::-;30138:4:::1;30128:7;;:14;;;;;;;;;;;;;;;;;;30158:20;30165:12;:10;:12::i;:::-;30158:20;;;;;;:::i;:::-;;;;;;;;30068:118::o:0;71610:331::-;71765:8;71756:17;;:5;:17;;;;71748:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;71868:8;71830:18;:25;71849:5;71830:25;;;;;;;;;;;;;;;:35;71856:8;71830:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;71914:8;71892:41;;71907:5;71892:41;;;71924:8;71892:41;;;;;;:::i;:::-;;;;;;;;71610:331;;;:::o;63401:974::-;63603:1;63589:16;;:2;:16;;;;63581:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;63660:16;63679:12;:10;:12::i;:::-;63660:31;;63702:20;63725:21;63743:2;63725:17;:21::i;:::-;63702:44;;63757:24;63784:25;63802:6;63784:17;:25::i;:::-;63757:52;;63822:60;63843:8;63853:4;63859:2;63863:3;63868:7;63877:4;63822:20;:60::i;:::-;63895:19;63917:9;:13;63927:2;63917:13;;;;;;;;;;;:19;63931:4;63917:19;;;;;;;;;;;;;;;;63895:41;;63970:6;63955:11;:21;;63947:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;64095:6;64081:11;:20;64059:9;:13;64069:2;64059:13;;;;;;;;;;;:19;64073:4;64059:19;;;;;;;;;;;;;;;:42;;;;64144:6;64123:9;:13;64133:2;64123:13;;;;;;;;;;;:17;64137:2;64123:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;64199:2;64168:46;;64193:4;64168:46;;64183:8;64168:46;;;64203:2;64207:6;64168:46;;;;;;;:::i;:::-;;;;;;;;64227:59;64247:8;64257:4;64263:2;64267:3;64272:7;64281:4;64227:19;:59::i;:::-;64299:68;64330:8;64340:4;64346:2;64350;64354:6;64362:4;64299:30;:68::i;:::-;63570:805;;;;63401:974;;;;;:::o;10171:922::-;10224:7;10244:14;10261:1;10244:18;;10311:6;10302:5;:15;10298:102;;10347:6;10338:15;;;;;;:::i;:::-;;;;;10382:2;10372:12;;;;10298:102;10427:6;10418:5;:15;10414:102;;10463:6;10454:15;;;;;;:::i;:::-;;;;;10498:2;10488:12;;;;10414:102;10543:6;10534:5;:15;10530:102;;10579:6;10570:15;;;;;;:::i;:::-;;;;;10614:2;10604:12;;;;10530:102;10659:5;10650;:14;10646:99;;10694:5;10685:14;;;;;;:::i;:::-;;;;;10728:1;10718:11;;;;10646:99;10772:5;10763;:14;10759:99;;10807:5;10798:14;;;;;;:::i;:::-;;;;;10841:1;10831:11;;;;10759:99;10885:5;10876;:14;10872:99;;10920:5;10911:14;;;;;;:::i;:::-;;;;;10954:1;10944:11;;;;10872:99;10998:5;10989;:14;10985:66;;11034:1;11024:11;;;;10985:66;11079:6;11072:13;;;10171:922;;;:::o;78690:319::-;29077:19;:17;:19::i;:::-;78935:66:::1;78962:8;78972:4;78978:2;78982:3;78987:7;78996:4;78935:26;:66::i;:::-;78690:319:::0;;;;;;:::o;74075:220::-;;;;;;;:::o;75055:813::-;75295:15;:2;:13;;;:15::i;:::-;75291:570;;;75348:2;75331:43;;;75375:8;75385:4;75391:3;75396:7;75405:4;75331:79;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;75327:523;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;75723:6;75716:14;;;;;;;;;;;:::i;:::-;;;;;;;;75327:523;;;75772:62;;;;;;;;;;:::i;:::-;;;;;;;;75327:523;75504:48;;;75492:60;;;:8;:60;;;;75488:159;;75577:50;;;;;;;;;;:::i;:::-;;;;;;;;75488:159;75411:251;75291:570;75055:813;;;;;;:::o;29816:108::-;29883:8;:6;:8::i;:::-;29875:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;29816:108::o;33589:260::-;33691:7;33783:4;33790:10;33802:5;33809:7;33818;33764:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;33736:105;;;;;;33716:125;;33589:260;;;;:::o;33857:195::-;33964:7;33996:48;34034:9;33996:29;:4;:27;:29::i;:::-;:37;;:48;;;;:::i;:::-;33989:55;;33857:195;;;;:::o;34060:171::-;34174:4;34216:7;;;;;;;;;;;34203:20;;:9;:20;;;34196:27;;34060:171;;;:::o;75876:198::-;75942:16;75971:22;76010:1;75996:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75971:41;;76034:7;76023:5;76029:1;76023:8;;;;;;;;:::i;:::-;;;;;;;:18;;;;;76061:5;76054:12;;;75876:198;;;:::o;74303:744::-;74518:15;:2;:13;;;:15::i;:::-;74514:526;;;74571:2;74554:38;;;74593:8;74603:4;74609:2;74613:6;74621:4;74554:72;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;74550:479;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;74902:6;74895:14;;;;;;;;;;;:::i;:::-;;;;;;;;74550:479;;;74951:62;;;;;;;;;;:::i;:::-;;;;;;;;74550:479;74688:43;;;74676:55;;;:8;:55;;;;74672:154;;74756:50;;;;;;;;;;:::i;:::-;;;;;;;;74672:154;74627:214;74514:526;74303:744;;;;;;:::o;72899:221::-;;;;;;;:::o;35779:326::-;35839:4;36096:1;36074:7;:19;;;:23;36067:30;;35779:326;;;:::o;22645:269::-;22714:7;22900:4;22847:58;;;;;;;;:::i;:::-;;;;;;;;;;;;;22837:69;;;;;;22830:76;;22645:269;;;:::o;18955:231::-;19033:7;19054:17;19073:18;19095:27;19106:4;19112:9;19095:10;:27::i;:::-;19053:69;;;;19133:18;19145:5;19133:11;:18::i;:::-;19169:9;19162:16;;;;18955:231;;;;:::o;17406:747::-;17487:7;17496:12;17545:2;17525:9;:16;:22;17521:625;;;17564:9;17588;17612:7;17869:4;17858:9;17854:20;17848:27;17843:32;;17919:4;17908:9;17904:20;17898:27;17893:32;;17977:4;17966:9;17962:20;17956:27;17953:1;17948:36;17943:41;;18020:25;18031:4;18037:1;18040;18043;18020:10;:25::i;:::-;18013:32;;;;;;;;;17521:625;18094:1;18098:35;18078:56;;;;17406:747;;;;;;:::o;15799:521::-;15877:20;15868:29;;;;;;;;:::i;:::-;;:5;:29;;;;;;;;:::i;:::-;;;15864:449;;;15914:7;;15864:449;15975:29;15966:38;;;;;;;;:::i;:::-;;:5;:38;;;;;;;;:::i;:::-;;;15962:351;;;16021:34;;;;;;;;;;:::i;:::-;;;;;;;;15962:351;16086:35;16077:44;;;;;;;;:::i;:::-;;:5;:44;;;;;;;;:::i;:::-;;;16073:240;;;16138:41;;;;;;;;;;:::i;:::-;;;;;;;;16073:240;16210:30;16201:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;16197:116;;;16257:44;;;;;;;;;;:::i;:::-;;;;;;;;16197:116;15799:521;;:::o;20407:1520::-;20538:7;20547:12;21472:66;21467:1;21459:10;;:79;21455:163;;;21571:1;21575:30;21555:51;;;;;;21455:163;21715:14;21732:24;21742:4;21748:1;21751;21754;21732:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21715:41;;21789:1;21771:20;;:6;:20;;;21767:103;;;21824:1;21828:29;21808:50;;;;;;;21767:103;21890:6;21898:20;21882:37;;;;;20407:1520;;;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;769:::-;865:5;890:81;906:64;963:6;906:64;:::i;:::-;890:81;:::i;:::-;881:90;;991:5;1020:6;1013:5;1006:21;1054:4;1047:5;1043:16;1036:23;;1080:6;1130:3;1122:4;1114:6;1110:17;1105:3;1101:27;1098:36;1095:143;;;1149:79;;:::i;:::-;1095:143;1262:1;1247:238;1272:6;1269:1;1266:13;1247:238;;;1340:3;1369:37;1402:3;1390:10;1369:37;:::i;:::-;1364:3;1357:50;1436:4;1431:3;1427:14;1420:21;;1470:4;1465:3;1461:14;1454:21;;1307:178;1294:1;1291;1287:9;1282:14;;1247:238;;;1251:14;871:620;;769:722;;;;;:::o;1497:410::-;1574:5;1599:65;1615:48;1656:6;1615:48;:::i;:::-;1599:65;:::i;:::-;1590:74;;1687:6;1680:5;1673:21;1725:4;1718:5;1714:16;1763:3;1754:6;1749:3;1745:16;1742:25;1739:112;;;1770:79;;:::i;:::-;1739:112;1860:41;1894:6;1889:3;1884;1860:41;:::i;:::-;1580:327;1497:410;;;;;:::o;1913:412::-;1991:5;2016:66;2032:49;2074:6;2032:49;:::i;:::-;2016:66;:::i;:::-;2007:75;;2105:6;2098:5;2091:21;2143:4;2136:5;2132:16;2181:3;2172:6;2167:3;2163:16;2160:25;2157:112;;;2188:79;;:::i;:::-;2157:112;2278:41;2312:6;2307:3;2302;2278:41;:::i;:::-;1997:328;1913:412;;;;;:::o;2331:139::-;2377:5;2415:6;2402:20;2393:29;;2431:33;2458:5;2431:33;:::i;:::-;2331:139;;;;:::o;2476:143::-;2533:5;2564:6;2558:13;2549:22;;2580:33;2607:5;2580:33;:::i;:::-;2476:143;;;;:::o;2642:370::-;2713:5;2762:3;2755:4;2747:6;2743:17;2739:27;2729:122;;2770:79;;:::i;:::-;2729:122;2887:6;2874:20;2912:94;3002:3;2994:6;2987:4;2979:6;2975:17;2912:94;:::i;:::-;2903:103;;2719:293;2642:370;;;;:::o;3033:579::-;3117:8;3127:6;3177:3;3170:4;3162:6;3158:17;3154:27;3144:122;;3185:79;;:::i;:::-;3144:122;3298:6;3285:20;3275:30;;3328:18;3320:6;3317:30;3314:117;;;3350:79;;:::i;:::-;3314:117;3464:4;3456:6;3452:17;3440:29;;3518:3;3510:4;3502:6;3498:17;3488:8;3484:32;3481:41;3478:128;;;3525:79;;:::i;:::-;3478:128;3033:579;;;;;:::o;3635:568::-;3708:8;3718:6;3768:3;3761:4;3753:6;3749:17;3745:27;3735:122;;3776:79;;:::i;:::-;3735:122;3889:6;3876:20;3866:30;;3919:18;3911:6;3908:30;3905:117;;;3941:79;;:::i;:::-;3905:117;4055:4;4047:6;4043:17;4031:29;;4109:3;4101:4;4093:6;4089:17;4079:8;4075:32;4072:41;4069:128;;;4116:79;;:::i;:::-;4069:128;3635:568;;;;;:::o;4226:370::-;4297:5;4346:3;4339:4;4331:6;4327:17;4323:27;4313:122;;4354:79;;:::i;:::-;4313:122;4471:6;4458:20;4496:94;4586:3;4578:6;4571:4;4563:6;4559:17;4496:94;:::i;:::-;4487:103;;4303:293;4226:370;;;;:::o;4602:133::-;4645:5;4683:6;4670:20;4661:29;;4699:30;4723:5;4699:30;:::i;:::-;4602:133;;;;:::o;4741:137::-;4786:5;4824:6;4811:20;4802:29;;4840:32;4866:5;4840:32;:::i;:::-;4741:137;;;;:::o;4884:141::-;4940:5;4971:6;4965:13;4956:22;;4987:32;5013:5;4987:32;:::i;:::-;4884:141;;;;:::o;5044:338::-;5099:5;5148:3;5141:4;5133:6;5129:17;5125:27;5115:122;;5156:79;;:::i;:::-;5115:122;5273:6;5260:20;5298:78;5372:3;5364:6;5357:4;5349:6;5345:17;5298:78;:::i;:::-;5289:87;;5105:277;5044:338;;;;:::o;5402:553::-;5460:8;5470:6;5520:3;5513:4;5505:6;5501:17;5497:27;5487:122;;5528:79;;:::i;:::-;5487:122;5641:6;5628:20;5618:30;;5671:18;5663:6;5660:30;5657:117;;;5693:79;;:::i;:::-;5657:117;5807:4;5799:6;5795:17;5783:29;;5861:3;5853:4;5845:6;5841:17;5831:8;5827:32;5824:41;5821:128;;;5868:79;;:::i;:::-;5821:128;5402:553;;;;;:::o;5975:340::-;6031:5;6080:3;6073:4;6065:6;6061:17;6057:27;6047:122;;6088:79;;:::i;:::-;6047:122;6205:6;6192:20;6230:79;6305:3;6297:6;6290:4;6282:6;6278:17;6230:79;:::i;:::-;6221:88;;6037:278;5975:340;;;;:::o;6321:139::-;6367:5;6405:6;6392:20;6383:29;;6421:33;6448:5;6421:33;:::i;:::-;6321:139;;;;:::o;6466:329::-;6525:6;6574:2;6562:9;6553:7;6549:23;6545:32;6542:119;;;6580:79;;:::i;:::-;6542:119;6700:1;6725:53;6770:7;6761:6;6750:9;6746:22;6725:53;:::i;:::-;6715:63;;6671:117;6466:329;;;;:::o;6801:351::-;6871:6;6920:2;6908:9;6899:7;6895:23;6891:32;6888:119;;;6926:79;;:::i;:::-;6888:119;7046:1;7071:64;7127:7;7118:6;7107:9;7103:22;7071:64;:::i;:::-;7061:74;;7017:128;6801:351;;;;:::o;7158:474::-;7226:6;7234;7283:2;7271:9;7262:7;7258:23;7254:32;7251:119;;;7289:79;;:::i;:::-;7251:119;7409:1;7434:53;7479:7;7470:6;7459:9;7455:22;7434:53;:::i;:::-;7424:63;;7380:117;7536:2;7562:53;7607:7;7598:6;7587:9;7583:22;7562:53;:::i;:::-;7552:63;;7507:118;7158:474;;;;;:::o;7638:1509::-;7792:6;7800;7808;7816;7824;7873:3;7861:9;7852:7;7848:23;7844:33;7841:120;;;7880:79;;:::i;:::-;7841:120;8000:1;8025:53;8070:7;8061:6;8050:9;8046:22;8025:53;:::i;:::-;8015:63;;7971:117;8127:2;8153:53;8198:7;8189:6;8178:9;8174:22;8153:53;:::i;:::-;8143:63;;8098:118;8283:2;8272:9;8268:18;8255:32;8314:18;8306:6;8303:30;8300:117;;;8336:79;;:::i;:::-;8300:117;8441:78;8511:7;8502:6;8491:9;8487:22;8441:78;:::i;:::-;8431:88;;8226:303;8596:2;8585:9;8581:18;8568:32;8627:18;8619:6;8616:30;8613:117;;;8649:79;;:::i;:::-;8613:117;8754:78;8824:7;8815:6;8804:9;8800:22;8754:78;:::i;:::-;8744:88;;8539:303;8909:3;8898:9;8894:19;8881:33;8941:18;8933:6;8930:30;8927:117;;;8963:79;;:::i;:::-;8927:117;9068:62;9122:7;9113:6;9102:9;9098:22;9068:62;:::i;:::-;9058:72;;8852:288;7638:1509;;;;;;;;:::o;9153:1089::-;9257:6;9265;9273;9281;9289;9338:3;9326:9;9317:7;9313:23;9309:33;9306:120;;;9345:79;;:::i;:::-;9306:120;9465:1;9490:53;9535:7;9526:6;9515:9;9511:22;9490:53;:::i;:::-;9480:63;;9436:117;9592:2;9618:53;9663:7;9654:6;9643:9;9639:22;9618:53;:::i;:::-;9608:63;;9563:118;9720:2;9746:53;9791:7;9782:6;9771:9;9767:22;9746:53;:::i;:::-;9736:63;;9691:118;9848:2;9874:53;9919:7;9910:6;9899:9;9895:22;9874:53;:::i;:::-;9864:63;;9819:118;10004:3;9993:9;9989:19;9976:33;10036:18;10028:6;10025:30;10022:117;;;10058:79;;:::i;:::-;10022:117;10163:62;10217:7;10208:6;10197:9;10193:22;10163:62;:::i;:::-;10153:72;;9947:288;9153:1089;;;;;;;;:::o;10248:468::-;10313:6;10321;10370:2;10358:9;10349:7;10345:23;10341:32;10338:119;;;10376:79;;:::i;:::-;10338:119;10496:1;10521:53;10566:7;10557:6;10546:9;10542:22;10521:53;:::i;:::-;10511:63;;10467:117;10623:2;10649:50;10691:7;10682:6;10671:9;10667:22;10649:50;:::i;:::-;10639:60;;10594:115;10248:468;;;;;:::o;10722:474::-;10790:6;10798;10847:2;10835:9;10826:7;10822:23;10818:32;10815:119;;;10853:79;;:::i;:::-;10815:119;10973:1;10998:53;11043:7;11034:6;11023:9;11019:22;10998:53;:::i;:::-;10988:63;;10944:117;11100:2;11126:53;11171:7;11162:6;11151:9;11147:22;11126:53;:::i;:::-;11116:63;;11071:118;10722:474;;;;;:::o;11202:894::-;11320:6;11328;11377:2;11365:9;11356:7;11352:23;11348:32;11345:119;;;11383:79;;:::i;:::-;11345:119;11531:1;11520:9;11516:17;11503:31;11561:18;11553:6;11550:30;11547:117;;;11583:79;;:::i;:::-;11547:117;11688:78;11758:7;11749:6;11738:9;11734:22;11688:78;:::i;:::-;11678:88;;11474:302;11843:2;11832:9;11828:18;11815:32;11874:18;11866:6;11863:30;11860:117;;;11896:79;;:::i;:::-;11860:117;12001:78;12071:7;12062:6;12051:9;12047:22;12001:78;:::i;:::-;11991:88;;11786:303;11202:894;;;;;:::o;12102:559::-;12188:6;12196;12245:2;12233:9;12224:7;12220:23;12216:32;12213:119;;;12251:79;;:::i;:::-;12213:119;12399:1;12388:9;12384:17;12371:31;12429:18;12421:6;12418:30;12415:117;;;12451:79;;:::i;:::-;12415:117;12564:80;12636:7;12627:6;12616:9;12612:22;12564:80;:::i;:::-;12546:98;;;;12342:312;12102:559;;;;;:::o;12667:1331::-;12836:6;12844;12852;12860;12868;12876;12925:2;12913:9;12904:7;12900:23;12896:32;12893:119;;;12931:79;;:::i;:::-;12893:119;13079:1;13068:9;13064:17;13051:31;13109:18;13101:6;13098:30;13095:117;;;13131:79;;:::i;:::-;13095:117;13244:80;13316:7;13307:6;13296:9;13292:22;13244:80;:::i;:::-;13226:98;;;;13022:312;13401:2;13390:9;13386:18;13373:32;13432:18;13424:6;13421:30;13418:117;;;13454:79;;:::i;:::-;13418:117;13567:91;13650:7;13641:6;13630:9;13626:22;13567:91;:::i;:::-;13549:109;;;;13344:324;13735:2;13724:9;13720:18;13707:32;13766:18;13758:6;13755:30;13752:117;;;13788:79;;:::i;:::-;13752:117;13901:80;13973:7;13964:6;13953:9;13949:22;13901:80;:::i;:::-;13883:98;;;;13678:313;12667:1331;;;;;;;;:::o;14004:327::-;14062:6;14111:2;14099:9;14090:7;14086:23;14082:32;14079:119;;;14117:79;;:::i;:::-;14079:119;14237:1;14262:52;14306:7;14297:6;14286:9;14282:22;14262:52;:::i;:::-;14252:62;;14208:116;14004:327;;;;:::o;14337:349::-;14406:6;14455:2;14443:9;14434:7;14430:23;14426:32;14423:119;;;14461:79;;:::i;:::-;14423:119;14581:1;14606:63;14661:7;14652:6;14641:9;14637:22;14606:63;:::i;:::-;14596:73;;14552:127;14337:349;;;;:::o;14692:529::-;14763:6;14771;14820:2;14808:9;14799:7;14795:23;14791:32;14788:119;;;14826:79;;:::i;:::-;14788:119;14974:1;14963:9;14959:17;14946:31;15004:18;14996:6;14993:30;14990:117;;;15026:79;;:::i;:::-;14990:117;15139:65;15196:7;15187:6;15176:9;15172:22;15139:65;:::i;:::-;15121:83;;;;14917:297;14692:529;;;;;:::o;15227:509::-;15296:6;15345:2;15333:9;15324:7;15320:23;15316:32;15313:119;;;15351:79;;:::i;:::-;15313:119;15499:1;15488:9;15484:17;15471:31;15529:18;15521:6;15518:30;15515:117;;;15551:79;;:::i;:::-;15515:117;15656:63;15711:7;15702:6;15691:9;15687:22;15656:63;:::i;:::-;15646:73;;15442:287;15227:509;;;;:::o;15742:329::-;15801:6;15850:2;15838:9;15829:7;15825:23;15821:32;15818:119;;;15856:79;;:::i;:::-;15818:119;15976:1;16001:53;16046:7;16037:6;16026:9;16022:22;16001:53;:::i;:::-;15991:63;;15947:117;15742:329;;;;:::o;16077:179::-;16146:10;16167:46;16209:3;16201:6;16167:46;:::i;:::-;16245:4;16240:3;16236:14;16222:28;;16077:179;;;;:::o;16262:118::-;16349:24;16367:5;16349:24;:::i;:::-;16344:3;16337:37;16262:118;;:::o;16416:732::-;16535:3;16564:54;16612:5;16564:54;:::i;:::-;16634:86;16713:6;16708:3;16634:86;:::i;:::-;16627:93;;16744:56;16794:5;16744:56;:::i;:::-;16823:7;16854:1;16839:284;16864:6;16861:1;16858:13;16839:284;;;16940:6;16934:13;16967:63;17026:3;17011:13;16967:63;:::i;:::-;16960:70;;17053:60;17106:6;17053:60;:::i;:::-;17043:70;;16899:224;16886:1;16883;16879:9;16874:14;;16839:284;;;16843:14;17139:3;17132:10;;16540:608;;;16416:732;;;;:::o;17154:109::-;17235:21;17250:5;17235:21;:::i;:::-;17230:3;17223:34;17154:109;;:::o;17269:118::-;17356:24;17374:5;17356:24;:::i;:::-;17351:3;17344:37;17269:118;;:::o;17393:157::-;17498:45;17518:24;17536:5;17518:24;:::i;:::-;17498:45;:::i;:::-;17493:3;17486:58;17393:157;;:::o;17556:360::-;17642:3;17670:38;17702:5;17670:38;:::i;:::-;17724:70;17787:6;17782:3;17724:70;:::i;:::-;17717:77;;17803:52;17848:6;17843:3;17836:4;17829:5;17825:16;17803:52;:::i;:::-;17880:29;17902:6;17880:29;:::i;:::-;17875:3;17871:39;17864:46;;17646:270;17556:360;;;;:::o;17922:163::-;18025:53;18072:5;18025:53;:::i;:::-;18020:3;18013:66;17922:163;;:::o;18091:364::-;18179:3;18207:39;18240:5;18207:39;:::i;:::-;18262:71;18326:6;18321:3;18262:71;:::i;:::-;18255:78;;18342:52;18387:6;18382:3;18375:4;18368:5;18364:16;18342:52;:::i;:::-;18419:29;18441:6;18419:29;:::i;:::-;18414:3;18410:39;18403:46;;18183:272;18091:364;;;;:::o;18461:377::-;18567:3;18595:39;18628:5;18595:39;:::i;:::-;18650:89;18732:6;18727:3;18650:89;:::i;:::-;18643:96;;18748:52;18793:6;18788:3;18781:4;18774:5;18770:16;18748:52;:::i;:::-;18825:6;18820:3;18816:16;18809:23;;18571:267;18461:377;;;;:::o;18868:802::-;18953:3;18990:5;18984:12;19019:36;19045:9;19019:36;:::i;:::-;19071:71;19135:6;19130:3;19071:71;:::i;:::-;19064:78;;19173:1;19162:9;19158:17;19189:1;19184:135;;;;19333:1;19328:336;;;;19151:513;;19184:135;19268:4;19264:9;19253;19249:25;19244:3;19237:38;19304:4;19299:3;19295:14;19288:21;;19184:135;;19328:336;19395:38;19427:5;19395:38;:::i;:::-;19455:1;19469:154;19483:6;19480:1;19477:13;19469:154;;;19557:7;19551:14;19547:1;19542:3;19538:11;19531:35;19607:1;19598:7;19594:15;19583:26;;19505:4;19502:1;19498:12;19493:17;;19469:154;;;19652:1;19647:3;19643:11;19636:18;;19335:329;;19151:513;;18957:713;;18868:802;;;;:::o;19700:845::-;19803:3;19840:5;19834:12;19869:36;19895:9;19869:36;:::i;:::-;19921:89;20003:6;19998:3;19921:89;:::i;:::-;19914:96;;20041:1;20030:9;20026:17;20057:1;20052:137;;;;20203:1;20198:341;;;;20019:520;;20052:137;20136:4;20132:9;20121;20117:25;20112:3;20105:38;20172:6;20167:3;20163:16;20156:23;;20052:137;;20198:341;20265:38;20297:5;20265:38;:::i;:::-;20325:1;20339:154;20353:6;20350:1;20347:13;20339:154;;;20427:7;20421:14;20417:1;20412:3;20408:11;20401:35;20477:1;20468:7;20464:15;20453:26;;20375:4;20372:1;20368:12;20363:17;;20339:154;;;20522:6;20517:3;20513:16;20506:23;;20205:334;;20019:520;;19807:738;;19700:845;;;;:::o;20551:366::-;20693:3;20714:67;20778:2;20773:3;20714:67;:::i;:::-;20707:74;;20790:93;20879:3;20790:93;:::i;:::-;20908:2;20903:3;20899:12;20892:19;;20551:366;;;:::o;20923:::-;21065:3;21086:67;21150:2;21145:3;21086:67;:::i;:::-;21079:74;;21162:93;21251:3;21162:93;:::i;:::-;21280:2;21275:3;21271:12;21264:19;;20923:366;;;:::o;21295:::-;21437:3;21458:67;21522:2;21517:3;21458:67;:::i;:::-;21451:74;;21534:93;21623:3;21534:93;:::i;:::-;21652:2;21647:3;21643:12;21636:19;;21295:366;;;:::o;21667:::-;21809:3;21830:67;21894:2;21889:3;21830:67;:::i;:::-;21823:74;;21906:93;21995:3;21906:93;:::i;:::-;22024:2;22019:3;22015:12;22008:19;;21667:366;;;:::o;22039:::-;22181:3;22202:67;22266:2;22261:3;22202:67;:::i;:::-;22195:74;;22278:93;22367:3;22278:93;:::i;:::-;22396:2;22391:3;22387:12;22380:19;;22039:366;;;:::o;22411:402::-;22571:3;22592:85;22674:2;22669:3;22592:85;:::i;:::-;22585:92;;22686:93;22775:3;22686:93;:::i;:::-;22804:2;22799:3;22795:12;22788:19;;22411:402;;;:::o;22819:366::-;22961:3;22982:67;23046:2;23041:3;22982:67;:::i;:::-;22975:74;;23058:93;23147:3;23058:93;:::i;:::-;23176:2;23171:3;23167:12;23160:19;;22819:366;;;:::o;23191:::-;23333:3;23354:67;23418:2;23413:3;23354:67;:::i;:::-;23347:74;;23430:93;23519:3;23430:93;:::i;:::-;23548:2;23543:3;23539:12;23532:19;;23191:366;;;:::o;23563:::-;23705:3;23726:67;23790:2;23785:3;23726:67;:::i;:::-;23719:74;;23802:93;23891:3;23802:93;:::i;:::-;23920:2;23915:3;23911:12;23904:19;;23563:366;;;:::o;23935:::-;24077:3;24098:67;24162:2;24157:3;24098:67;:::i;:::-;24091:74;;24174:93;24263:3;24174:93;:::i;:::-;24292:2;24287:3;24283:12;24276:19;;23935:366;;;:::o;24307:::-;24449:3;24470:67;24534:2;24529:3;24470:67;:::i;:::-;24463:74;;24546:93;24635:3;24546:93;:::i;:::-;24664:2;24659:3;24655:12;24648:19;;24307:366;;;:::o;24679:::-;24821:3;24842:67;24906:2;24901:3;24842:67;:::i;:::-;24835:74;;24918:93;25007:3;24918:93;:::i;:::-;25036:2;25031:3;25027:12;25020:19;;24679:366;;;:::o;25051:::-;25193:3;25214:67;25278:2;25273:3;25214:67;:::i;:::-;25207:74;;25290:93;25379:3;25290:93;:::i;:::-;25408:2;25403:3;25399:12;25392:19;;25051:366;;;:::o;25423:::-;25565:3;25586:67;25650:2;25645:3;25586:67;:::i;:::-;25579:74;;25662:93;25751:3;25662:93;:::i;:::-;25780:2;25775:3;25771:12;25764:19;;25423:366;;;:::o;25795:::-;25937:3;25958:67;26022:2;26017:3;25958:67;:::i;:::-;25951:74;;26034:93;26123:3;26034:93;:::i;:::-;26152:2;26147:3;26143:12;26136:19;;25795:366;;;:::o;26167:::-;26309:3;26330:67;26394:2;26389:3;26330:67;:::i;:::-;26323:74;;26406:93;26495:3;26406:93;:::i;:::-;26524:2;26519:3;26515:12;26508:19;;26167:366;;;:::o;26539:::-;26681:3;26702:67;26766:2;26761:3;26702:67;:::i;:::-;26695:74;;26778:93;26867:3;26778:93;:::i;:::-;26896:2;26891:3;26887:12;26880:19;;26539:366;;;:::o;26911:::-;27053:3;27074:67;27138:2;27133:3;27074:67;:::i;:::-;27067:74;;27150:93;27239:3;27150:93;:::i;:::-;27268:2;27263:3;27259:12;27252:19;;26911:366;;;:::o;27283:::-;27425:3;27446:67;27510:2;27505:3;27446:67;:::i;:::-;27439:74;;27522:93;27611:3;27522:93;:::i;:::-;27640:2;27635:3;27631:12;27624:19;;27283:366;;;:::o;27655:::-;27797:3;27818:67;27882:2;27877:3;27818:67;:::i;:::-;27811:74;;27894:93;27983:3;27894:93;:::i;:::-;28012:2;28007:3;28003:12;27996:19;;27655:366;;;:::o;28027:::-;28169:3;28190:67;28254:2;28249:3;28190:67;:::i;:::-;28183:74;;28266:93;28355:3;28266:93;:::i;:::-;28384:2;28379:3;28375:12;28368:19;;28027:366;;;:::o;28399:::-;28541:3;28562:67;28626:2;28621:3;28562:67;:::i;:::-;28555:74;;28638:93;28727:3;28638:93;:::i;:::-;28756:2;28751:3;28747:12;28740:19;;28399:366;;;:::o;28771:::-;28913:3;28934:67;28998:2;28993:3;28934:67;:::i;:::-;28927:74;;29010:93;29099:3;29010:93;:::i;:::-;29128:2;29123:3;29119:12;29112:19;;28771:366;;;:::o;29143:::-;29285:3;29306:67;29370:2;29365:3;29306:67;:::i;:::-;29299:74;;29382:93;29471:3;29382:93;:::i;:::-;29500:2;29495:3;29491:12;29484:19;;29143:366;;;:::o;29515:::-;29657:3;29678:67;29742:2;29737:3;29678:67;:::i;:::-;29671:74;;29754:93;29843:3;29754:93;:::i;:::-;29872:2;29867:3;29863:12;29856:19;;29515:366;;;:::o;29887:::-;30029:3;30050:67;30114:2;30109:3;30050:67;:::i;:::-;30043:74;;30126:93;30215:3;30126:93;:::i;:::-;30244:2;30239:3;30235:12;30228:19;;29887:366;;;:::o;30259:108::-;30336:24;30354:5;30336:24;:::i;:::-;30331:3;30324:37;30259:108;;:::o;30373:118::-;30460:24;30478:5;30460:24;:::i;:::-;30455:3;30448:37;30373:118;;:::o;30497:112::-;30580:22;30596:5;30580:22;:::i;:::-;30575:3;30568:35;30497:112;;:::o;30615:429::-;30792:3;30814:92;30902:3;30893:6;30814:92;:::i;:::-;30807:99;;30923:95;31014:3;31005:6;30923:95;:::i;:::-;30916:102;;31035:3;31028:10;;30615:429;;;;;:::o;31050:522::-;31263:3;31285:148;31429:3;31285:148;:::i;:::-;31278:155;;31443:75;31514:3;31505:6;31443:75;:::i;:::-;31543:2;31538:3;31534:12;31527:19;;31563:3;31556:10;;31050:522;;;;:::o;31578:222::-;31671:4;31709:2;31698:9;31694:18;31686:26;;31722:71;31790:1;31779:9;31775:17;31766:6;31722:71;:::i;:::-;31578:222;;;;:::o;31806:1053::-;32129:4;32167:3;32156:9;32152:19;32144:27;;32181:71;32249:1;32238:9;32234:17;32225:6;32181:71;:::i;:::-;32262:72;32330:2;32319:9;32315:18;32306:6;32262:72;:::i;:::-;32381:9;32375:4;32371:20;32366:2;32355:9;32351:18;32344:48;32409:108;32512:4;32503:6;32409:108;:::i;:::-;32401:116;;32564:9;32558:4;32554:20;32549:2;32538:9;32534:18;32527:48;32592:108;32695:4;32686:6;32592:108;:::i;:::-;32584:116;;32748:9;32742:4;32738:20;32732:3;32721:9;32717:19;32710:49;32776:76;32847:4;32838:6;32776:76;:::i;:::-;32768:84;;31806:1053;;;;;;;;:::o;32865:442::-;33014:4;33052:2;33041:9;33037:18;33029:26;;33065:71;33133:1;33122:9;33118:17;33109:6;33065:71;:::i;:::-;33146:72;33214:2;33203:9;33199:18;33190:6;33146:72;:::i;:::-;33228;33296:2;33285:9;33281:18;33272:6;33228:72;:::i;:::-;32865:442;;;;;;:::o;33313:751::-;33536:4;33574:3;33563:9;33559:19;33551:27;;33588:71;33656:1;33645:9;33641:17;33632:6;33588:71;:::i;:::-;33669:72;33737:2;33726:9;33722:18;33713:6;33669:72;:::i;:::-;33751;33819:2;33808:9;33804:18;33795:6;33751:72;:::i;:::-;33833;33901:2;33890:9;33886:18;33877:6;33833:72;:::i;:::-;33953:9;33947:4;33943:20;33937:3;33926:9;33922:19;33915:49;33981:76;34052:4;34043:6;33981:76;:::i;:::-;33973:84;;33313:751;;;;;;;;:::o;34070:749::-;34292:4;34330:3;34319:9;34315:19;34307:27;;34344:71;34412:1;34401:9;34397:17;34388:6;34344:71;:::i;:::-;34425:72;34493:2;34482:9;34478:18;34469:6;34425:72;:::i;:::-;34507;34575:2;34564:9;34560:18;34551:6;34507:72;:::i;:::-;34589;34657:2;34646:9;34642:18;34633:6;34589:72;:::i;:::-;34709:9;34703:4;34699:20;34693:3;34682:9;34678:19;34671:49;34737:75;34807:4;34798:6;34737:75;:::i;:::-;34729:83;;34070:749;;;;;;;;:::o;34825:373::-;34968:4;35006:2;34995:9;34991:18;34983:26;;35055:9;35049:4;35045:20;35041:1;35030:9;35026:17;35019:47;35083:108;35186:4;35177:6;35083:108;:::i;:::-;35075:116;;34825:373;;;;:::o;35204:634::-;35425:4;35463:2;35452:9;35448:18;35440:26;;35512:9;35506:4;35502:20;35498:1;35487:9;35483:17;35476:47;35540:108;35643:4;35634:6;35540:108;:::i;:::-;35532:116;;35695:9;35689:4;35685:20;35680:2;35669:9;35665:18;35658:48;35723:108;35826:4;35817:6;35723:108;:::i;:::-;35715:116;;35204:634;;;;;:::o;35844:210::-;35931:4;35969:2;35958:9;35954:18;35946:26;;35982:65;36044:1;36033:9;36029:17;36020:6;35982:65;:::i;:::-;35844:210;;;;:::o;36060:545::-;36233:4;36271:3;36260:9;36256:19;36248:27;;36285:71;36353:1;36342:9;36338:17;36329:6;36285:71;:::i;:::-;36366:68;36430:2;36419:9;36415:18;36406:6;36366:68;:::i;:::-;36444:72;36512:2;36501:9;36497:18;36488:6;36444:72;:::i;:::-;36526;36594:2;36583:9;36579:18;36570:6;36526:72;:::i;:::-;36060:545;;;;;;;:::o;36611:254::-;36720:4;36758:2;36747:9;36743:18;36735:26;;36771:87;36855:1;36844:9;36840:17;36831:6;36771:87;:::i;:::-;36611:254;;;;:::o;36871:313::-;36984:4;37022:2;37011:9;37007:18;36999:26;;37071:9;37065:4;37061:20;37057:1;37046:9;37042:17;37035:47;37099:78;37172:4;37163:6;37099:78;:::i;:::-;37091:86;;36871:313;;;;:::o;37190:419::-;37356:4;37394:2;37383:9;37379:18;37371:26;;37443:9;37437:4;37433:20;37429:1;37418:9;37414:17;37407:47;37471:131;37597:4;37471:131;:::i;:::-;37463:139;;37190:419;;;:::o;37615:::-;37781:4;37819:2;37808:9;37804:18;37796:26;;37868:9;37862:4;37858:20;37854:1;37843:9;37839:17;37832:47;37896:131;38022:4;37896:131;:::i;:::-;37888:139;;37615:419;;;:::o;38040:::-;38206:4;38244:2;38233:9;38229:18;38221:26;;38293:9;38287:4;38283:20;38279:1;38268:9;38264:17;38257:47;38321:131;38447:4;38321:131;:::i;:::-;38313:139;;38040:419;;;:::o;38465:::-;38631:4;38669:2;38658:9;38654:18;38646:26;;38718:9;38712:4;38708:20;38704:1;38693:9;38689:17;38682:47;38746:131;38872:4;38746:131;:::i;:::-;38738:139;;38465:419;;;:::o;38890:::-;39056:4;39094:2;39083:9;39079:18;39071:26;;39143:9;39137:4;39133:20;39129:1;39118:9;39114:17;39107:47;39171:131;39297:4;39171:131;:::i;:::-;39163:139;;38890:419;;;:::o;39315:::-;39481:4;39519:2;39508:9;39504:18;39496:26;;39568:9;39562:4;39558:20;39554:1;39543:9;39539:17;39532:47;39596:131;39722:4;39596:131;:::i;:::-;39588:139;;39315:419;;;:::o;39740:::-;39906:4;39944:2;39933:9;39929:18;39921:26;;39993:9;39987:4;39983:20;39979:1;39968:9;39964:17;39957:47;40021:131;40147:4;40021:131;:::i;:::-;40013:139;;39740:419;;;:::o;40165:::-;40331:4;40369:2;40358:9;40354:18;40346:26;;40418:9;40412:4;40408:20;40404:1;40393:9;40389:17;40382:47;40446:131;40572:4;40446:131;:::i;:::-;40438:139;;40165:419;;;:::o;40590:::-;40756:4;40794:2;40783:9;40779:18;40771:26;;40843:9;40837:4;40833:20;40829:1;40818:9;40814:17;40807:47;40871:131;40997:4;40871:131;:::i;:::-;40863:139;;40590:419;;;:::o;41015:::-;41181:4;41219:2;41208:9;41204:18;41196:26;;41268:9;41262:4;41258:20;41254:1;41243:9;41239:17;41232:47;41296:131;41422:4;41296:131;:::i;:::-;41288:139;;41015:419;;;:::o;41440:::-;41606:4;41644:2;41633:9;41629:18;41621:26;;41693:9;41687:4;41683:20;41679:1;41668:9;41664:17;41657:47;41721:131;41847:4;41721:131;:::i;:::-;41713:139;;41440:419;;;:::o;41865:::-;42031:4;42069:2;42058:9;42054:18;42046:26;;42118:9;42112:4;42108:20;42104:1;42093:9;42089:17;42082:47;42146:131;42272:4;42146:131;:::i;:::-;42138:139;;41865:419;;;:::o;42290:::-;42456:4;42494:2;42483:9;42479:18;42471:26;;42543:9;42537:4;42533:20;42529:1;42518:9;42514:17;42507:47;42571:131;42697:4;42571:131;:::i;:::-;42563:139;;42290:419;;;:::o;42715:::-;42881:4;42919:2;42908:9;42904:18;42896:26;;42968:9;42962:4;42958:20;42954:1;42943:9;42939:17;42932:47;42996:131;43122:4;42996:131;:::i;:::-;42988:139;;42715:419;;;:::o;43140:::-;43306:4;43344:2;43333:9;43329:18;43321:26;;43393:9;43387:4;43383:20;43379:1;43368:9;43364:17;43357:47;43421:131;43547:4;43421:131;:::i;:::-;43413:139;;43140:419;;;:::o;43565:::-;43731:4;43769:2;43758:9;43754:18;43746:26;;43818:9;43812:4;43808:20;43804:1;43793:9;43789:17;43782:47;43846:131;43972:4;43846:131;:::i;:::-;43838:139;;43565:419;;;:::o;43990:::-;44156:4;44194:2;44183:9;44179:18;44171:26;;44243:9;44237:4;44233:20;44229:1;44218:9;44214:17;44207:47;44271:131;44397:4;44271:131;:::i;:::-;44263:139;;43990:419;;;:::o;44415:::-;44581:4;44619:2;44608:9;44604:18;44596:26;;44668:9;44662:4;44658:20;44654:1;44643:9;44639:17;44632:47;44696:131;44822:4;44696:131;:::i;:::-;44688:139;;44415:419;;;:::o;44840:::-;45006:4;45044:2;45033:9;45029:18;45021:26;;45093:9;45087:4;45083:20;45079:1;45068:9;45064:17;45057:47;45121:131;45247:4;45121:131;:::i;:::-;45113:139;;44840:419;;;:::o;45265:::-;45431:4;45469:2;45458:9;45454:18;45446:26;;45518:9;45512:4;45508:20;45504:1;45493:9;45489:17;45482:47;45546:131;45672:4;45546:131;:::i;:::-;45538:139;;45265:419;;;:::o;45690:::-;45856:4;45894:2;45883:9;45879:18;45871:26;;45943:9;45937:4;45933:20;45929:1;45918:9;45914:17;45907:47;45971:131;46097:4;45971:131;:::i;:::-;45963:139;;45690:419;;;:::o;46115:::-;46281:4;46319:2;46308:9;46304:18;46296:26;;46368:9;46362:4;46358:20;46354:1;46343:9;46339:17;46332:47;46396:131;46522:4;46396:131;:::i;:::-;46388:139;;46115:419;;;:::o;46540:::-;46706:4;46744:2;46733:9;46729:18;46721:26;;46793:9;46787:4;46783:20;46779:1;46768:9;46764:17;46757:47;46821:131;46947:4;46821:131;:::i;:::-;46813:139;;46540:419;;;:::o;46965:::-;47131:4;47169:2;47158:9;47154:18;47146:26;;47218:9;47212:4;47208:20;47204:1;47193:9;47189:17;47182:47;47246:131;47372:4;47246:131;:::i;:::-;47238:139;;46965:419;;;:::o;47390:::-;47556:4;47594:2;47583:9;47579:18;47571:26;;47643:9;47637:4;47633:20;47629:1;47618:9;47614:17;47607:47;47671:131;47797:4;47671:131;:::i;:::-;47663:139;;47390:419;;;:::o;47815:222::-;47908:4;47946:2;47935:9;47931:18;47923:26;;47959:71;48027:1;48016:9;48012:17;48003:6;47959:71;:::i;:::-;47815:222;;;;:::o;48043:332::-;48164:4;48202:2;48191:9;48187:18;48179:26;;48215:71;48283:1;48272:9;48268:17;48259:6;48215:71;:::i;:::-;48296:72;48364:2;48353:9;48349:18;48340:6;48296:72;:::i;:::-;48043:332;;;;;:::o;48381:724::-;48458:4;48464:6;48520:11;48507:25;48620:1;48614:4;48610:12;48599:8;48583:14;48579:29;48575:48;48555:18;48551:73;48541:168;;48628:79;;:::i;:::-;48541:168;48740:18;48730:8;48726:33;48718:41;;48792:4;48779:18;48769:28;;48820:18;48812:6;48809:30;48806:117;;;48842:79;;:::i;:::-;48806:117;48950:2;48944:4;48940:13;48932:21;;49007:4;48999:6;48995:17;48979:14;48975:38;48969:4;48965:49;48962:136;;;49017:79;;:::i;:::-;48962:136;48471:634;48381:724;;;;;:::o;49111:129::-;49145:6;49172:20;;:::i;:::-;49162:30;;49201:33;49229:4;49221:6;49201:33;:::i;:::-;49111:129;;;:::o;49246:75::-;49279:6;49312:2;49306:9;49296:19;;49246:75;:::o;49327:311::-;49404:4;49494:18;49486:6;49483:30;49480:56;;;49516:18;;:::i;:::-;49480:56;49566:4;49558:6;49554:17;49546:25;;49626:4;49620;49616:15;49608:23;;49327:311;;;:::o;49644:::-;49721:4;49811:18;49803:6;49800:30;49797:56;;;49833:18;;:::i;:::-;49797:56;49883:4;49875:6;49871:17;49863:25;;49943:4;49937;49933:15;49925:23;;49644:311;;;:::o;49961:307::-;50022:4;50112:18;50104:6;50101:30;50098:56;;;50134:18;;:::i;:::-;50098:56;50172:29;50194:6;50172:29;:::i;:::-;50164:37;;50256:4;50250;50246:15;50238:23;;49961:307;;;:::o;50274:308::-;50336:4;50426:18;50418:6;50415:30;50412:56;;;50448:18;;:::i;:::-;50412:56;50486:29;50508:6;50486:29;:::i;:::-;50478:37;;50570:4;50564;50560:15;50552:23;;50274:308;;;:::o;50588:132::-;50655:4;50678:3;50670:11;;50708:4;50703:3;50699:14;50691:22;;50588:132;;;:::o;50726:141::-;50775:4;50798:3;50790:11;;50821:3;50818:1;50811:14;50855:4;50852:1;50842:18;50834:26;;50726:141;;;:::o;50873:114::-;50940:6;50974:5;50968:12;50958:22;;50873:114;;;:::o;50993:98::-;51044:6;51078:5;51072:12;51062:22;;50993:98;;;:::o;51097:99::-;51149:6;51183:5;51177:12;51167:22;;51097:99;;;:::o;51202:113::-;51272:4;51304;51299:3;51295:14;51287:22;;51202:113;;;:::o;51321:184::-;51420:11;51454:6;51449:3;51442:19;51494:4;51489:3;51485:14;51470:29;;51321:184;;;;:::o;51511:168::-;51594:11;51628:6;51623:3;51616:19;51668:4;51663:3;51659:14;51644:29;;51511:168;;;;:::o;51685:169::-;51769:11;51803:6;51798:3;51791:19;51843:4;51838:3;51834:14;51819:29;;51685:169;;;;:::o;51860:148::-;51962:11;51999:3;51984:18;;51860:148;;;;:::o;52014:305::-;52054:3;52073:20;52091:1;52073:20;:::i;:::-;52068:25;;52107:20;52125:1;52107:20;:::i;:::-;52102:25;;52261:1;52193:66;52189:74;52186:1;52183:81;52180:107;;;52267:18;;:::i;:::-;52180:107;52311:1;52308;52304:9;52297:16;;52014:305;;;;:::o;52325:96::-;52362:7;52391:24;52409:5;52391:24;:::i;:::-;52380:35;;52325:96;;;:::o;52427:90::-;52461:7;52504:5;52497:13;52490:21;52479:32;;52427:90;;;:::o;52523:77::-;52560:7;52589:5;52578:16;;52523:77;;;:::o;52606:149::-;52642:7;52682:66;52675:5;52671:78;52660:89;;52606:149;;;:::o;52761:126::-;52798:7;52838:42;52831:5;52827:54;52816:65;;52761:126;;;:::o;52893:77::-;52930:7;52959:5;52948:16;;52893:77;;;:::o;52976:86::-;53011:7;53051:4;53044:5;53040:16;53029:27;;52976:86;;;:::o;53068:142::-;53134:9;53167:37;53198:5;53167:37;:::i;:::-;53154:50;;53068:142;;;:::o;53216:126::-;53266:9;53299:37;53330:5;53299:37;:::i;:::-;53286:50;;53216:126;;;:::o;53348:113::-;53398:9;53431:24;53449:5;53431:24;:::i;:::-;53418:37;;53348:113;;;:::o;53467:154::-;53551:6;53546:3;53541;53528:30;53613:1;53604:6;53599:3;53595:16;53588:27;53467:154;;;:::o;53627:307::-;53695:1;53705:113;53719:6;53716:1;53713:13;53705:113;;;53804:1;53799:3;53795:11;53789:18;53785:1;53780:3;53776:11;53769:39;53741:2;53738:1;53734:10;53729:15;;53705:113;;;53836:6;53833:1;53830:13;53827:101;;;53916:1;53907:6;53902:3;53898:16;53891:27;53827:101;53676:258;53627:307;;;:::o;53940:320::-;53984:6;54021:1;54015:4;54011:12;54001:22;;54068:1;54062:4;54058:12;54089:18;54079:81;;54145:4;54137:6;54133:17;54123:27;;54079:81;54207:2;54199:6;54196:14;54176:18;54173:38;54170:84;;;54226:18;;:::i;:::-;54170:84;53991:269;53940:320;;;:::o;54266:281::-;54349:27;54371:4;54349:27;:::i;:::-;54341:6;54337:40;54479:6;54467:10;54464:22;54443:18;54431:10;54428:34;54425:62;54422:88;;;54490:18;;:::i;:::-;54422:88;54530:10;54526:2;54519:22;54309:238;54266:281;;:::o;54553:233::-;54592:3;54615:24;54633:5;54615:24;:::i;:::-;54606:33;;54661:66;54654:5;54651:77;54648:103;;;54731:18;;:::i;:::-;54648:103;54778:1;54771:5;54767:13;54760:20;;54553:233;;;:::o;54792:79::-;54831:7;54860:5;54849:16;;54792:79;;;:::o;54877:180::-;54925:77;54922:1;54915:88;55022:4;55019:1;55012:15;55046:4;55043:1;55036:15;55063:180;55111:77;55108:1;55101:88;55208:4;55205:1;55198:15;55232:4;55229:1;55222:15;55249:180;55297:77;55294:1;55287:88;55394:4;55391:1;55384:15;55418:4;55415:1;55408:15;55435:180;55483:77;55480:1;55473:88;55580:4;55577:1;55570:15;55604:4;55601:1;55594:15;55621:180;55669:77;55666:1;55659:88;55766:4;55763:1;55756:15;55790:4;55787:1;55780:15;55807:180;55855:77;55852:1;55845:88;55952:4;55949:1;55942:15;55976:4;55973:1;55966:15;55993:183;56028:3;56066:1;56048:16;56045:23;56042:128;;;56104:1;56101;56098;56083:23;56126:34;56157:1;56151:8;56126:34;:::i;:::-;56119:41;;56042:128;55993:183;:::o;56182:117::-;56291:1;56288;56281:12;56305:117;56414:1;56411;56404:12;56428:117;56537:1;56534;56527:12;56551:117;56660:1;56657;56650:12;56674:117;56783:1;56780;56773:12;56797:117;56906:1;56903;56896:12;56920:117;57029:1;57026;57019:12;57043:117;57152:1;57149;57142:12;57166:117;57275:1;57272;57265:12;57289:102;57330:6;57381:2;57377:7;57372:2;57365:5;57361:14;57357:28;57347:38;;57289:102;;;:::o;57397:106::-;57441:8;57490:5;57485:3;57481:15;57460:36;;57397:106;;;:::o;57509:174::-;57649:26;57645:1;57637:6;57633:14;57626:50;57509:174;:::o;57689:227::-;57829:34;57825:1;57817:6;57813:14;57806:58;57898:10;57893:2;57885:6;57881:15;57874:35;57689:227;:::o;57922:170::-;58062:22;58058:1;58050:6;58046:14;58039:46;57922:170;:::o;58098:173::-;58238:25;58234:1;58226:6;58222:14;58215:49;58098:173;:::o;58277:181::-;58417:33;58413:1;58405:6;58401:14;58394:57;58277:181;:::o;58464:214::-;58604:66;58600:1;58592:6;58588:14;58581:90;58464:214;:::o;58684:181::-;58824:33;58820:1;58812:6;58808:14;58801:57;58684:181;:::o;58871:173::-;59011:25;59007:1;58999:6;58995:14;58988:49;58871:173;:::o;59050:225::-;59190:34;59186:1;59178:6;59174:14;59167:58;59259:8;59254:2;59246:6;59242:15;59235:33;59050:225;:::o;59281:229::-;59421:34;59417:1;59409:6;59405:14;59398:58;59490:12;59485:2;59477:6;59473:15;59466:37;59281:229;:::o;59516:233::-;59656:34;59652:1;59644:6;59640:14;59633:58;59725:16;59720:2;59712:6;59708:15;59701:41;59516:233;:::o;59755:221::-;59895:34;59891:1;59883:6;59879:14;59872:58;59964:4;59959:2;59951:6;59947:15;59940:29;59755:221;:::o;59982:166::-;60122:18;60118:1;60110:6;60106:14;60099:42;59982:166;:::o;60154:224::-;60294:34;60290:1;60282:6;60278:14;60271:58;60363:7;60358:2;60350:6;60346:15;60339:32;60154:224;:::o;60384:181::-;60524:33;60520:1;60512:6;60508:14;60501:57;60384:181;:::o;60571:220::-;60711:34;60707:1;60699:6;60695:14;60688:58;60780:3;60775:2;60767:6;60763:15;60756:28;60571:220;:::o;60797:229::-;60937:34;60933:1;60925:6;60921:14;60914:58;61006:12;61001:2;60993:6;60989:15;60982:37;60797:229;:::o;61032:182::-;61172:34;61168:1;61160:6;61156:14;61149:58;61032:182;:::o;61220:179::-;61360:31;61356:1;61348:6;61344:14;61337:55;61220:179;:::o;61405:182::-;61545:34;61541:1;61533:6;61529:14;61522:58;61405:182;:::o;61593:228::-;61733:34;61729:1;61721:6;61717:14;61710:58;61802:11;61797:2;61789:6;61785:15;61778:36;61593:228;:::o;61827:::-;61967:34;61963:1;61955:6;61951:14;61944:58;62036:11;62031:2;62023:6;62019:15;62012:36;61827:228;:::o;62061:227::-;62201:34;62197:1;62189:6;62185:14;62178:58;62270:10;62265:2;62257:6;62253:15;62246:35;62061:227;:::o;62294:220::-;62434:34;62430:1;62422:6;62418:14;62411:58;62503:3;62498:2;62490:6;62486:15;62479:28;62294:220;:::o;62520:181::-;62660:33;62656:1;62648:6;62644:14;62637:57;62520:181;:::o;62707:239::-;62847:34;62843:1;62835:6;62831:14;62824:58;62916:22;62911:2;62903:6;62899:15;62892:47;62707:239;:::o;62952:711::-;62991:3;63029:4;63011:16;63008:26;63005:39;;;63037:5;;63005:39;63066:20;;:::i;:::-;63141:1;63123:16;63119:24;63116:1;63110:4;63095:49;63174:4;63168:11;63273:16;63266:4;63258:6;63254:17;63251:39;63218:18;63210:6;63207:30;63191:113;63188:146;;;63319:5;;;;63188:146;63365:6;63359:4;63355:17;63401:3;63395:10;63428:18;63420:6;63417:30;63414:43;;;63450:5;;;;;;63414:43;63498:6;63491:4;63486:3;63482:14;63478:27;63557:1;63539:16;63535:24;63529:4;63525:35;63520:3;63517:44;63514:57;;;63564:5;;;;;;;63514:57;63581;63629:6;63623:4;63619:17;63611:6;63607:30;63601:4;63581:57;:::i;:::-;63654:3;63647:10;;62995:668;;;;;62952:711;;:::o;63669:122::-;63742:24;63760:5;63742:24;:::i;:::-;63735:5;63732:35;63722:63;;63781:1;63778;63771:12;63722:63;63669:122;:::o;63797:116::-;63867:21;63882:5;63867:21;:::i;:::-;63860:5;63857:32;63847:60;;63903:1;63900;63893:12;63847:60;63797:116;:::o;63919:120::-;63991:23;64008:5;63991:23;:::i;:::-;63984:5;63981:34;63971:62;;64029:1;64026;64019:12;63971:62;63919:120;:::o;64045:122::-;64118:24;64136:5;64118:24;:::i;:::-;64111:5;64108:35;64098:63;;64157:1;64154;64147:12;64098:63;64045:122;:::o
Swarm Source
ipfs://123580584a1442918f9b29e68acce99b6df065f26df88701137c1306a4731f09
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.