Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
8,888 EoF
Holders
3,189
Market
Volume (24H)
0.0004 ETH
Min Price (24H)
$0.25 @ 0.000099 ETH
Max Price (24H)
$0.25 @ 0.000100 ETH
Other Info
Token Contract
Balance
1 EoFLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
EyesofFashionNFT
Compiler Version
v0.8.0+commit.c7dfd78e
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: MIT // File: @openzeppelin/contracts/utils/Counters.sol // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @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] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/utils/cryptography/ECDSA.sol // OpenZeppelin Contracts v4.4.1 (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 } 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"); } else if (error == RecoverError.InvalidSignatureV) { revert("ECDSA: invalid signature 'v' 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) { // Check the signature length // - case 65: r,s,v signature (standard) // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._ 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. 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 if (signature.length == 64) { bytes32 r; bytes32 vs; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) vs := mload(add(signature, 0x40)) } return tryRecover(hash, r, vs); } 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; uint8 v; assembly { s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) v := add(shr(255, vs), 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 (v != 27 && v != 28) { return (address(0), RecoverError.InvalidSignatureV); } // 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/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (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 Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts v4.4.1 (utils/Address.sol) pragma solidity ^0.8.0; /** * @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 * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 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 functionCall(target, data, "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"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(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) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(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) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason 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 { // 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 assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: contracts/Whitelisted.sol pragma solidity ^0.8.0; // Author: @sinta90210 contract Whitelisted { using ECDSA for bytes32; using Address for address; address internal _signer; constructor(address signer) { _signer = signer; } // @dev Assumes the signed message was human-readable msg.sender address (lowercase, without the '0x') modifier isValidWhitelistSignature(bytes memory signature) { bytes32 messageHash = toEthSignedMessageHash(asciiSender()); address signer = messageHash.recover(signature); require(signer == _signer, "Invalid whitelist signature"); _; } function recoveredAddress(bytes memory signature) public view returns (bytes memory) { address recoveredSigner = recover(signature); return abi.encodePacked(recoveredSigner); } function recover(bytes memory signature) public view returns (address) { bytes32 messageHash = toEthSignedMessageHash(asciiSender()); address recoveredSigner = messageHash.recover(signature); return recoveredSigner; } function generateSenderHash() public view returns (bytes32) { return toEthSignedMessageHash(asciiSender()); } // @dev Because at time of writing, 5b28...3cc0 hasn't made it into OpenZeppelin ECDSA release yet. // @dev https://github.com/OpenZeppelin/openzeppelin-contracts/commit/5b28259dacf47fc208e03611eb3ba8eeaed63cc0#diff-ff09871806bcccfd38e43de481f3e7e2fb92134c58e1a1f97b054e2d0d727458R209 function toEthSignedMessageHash(string memory s) public pure returns (bytes32) { bytes memory b = bytes(s); return keccak256( abi.encodePacked( "\x19Ethereum Signed Message:\n", Strings.toString(b.length), b ) ); } function asciiSender() public view returns (string memory) { return toAsciiString(msg.sender); } function toAsciiString(address x) internal pure returns (string memory) { bytes memory s = new bytes(40); for (uint256 i = 0; i < 20; i++) { bytes1 b = bytes1(uint8(uint256(uint160(x)) / (2 ** (8 * (19 - i))))); bytes1 hi = bytes1(uint8(b) / 16); bytes1 lo = bytes1(uint8(b) - 16 * uint8(hi)); s[2 * i] = char(hi); s[2 * i + 1] = char(lo); } return string(s); } function char(bytes1 b) internal pure returns (bytes1 c) { return (uint8(b) < 10) ? bytes1(uint8(b) + 0x30) : bytes1(uint8(b) + 0x57); } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts v4.4.1 (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`, 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 be 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: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * 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 Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @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 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); /** * @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; } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // File: contracts/EyesofFashionNFT.sol pragma solidity >=0.7.0 <0.9.0; contract EyesofFashionNFT is ERC721, Ownable, Whitelisted { using Strings for uint256; using Counters for Counters.Counter; Counters.Counter private supply; string public uriPrefix = ""; string public uriSuffix = ".json"; string public hiddenMetadataUri; uint256 public cost = 0.08 ether; uint256 public maxSupply = 8888; uint256 public maxMintAmountPerTx = 5; uint256 public nftPerAddressLimit = 5; bool public paused = true; bool public revealed = false; bool public onlyWhitelisted = true; mapping(address => uint256) public addressMintedBalance; constructor() ERC721("EyesofFashionNFT", "EoF") Whitelisted(0xD17b6fF2496FC08D33FD34971d9253e1f3d74Fe3) { setHiddenMetadataUri("ipfs://QmaD2K8ZcBrtQCn1UfDmQ1rtWsc6gdfwBR95Mhz2dFV1z5/hidden.json"); } modifier mintCompliance(uint256 _mintAmount) { require(_mintAmount > 0 && _mintAmount <= maxMintAmountPerTx, "Invalid mint amount!"); require(supply.current() + _mintAmount <= maxSupply, "Max supply exceeded!"); _; } function totalSupply() public view returns (uint256) { return supply.current(); } function presaleMint(bytes memory signature, uint256 _mintAmount) public payable mintCompliance(_mintAmount) isValidWhitelistSignature(signature) { require(!paused, "The contract is paused!"); require(onlyWhitelisted, "Public mode is active"); require(msg.value >= cost * _mintAmount, "Insufficient funds!"); uint256 ownerMintedCount = addressMintedBalance[msg.sender]; require(ownerMintedCount + _mintAmount <= nftPerAddressLimit, "max NFT per address exceeded"); _mintLoop(msg.sender, _mintAmount); } function mint(uint256 _mintAmount) public payable mintCompliance(_mintAmount) { require(!paused, "The contract is paused!"); require(!onlyWhitelisted, "Presale mode is active"); require(msg.value >= cost * _mintAmount, "Insufficient funds!"); _mintLoop(msg.sender, _mintAmount); } function ownerMint(uint256 _mintAmount) public onlyOwner { _mintLoop(msg.sender, _mintAmount); } function mintForAddress(uint256 _mintAmount, address _receiver) public mintCompliance(_mintAmount) onlyOwner { _mintLoop(_receiver, _mintAmount); } function walletOfOwner(address _owner) public view returns (uint256[] memory) { uint256 ownerTokenCount = balanceOf(_owner); uint256[] memory ownedTokenIds = new uint256[](ownerTokenCount); uint256 currentTokenId = 1; uint256 ownedTokenIndex = 0; while (ownedTokenIndex < ownerTokenCount && currentTokenId <= maxSupply) { address currentTokenOwner = ownerOf(currentTokenId); if (currentTokenOwner == _owner) { ownedTokenIds[ownedTokenIndex] = currentTokenId; ownedTokenIndex++; } currentTokenId++; } return ownedTokenIds; } function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) { require( _exists(_tokenId), "ERC721Metadata: URI query for nonexistent token" ); if (revealed == false) { return hiddenMetadataUri; } string memory currentBaseURI = _baseURI(); return bytes(currentBaseURI).length > 0 ? string(abi.encodePacked(currentBaseURI, _tokenId.toString(), uriSuffix)) : ""; } function setRevealed(bool _state) public onlyOwner { revealed = _state; } function setCost(uint256 _cost) public onlyOwner { cost = _cost; } function setMaxMintAmountPerTx(uint256 _maxMintAmountPerTx) public onlyOwner { maxMintAmountPerTx = _maxMintAmountPerTx; } function setHiddenMetadataUri(string memory _hiddenMetadataUri) public onlyOwner { hiddenMetadataUri = _hiddenMetadataUri; } function setUriPrefix(string memory _uriPrefix) public onlyOwner { uriPrefix = _uriPrefix; } function setUriSuffix(string memory _uriSuffix) public onlyOwner { uriSuffix = _uriSuffix; } function setPaused(bool _state) public onlyOwner { paused = _state; } function setOnlyWhitelisted(bool _state) public onlyOwner { onlyWhitelisted = _state; } function withdraw() public onlyOwner { (bool os, ) = payable(owner()).call{value: address(this).balance}(""); require(os); } function _mintLoop(address _receiver, uint256 _mintAmount) internal { for (uint256 i = 0; i < _mintAmount; i++) { addressMintedBalance[_receiver]++; supply.increment(); _safeMint(_receiver, supply.current()); } } function _baseURI() internal view virtual override returns (string memory) { return uriPrefix; } }
// SPDX-License-Identifier: MIT // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts v4.4.1 (utils/Address.sol) pragma solidity ^0.8.0; /** * @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 * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 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 functionCall(target, data, "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"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(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) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(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) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason 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 { // 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 assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @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] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/utils/cryptography/ECDSA.sol // OpenZeppelin Contracts v4.4.1 (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 } 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"); } else if (error == RecoverError.InvalidSignatureV) { revert("ECDSA: invalid signature 'v' 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) { // Check the signature length // - case 65: r,s,v signature (standard) // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._ 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. 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 if (signature.length == 64) { bytes32 r; bytes32 vs; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) vs := mload(add(signature, 0x40)) } return tryRecover(hash, r, vs); } 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; uint8 v; assembly { s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) v := add(shr(255, vs), 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 (v != 27 && v != 28) { return (address(0), RecoverError.InvalidSignatureV); } // 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: contracts/EyesofFashionNFTPresale.sol pragma solidity >=0.7.0 <0.9.0; // Author: @sinta90210 contract Whitelisted { using ECDSA for bytes32; using Address for address; address internal _signer; constructor(address signer) { _signer = signer; } // @dev Assumes the signed message was human-readable msg.sender address (lowercase, without the '0x') modifier isValidWhitelistSignature(bytes memory signature) { bytes32 messageHash = toEthSignedMessageHash(asciiSender()); address signer = messageHash.recover(signature); require(signer == _signer, "Invalid whitelist signature"); _; } function recoveredAddress(bytes memory signature) public view returns (bytes memory) { address recoveredSigner = recover(signature); return abi.encodePacked(recoveredSigner); } function recover(bytes memory signature) public view returns (address) { bytes32 messageHash = toEthSignedMessageHash(asciiSender()); address recoveredSigner = messageHash.recover(signature); return recoveredSigner; } function generateSenderHash() public view returns (bytes32) { return toEthSignedMessageHash(asciiSender()); } // @dev Because at time of writing, 5b28...3cc0 hasn't made it into OpenZeppelin ECDSA release yet. // @dev https://github.com/OpenZeppelin/openzeppelin-contracts/commit/5b28259dacf47fc208e03611eb3ba8eeaed63cc0#diff-ff09871806bcccfd38e43de481f3e7e2fb92134c58e1a1f97b054e2d0d727458R209 function toEthSignedMessageHash(string memory s) public pure returns (bytes32) { bytes memory b = bytes(s); return keccak256( abi.encodePacked( "\x19Ethereum Signed Message:\n", Strings.toString(b.length), b ) ); } function asciiSender() public view returns (string memory) { return toAsciiString(msg.sender); } function toAsciiString(address x) internal pure returns (string memory) { bytes memory s = new bytes(40); for (uint256 i = 0; i < 20; i++) { bytes1 b = bytes1(uint8(uint256(uint160(x)) / (2 ** (8 * (19 - i))))); bytes1 hi = bytes1(uint8(b) / 16); bytes1 lo = bytes1(uint8(b) - 16 * uint8(hi)); s[2 * i] = char(hi); s[2 * i + 1] = char(lo); } return string(s); } function char(bytes1 b) internal pure returns (bytes1 c) { return (uint8(b) < 10) ? bytes1(uint8(b) + 0x30) : bytes1(uint8(b) + 0x57); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addressMintedBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"asciiSender","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"generateSenderHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hiddenMetadataUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmountPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"mintForAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftPerAddressLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"onlyWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"presaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"recover","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"recoveredAddress","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_hiddenMetadataUri","type":"string"}],"name":"setHiddenMetadataUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintAmountPerTx","type":"uint256"}],"name":"setMaxMintAmountPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setOnlyWhitelisted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"setUriPrefix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriSuffix","type":"string"}],"name":"setUriSuffix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"s","type":"string"}],"name":"toEthSignedMessageHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uriPrefix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405260405180602001604052806000815250600990805190602001906200002b929190620003df565b506040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600a908051906020019062000079929190620003df565b5067011c37937e080000600c556122b8600d556005600e556005600f556001601060006101000a81548160ff0219169083151502179055506000601060016101000a81548160ff0219169083151502179055506001601060026101000a81548160ff021916908315150217905550348015620000f457600080fd5b5073d17b6ff2496fc08d33fd34971d9253e1f3d74fe36040518060400160405280601081526020017f457965736f6646617368696f6e4e4654000000000000000000000000000000008152506040518060400160405280600381526020017f456f46000000000000000000000000000000000000000000000000000000000081525081600090805190602001906200018e929190620003df565b508060019080519060200190620001a7929190620003df565b505050620001ca620001be6200023c60201b60201c565b6200024460201b60201c565b80600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550506200023660405180608001604052806041815260200162005e40604191396200030a60201b60201c565b62000569565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6200031a6200023c60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1662000340620003b560201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000399576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200039090620004d1565b60405180910390fd5b80600b9080519060200190620003b1929190620003df565b5050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620003ed9062000504565b90600052602060002090601f0160209004810192826200041157600085556200045d565b82601f106200042c57805160ff19168380011785556200045d565b828001600101855582156200045d579182015b828111156200045c5782518255916020019190600101906200043f565b5b5090506200046c919062000470565b5090565b5b808211156200048b57600081600090555060010162000471565b5090565b60006200049e602083620004f3565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006020820190508181036000830152620004ec816200048f565b9050919050565b600082825260208201905092915050565b600060028204905060018216806200051d57607f821691505b602082108114156200053457620005336200053a565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6158c780620005796000396000f3fe6080604052600436106102885760003560e01c80636352211e1161015a578063a4a1edb1116100c1578063d720f9da1161007a578063d720f9da146109b4578063e0a80853146109f1578063e985e9c514610a1a578063efbd73f414610a57578063f19e75d414610a80578063f2fde38b14610aa957610288565b8063a4a1edb114610892578063b071401b146108cf578063b88d4fde146108f8578063ba7d2c7614610921578063c87b56dd1461094c578063d5abeb011461098957610288565b806395d89b411161011357806395d89b411461078f5780639c6add8e146107ba5780639c70b512146107f7578063a0712d6814610822578063a22cb4651461083e578063a45ba8e71461086757610288565b80636352211e1461067f57806370a08231146106bc578063715018a6146106f95780637ec4a659146107105780638da5cb5b1461073957806394354fd01461076457610288565b80633c952764116101fe5780634e21dc40116101b75780634e21dc401461058e5780634fdd43cb146105aa57806351830227146105d35780635503a0e8146105fe5780635c975abb1461062957806362b99ad41461065457610288565b80633c952764146104945780633ccfd60b146104bd57806340838f74146104d457806342842e0e146104ff578063438b63001461052857806344a0d68a1461056557610288565b806316ba10e01161025057806316ba10e01461038657806316c38b3c146103af57806318160ddd146103d857806318cae2691461040357806323b872dd14610440578063346d14ae1461046957610288565b806301ffc9a71461028d57806306fdde03146102ca578063081812fc146102f5578063095ea7b31461033257806313faede61461035b575b600080fd5b34801561029957600080fd5b506102b460048036038101906102af9190613e7f565b610ad2565b6040516102c19190614ccd565b60405180910390f35b3480156102d657600080fd5b506102df610bb4565b6040516102ec9190614d6a565b60405180910390f35b34801561030157600080fd5b5061031c60048036038101906103179190613fa7565b610c46565b6040516103299190614c44565b60405180910390f35b34801561033e57600080fd5b5061035960048036038101906103549190613e1a565b610ccb565b005b34801561036757600080fd5b50610370610de3565b60405161037d919061510c565b60405180910390f35b34801561039257600080fd5b506103ad60048036038101906103a89190613f66565b610de9565b005b3480156103bb57600080fd5b506103d660048036038101906103d19190613e56565b610e7f565b005b3480156103e457600080fd5b506103ed610f18565b6040516103fa919061510c565b60405180910390f35b34801561040f57600080fd5b5061042a60048036038101906104259190613caf565b610f29565b604051610437919061510c565b60405180910390f35b34801561044c57600080fd5b5061046760048036038101906104629190613d14565b610f41565b005b34801561047557600080fd5b5061047e610fa1565b60405161048b9190614d6a565b60405180910390f35b3480156104a057600080fd5b506104bb60048036038101906104b69190613e56565b610fb1565b005b3480156104c957600080fd5b506104d261104a565b005b3480156104e057600080fd5b506104e9611146565b6040516104f69190614ce8565b60405180910390f35b34801561050b57600080fd5b5061052660048036038101906105219190613d14565b61115d565b005b34801561053457600080fd5b5061054f600480360381019061054a9190613caf565b61117d565b60405161055c9190614cab565b60405180910390f35b34801561057157600080fd5b5061058c60048036038101906105879190613fa7565b6112d4565b005b6105a860048036038101906105a39190613f12565b61135a565b005b3480156105b657600080fd5b506105d160048036038101906105cc9190613f66565b611657565b005b3480156105df57600080fd5b506105e86116ed565b6040516105f59190614ccd565b60405180910390f35b34801561060a57600080fd5b50610613611700565b6040516106209190614d6a565b60405180910390f35b34801561063557600080fd5b5061063e61178e565b60405161064b9190614ccd565b60405180910390f35b34801561066057600080fd5b506106696117a1565b6040516106769190614d6a565b60405180910390f35b34801561068b57600080fd5b506106a660048036038101906106a19190613fa7565b61182f565b6040516106b39190614c44565b60405180910390f35b3480156106c857600080fd5b506106e360048036038101906106de9190613caf565b6118e1565b6040516106f0919061510c565b60405180910390f35b34801561070557600080fd5b5061070e611999565b005b34801561071c57600080fd5b5061073760048036038101906107329190613f66565b611a21565b005b34801561074557600080fd5b5061074e611ab7565b60405161075b9190614c44565b60405180910390f35b34801561077057600080fd5b50610779611ae1565b604051610786919061510c565b60405180910390f35b34801561079b57600080fd5b506107a4611ae7565b6040516107b19190614d6a565b60405180910390f35b3480156107c657600080fd5b506107e160048036038101906107dc9190613ed1565b611b79565b6040516107ee9190614d48565b60405180910390f35b34801561080357600080fd5b5061080c611bb0565b6040516108199190614ccd565b60405180910390f35b61083c60048036038101906108379190613fa7565b611bc3565b005b34801561084a57600080fd5b5061086560048036038101906108609190613dde565b611d6c565b005b34801561087357600080fd5b5061087c611d82565b6040516108899190614d6a565b60405180910390f35b34801561089e57600080fd5b506108b960048036038101906108b49190613ed1565b611e10565b6040516108c69190614c44565b60405180910390f35b3480156108db57600080fd5b506108f660048036038101906108f19190613fa7565b611e46565b005b34801561090457600080fd5b5061091f600480360381019061091a9190613d63565b611ecc565b005b34801561092d57600080fd5b50610936611f2e565b604051610943919061510c565b60405180910390f35b34801561095857600080fd5b50610973600480360381019061096e9190613fa7565b611f34565b6040516109809190614d6a565b60405180910390f35b34801561099557600080fd5b5061099e61208d565b6040516109ab919061510c565b60405180910390f35b3480156109c057600080fd5b506109db60048036038101906109d69190613f66565b612093565b6040516109e89190614ce8565b60405180910390f35b3480156109fd57600080fd5b50610a186004803603810190610a139190613e56565b6120d3565b005b348015610a2657600080fd5b50610a416004803603810190610a3c9190613cd8565b61216c565b604051610a4e9190614ccd565b60405180910390f35b348015610a6357600080fd5b50610a7e6004803603810190610a799190613fd0565b612200565b005b348015610a8c57600080fd5b50610aa76004803603810190610aa29190613fa7565b612336565b005b348015610ab557600080fd5b50610ad06004803603810190610acb9190613caf565b6123bf565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b9d57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610bad5750610bac826124b7565b5b9050919050565b606060008054610bc39061567e565b80601f0160208091040260200160405190810160405280929190818152602001828054610bef9061567e565b8015610c3c5780601f10610c1157610100808354040283529160200191610c3c565b820191906000526020600020905b815481529060010190602001808311610c1f57829003601f168201915b5050505050905090565b6000610c5182612521565b610c90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8790614f8c565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610cd68261182f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3e9061504c565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d6661258d565b73ffffffffffffffffffffffffffffffffffffffff161480610d955750610d9481610d8f61258d565b61216c565b5b610dd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dcb90614eec565b60405180910390fd5b610dde8383612595565b505050565b600c5481565b610df161258d565b73ffffffffffffffffffffffffffffffffffffffff16610e0f611ab7565b73ffffffffffffffffffffffffffffffffffffffff1614610e65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5c90614fac565b60405180910390fd5b80600a9080519060200190610e7b929190613ad3565b5050565b610e8761258d565b73ffffffffffffffffffffffffffffffffffffffff16610ea5611ab7565b73ffffffffffffffffffffffffffffffffffffffff1614610efb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef290614fac565b60405180910390fd5b80601060006101000a81548160ff02191690831515021790555050565b6000610f24600861264e565b905090565b60116020528060005260406000206000915090505481565b610f52610f4c61258d565b8261265c565b610f91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f889061508c565b60405180910390fd5b610f9c83838361273a565b505050565b6060610fac33612996565b905090565b610fb961258d565b73ffffffffffffffffffffffffffffffffffffffff16610fd7611ab7565b73ffffffffffffffffffffffffffffffffffffffff161461102d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102490614fac565b60405180910390fd5b80601060026101000a81548160ff02191690831515021790555050565b61105261258d565b73ffffffffffffffffffffffffffffffffffffffff16611070611ab7565b73ffffffffffffffffffffffffffffffffffffffff16146110c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110bd90614fac565b60405180910390fd5b60006110d0611ab7565b73ffffffffffffffffffffffffffffffffffffffff16476040516110f390614c2f565b60006040518083038185875af1925050503d8060008114611130576040519150601f19603f3d011682016040523d82523d6000602084013e611135565b606091505b505090508061114357600080fd5b50565b6000611158611153610fa1565b612093565b905090565b61117883838360405180602001604052806000815250611ecc565b505050565b6060600061118a836118e1565b905060008167ffffffffffffffff8111156111ce577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156111fc5781602001602082028036833780820191505090505b50905060006001905060005b83811080156112195750600d548211155b156112c85760006112298361182f565b90508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156112b45782848381518110611299577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101818152505081806112b0906156b0565b9250505b82806112bf906156b0565b93505050611208565b82945050505050919050565b6112dc61258d565b73ffffffffffffffffffffffffffffffffffffffff166112fa611ab7565b73ffffffffffffffffffffffffffffffffffffffff1614611350576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134790614fac565b60405180910390fd5b80600c8190555050565b8060008111801561136d5750600e548111155b6113ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a390614e2c565b60405180910390fd5b600d54816113ba600861264e565b6113c49190615254565b1115611405576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113fc9061506c565b60405180910390fd5b826000611418611413610fa1565b612093565b9050600061142f8383612bcb90919063ffffffff16565b9050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146114c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b8906150cc565b60405180910390fd5b601060009054906101000a900460ff1615611511576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150890614fcc565b60405180910390fd5b601060029054906101000a900460ff16611560576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115579061500c565b60405180910390fd5b84600c5461156e91906154b4565b3410156115b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a7906150ec565b60405180910390fd5b6000601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600f5486826116039190615254565b1115611644576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163b90614e4c565b60405180910390fd5b61164e3387612bf2565b50505050505050565b61165f61258d565b73ffffffffffffffffffffffffffffffffffffffff1661167d611ab7565b73ffffffffffffffffffffffffffffffffffffffff16146116d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ca90614fac565b60405180910390fd5b80600b90805190602001906116e9929190613ad3565b5050565b601060019054906101000a900460ff1681565b600a805461170d9061567e565b80601f01602080910402602001604051908101604052809291908181526020018280546117399061567e565b80156117865780601f1061175b57610100808354040283529160200191611786565b820191906000526020600020905b81548152906001019060200180831161176957829003601f168201915b505050505081565b601060009054906101000a900460ff1681565b600980546117ae9061567e565b80601f01602080910402602001604051908101604052809291908181526020018280546117da9061567e565b80156118275780601f106117fc57610100808354040283529160200191611827565b820191906000526020600020905b81548152906001019060200180831161180a57829003601f168201915b505050505081565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156118d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118cf90614f2c565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611952576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194990614f0c565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6119a161258d565b73ffffffffffffffffffffffffffffffffffffffff166119bf611ab7565b73ffffffffffffffffffffffffffffffffffffffff1614611a15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0c90614fac565b60405180910390fd5b611a1f6000612c87565b565b611a2961258d565b73ffffffffffffffffffffffffffffffffffffffff16611a47611ab7565b73ffffffffffffffffffffffffffffffffffffffff1614611a9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9490614fac565b60405180910390fd5b8060099080519060200190611ab3929190613ad3565b5050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600e5481565b606060018054611af69061567e565b80601f0160208091040260200160405190810160405280929190818152602001828054611b229061567e565b8015611b6f5780601f10611b4457610100808354040283529160200191611b6f565b820191906000526020600020905b815481529060010190602001808311611b5257829003601f168201915b5050505050905090565b60606000611b8683611e10565b905080604051602001611b999190614bb4565b604051602081830303815290604052915050919050565b601060029054906101000a900460ff1681565b80600081118015611bd65750600e548111155b611c15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0c90614e2c565b60405180910390fd5b600d5481611c23600861264e565b611c2d9190615254565b1115611c6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c659061506c565b60405180910390fd5b601060009054906101000a900460ff1615611cbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb590614fcc565b60405180910390fd5b601060029054906101000a900460ff1615611d0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d05906150ac565b60405180910390fd5b81600c54611d1c91906154b4565b341015611d5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d55906150ec565b60405180910390fd5b611d683383612bf2565b5050565b611d7e611d7761258d565b8383612d4d565b5050565b600b8054611d8f9061567e565b80601f0160208091040260200160405190810160405280929190818152602001828054611dbb9061567e565b8015611e085780601f10611ddd57610100808354040283529160200191611e08565b820191906000526020600020905b815481529060010190602001808311611deb57829003601f168201915b505050505081565b600080611e23611e1e610fa1565b612093565b90506000611e3a8483612bcb90919063ffffffff16565b90508092505050919050565b611e4e61258d565b73ffffffffffffffffffffffffffffffffffffffff16611e6c611ab7565b73ffffffffffffffffffffffffffffffffffffffff1614611ec2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eb990614fac565b60405180910390fd5b80600e8190555050565b611edd611ed761258d565b8361265c565b611f1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f139061508c565b60405180910390fd5b611f2884848484612eba565b50505050565b600f5481565b6060611f3f82612521565b611f7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f759061502c565b60405180910390fd5b60001515601060019054906101000a900460ff161515141561202c57600b8054611fa79061567e565b80601f0160208091040260200160405190810160405280929190818152602001828054611fd39061567e565b80156120205780601f10611ff557610100808354040283529160200191612020565b820191906000526020600020905b81548152906001019060200180831161200357829003601f168201915b50505050509050612088565b6000612036612f16565b905060008151116120565760405180602001604052806000815250612084565b8061206084612fa8565b600a60405160200161207493929190614bcf565b6040516020818303038152906040525b9150505b919050565b600d5481565b6000808290506120a38151612fa8565b816040516020016120b5929190614c00565b60405160208183030381529060405280519060200120915050919050565b6120db61258d565b73ffffffffffffffffffffffffffffffffffffffff166120f9611ab7565b73ffffffffffffffffffffffffffffffffffffffff161461214f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214690614fac565b60405180910390fd5b80601060016101000a81548160ff02191690831515021790555050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b816000811180156122135750600e548111155b612252576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161224990614e2c565b60405180910390fd5b600d5481612260600861264e565b61226a9190615254565b11156122ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122a29061506c565b60405180910390fd5b6122b361258d565b73ffffffffffffffffffffffffffffffffffffffff166122d1611ab7565b73ffffffffffffffffffffffffffffffffffffffff1614612327576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161231e90614fac565b60405180910390fd5b6123318284612bf2565b505050565b61233e61258d565b73ffffffffffffffffffffffffffffffffffffffff1661235c611ab7565b73ffffffffffffffffffffffffffffffffffffffff16146123b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a990614fac565b60405180910390fd5b6123bc3382612bf2565b50565b6123c761258d565b73ffffffffffffffffffffffffffffffffffffffff166123e5611ab7565b73ffffffffffffffffffffffffffffffffffffffff161461243b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243290614fac565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156124ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124a290614dec565b60405180910390fd5b6124b481612c87565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166126088361182f565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b600061266782612521565b6126a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161269d90614ecc565b60405180910390fd5b60006126b18361182f565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061272057508373ffffffffffffffffffffffffffffffffffffffff1661270884610c46565b73ffffffffffffffffffffffffffffffffffffffff16145b806127315750612730818561216c565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661275a8261182f565b73ffffffffffffffffffffffffffffffffffffffff16146127b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127a790614fec565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612820576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161281790614e6c565b60405180910390fd5b61282b838383613155565b612836600082612595565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128869190615549565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128dd9190615254565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60606000602867ffffffffffffffff8111156129db577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612a0d5781602001600182028036833780820191505090505b50905060005b6014811015612bc1576000816013612a2b9190615549565b6008612a3791906154b4565b6002612a439190615396565b8573ffffffffffffffffffffffffffffffffffffffff16612a6491906152e1565b60f81b9050600060108260f81c612a7b9190615312565b60f81b905060008160f81c6010612a92919061550e565b8360f81c612aa0919061557d565b60f81b9050612aae8261315a565b85856002612abc91906154b4565b81518110612af3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612b2b8161315a565b856001866002612b3b91906154b4565b612b459190615254565b81518110612b7c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505050508080612bb9906156b0565b915050612a13565b5080915050919050565b6000806000612bda858561319d565b91509150612be781613220565b819250505092915050565b60005b81811015612c8257601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190612c4d906156b0565b9190505550612c5c6008613571565b612c6f83612c6a600861264e565b613587565b8080612c7a906156b0565b915050612bf5565b505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612dbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612db390614e8c565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612ead9190614ccd565b60405180910390a3505050565b612ec584848461273a565b612ed1848484846135a5565b612f10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f0790614dcc565b60405180910390fd5b50505050565b606060098054612f259061567e565b80601f0160208091040260200160405190810160405280929190818152602001828054612f519061567e565b8015612f9e5780601f10612f7357610100808354040283529160200191612f9e565b820191906000526020600020905b815481529060010190602001808311612f8157829003601f168201915b5050505050905090565b60606000821415612ff0576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613150565b600082905060005b6000821461302257808061300b906156b0565b915050600a8261301b91906152e1565b9150612ff8565b60008167ffffffffffffffff811115613064577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156130965781602001600182028036833780820191505090505b5090505b60008514613149576001826130af9190615549565b9150600a856130be919061571d565b60306130ca9190615254565b60f81b818381518110613106577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561314291906152e1565b945061309a565b8093505050505b919050565b505050565b6000600a8260f81c60ff16106131825760578260f81c61317a91906152aa565b60f81b613196565b60308260f81c61319291906152aa565b60f81b5b9050919050565b6000806041835114156131df5760008060006020860151925060408601519150606086015160001a90506131d38782858561373c565b94509450505050613219565b604083511415613210576000806020850151915060408501519050613205868383613849565b935093505050613219565b60006002915091505b9250929050565b6000600481111561325a577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115613293577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b141561329e5761356e565b600160048111156132d8577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115613311577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415613352576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161334990614d8c565b60405180910390fd5b6002600481111561338c577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8160048111156133c5577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415613406576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133fd90614dac565b60405180910390fd5b60036004811115613440577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115613479577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14156134ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134b190614eac565b60405180910390fd5b6004808111156134f3577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b81600481111561352c577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b141561356d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161356490614f4c565b60405180910390fd5b5b50565b6001816000016000828254019250508190555050565b6135a1828260405180602001604052806000815250613897565b5050565b60006135c68473ffffffffffffffffffffffffffffffffffffffff166138f2565b1561372f578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026135ef61258d565b8786866040518563ffffffff1660e01b81526004016136119493929190614c5f565b602060405180830381600087803b15801561362b57600080fd5b505af192505050801561365c57506040513d601f19601f820116820180604052508101906136599190613ea8565b60015b6136df573d806000811461368c576040519150601f19603f3d011682016040523d82523d6000602084013e613691565b606091505b506000815114156136d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136ce90614dcc565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613734565b600190505b949350505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115613777576000600391509150613840565b601b8560ff161415801561378f5750601c8560ff1614155b156137a1576000600491509150613840565b6000600187878787604051600081526020016040526040516137c69493929190614d03565b6020604051602081039080840390855afa1580156137e8573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561383757600060019250925050613840565b80600092509250505b94509492505050565b6000806000807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85169150601b8560ff1c0190506138898782888561373c565b935093505050935093915050565b6138a18383613905565b6138ae60008484846135a5565b6138ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138e490614dcc565b60405180910390fd5b505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613975576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161396c90614f6c565b60405180910390fd5b61397e81612521565b156139be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139b590614e0c565b60405180910390fd5b6139ca60008383613155565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613a1a9190615254565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b828054613adf9061567e565b90600052602060002090601f016020900481019282613b015760008555613b48565b82601f10613b1a57805160ff1916838001178555613b48565b82800160010185558215613b48579182015b82811115613b47578251825591602001919060010190613b2c565b5b509050613b559190613b59565b5090565b5b80821115613b72576000816000905550600101613b5a565b5090565b6000613b89613b8484615158565b615127565b905082815260208101848484011115613ba157600080fd5b613bac84828561563c565b509392505050565b6000613bc7613bc284615188565b615127565b905082815260208101848484011115613bdf57600080fd5b613bea84828561563c565b509392505050565b600081359050613c0181615835565b92915050565b600081359050613c168161584c565b92915050565b600081359050613c2b81615863565b92915050565b600081519050613c4081615863565b92915050565b600082601f830112613c5757600080fd5b8135613c67848260208601613b76565b91505092915050565b600082601f830112613c8157600080fd5b8135613c91848260208601613bb4565b91505092915050565b600081359050613ca98161587a565b92915050565b600060208284031215613cc157600080fd5b6000613ccf84828501613bf2565b91505092915050565b60008060408385031215613ceb57600080fd5b6000613cf985828601613bf2565b9250506020613d0a85828601613bf2565b9150509250929050565b600080600060608486031215613d2957600080fd5b6000613d3786828701613bf2565b9350506020613d4886828701613bf2565b9250506040613d5986828701613c9a565b9150509250925092565b60008060008060808587031215613d7957600080fd5b6000613d8787828801613bf2565b9450506020613d9887828801613bf2565b9350506040613da987828801613c9a565b925050606085013567ffffffffffffffff811115613dc657600080fd5b613dd287828801613c46565b91505092959194509250565b60008060408385031215613df157600080fd5b6000613dff85828601613bf2565b9250506020613e1085828601613c07565b9150509250929050565b60008060408385031215613e2d57600080fd5b6000613e3b85828601613bf2565b9250506020613e4c85828601613c9a565b9150509250929050565b600060208284031215613e6857600080fd5b6000613e7684828501613c07565b91505092915050565b600060208284031215613e9157600080fd5b6000613e9f84828501613c1c565b91505092915050565b600060208284031215613eba57600080fd5b6000613ec884828501613c31565b91505092915050565b600060208284031215613ee357600080fd5b600082013567ffffffffffffffff811115613efd57600080fd5b613f0984828501613c46565b91505092915050565b60008060408385031215613f2557600080fd5b600083013567ffffffffffffffff811115613f3f57600080fd5b613f4b85828601613c46565b9250506020613f5c85828601613c9a565b9150509250929050565b600060208284031215613f7857600080fd5b600082013567ffffffffffffffff811115613f9257600080fd5b613f9e84828501613c70565b91505092915050565b600060208284031215613fb957600080fd5b6000613fc784828501613c9a565b91505092915050565b60008060408385031215613fe357600080fd5b6000613ff185828601613c9a565b925050602061400285828601613bf2565b9150509250929050565b60006140188383614b87565b60208301905092915050565b61402d816155b1565b82525050565b61404461403f826155b1565b6156f9565b82525050565b6000614055826151dd565b61405f818561520b565b935061406a836151b8565b8060005b8381101561409b578151614082888261400c565b975061408d836151fe565b92505060018101905061406e565b5085935050505092915050565b6140b1816155c3565b82525050565b6140c0816155cf565b82525050565b60006140d1826151e8565b6140db818561521c565b93506140eb81856020860161564b565b6140f48161580a565b840191505092915050565b600061410a826151e8565b614114818561522d565b935061412481856020860161564b565b80840191505092915050565b600061413b826151f3565b6141458185615238565b935061415581856020860161564b565b61415e8161580a565b840191505092915050565b6000614174826151f3565b61417e8185615249565b935061418e81856020860161564b565b80840191505092915050565b600081546141a78161567e565b6141b18186615249565b945060018216600081146141cc57600181146141dd57614210565b60ff19831686528186019350614210565b6141e6856151c8565b60005b83811015614208578154818901526001820191506020810190506141e9565b838801955050505b50505092915050565b6000614226601883615238565b91507f45434453413a20696e76616c6964207369676e617475726500000000000000006000830152602082019050919050565b6000614266601f83615238565b91507f45434453413a20696e76616c6964207369676e6174757265206c656e677468006000830152602082019050919050565b60006142a6603283615238565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b600061430c602683615238565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614372601c83615238565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b60006143b2601483615238565b91507f496e76616c6964206d696e7420616d6f756e74210000000000000000000000006000830152602082019050919050565b60006143f2601c83615238565b91507f6d6178204e4654207065722061646472657373206578636565646564000000006000830152602082019050919050565b6000614432602483615238565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614498601983615238565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b60006144d8602283615238565b91507f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008301527f75650000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061453e602c83615238565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006145a4603883615238565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b600061460a602a83615238565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000614670602983615238565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006146d6602283615238565b91507f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008301527f75650000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061473c602083615238565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b600061477c602c83615238565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006147e2602083615238565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000614822601a83615249565b91507f19457468657265756d205369676e6564204d6573736167653a0a0000000000006000830152601a82019050919050565b6000614862601783615238565b91507f54686520636f6e747261637420697320706175736564210000000000000000006000830152602082019050919050565b60006148a2602983615238565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000614908601583615238565b91507f5075626c6963206d6f64652069732061637469766500000000000000000000006000830152602082019050919050565b6000614948602f83615238565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b60006149ae602183615238565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614a1460008361522d565b9150600082019050919050565b6000614a2e601483615238565b91507f4d617820737570706c79206578636565646564210000000000000000000000006000830152602082019050919050565b6000614a6e603183615238565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000614ad4601683615238565b91507f50726573616c65206d6f646520697320616374697665000000000000000000006000830152602082019050919050565b6000614b14601b83615238565b91507f496e76616c69642077686974656c697374207369676e617475726500000000006000830152602082019050919050565b6000614b54601383615238565b91507f496e73756666696369656e742066756e647321000000000000000000000000006000830152602082019050919050565b614b9081615625565b82525050565b614b9f81615625565b82525050565b614bae8161562f565b82525050565b6000614bc08284614033565b60148201915081905092915050565b6000614bdb8286614169565b9150614be78285614169565b9150614bf3828461419a565b9150819050949350505050565b6000614c0b82614815565b9150614c178285614169565b9150614c2382846140ff565b91508190509392505050565b6000614c3a82614a07565b9150819050919050565b6000602082019050614c596000830184614024565b92915050565b6000608082019050614c746000830187614024565b614c816020830186614024565b614c8e6040830185614b96565b8181036060830152614ca081846140c6565b905095945050505050565b60006020820190508181036000830152614cc5818461404a565b905092915050565b6000602082019050614ce260008301846140a8565b92915050565b6000602082019050614cfd60008301846140b7565b92915050565b6000608082019050614d1860008301876140b7565b614d256020830186614ba5565b614d3260408301856140b7565b614d3f60608301846140b7565b95945050505050565b60006020820190508181036000830152614d6281846140c6565b905092915050565b60006020820190508181036000830152614d848184614130565b905092915050565b60006020820190508181036000830152614da581614219565b9050919050565b60006020820190508181036000830152614dc581614259565b9050919050565b60006020820190508181036000830152614de581614299565b9050919050565b60006020820190508181036000830152614e05816142ff565b9050919050565b60006020820190508181036000830152614e2581614365565b9050919050565b60006020820190508181036000830152614e45816143a5565b9050919050565b60006020820190508181036000830152614e65816143e5565b9050919050565b60006020820190508181036000830152614e8581614425565b9050919050565b60006020820190508181036000830152614ea58161448b565b9050919050565b60006020820190508181036000830152614ec5816144cb565b9050919050565b60006020820190508181036000830152614ee581614531565b9050919050565b60006020820190508181036000830152614f0581614597565b9050919050565b60006020820190508181036000830152614f25816145fd565b9050919050565b60006020820190508181036000830152614f4581614663565b9050919050565b60006020820190508181036000830152614f65816146c9565b9050919050565b60006020820190508181036000830152614f858161472f565b9050919050565b60006020820190508181036000830152614fa58161476f565b9050919050565b60006020820190508181036000830152614fc5816147d5565b9050919050565b60006020820190508181036000830152614fe581614855565b9050919050565b6000602082019050818103600083015261500581614895565b9050919050565b60006020820190508181036000830152615025816148fb565b9050919050565b600060208201905081810360008301526150458161493b565b9050919050565b60006020820190508181036000830152615065816149a1565b9050919050565b6000602082019050818103600083015261508581614a21565b9050919050565b600060208201905081810360008301526150a581614a61565b9050919050565b600060208201905081810360008301526150c581614ac7565b9050919050565b600060208201905081810360008301526150e581614b07565b9050919050565b6000602082019050818103600083015261510581614b47565b9050919050565b60006020820190506151216000830184614b96565b92915050565b6000604051905081810181811067ffffffffffffffff8211171561514e5761514d6157db565b5b8060405250919050565b600067ffffffffffffffff821115615173576151726157db565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff8211156151a3576151a26157db565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061525f82615625565b915061526a83615625565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561529f5761529e61574e565b5b828201905092915050565b60006152b58261562f565b91506152c08361562f565b92508260ff038211156152d6576152d561574e565b5b828201905092915050565b60006152ec82615625565b91506152f783615625565b9250826153075761530661577d565b5b828204905092915050565b600061531d8261562f565b91506153288361562f565b9250826153385761533761577d565b5b828204905092915050565b6000808291508390505b600185111561538d578086048111156153695761536861574e565b5b60018516156153785780820291505b808102905061538685615828565b945061534d565b94509492505050565b60006153a182615625565b91506153ac83615625565b92506153d97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84846153e1565b905092915050565b6000826153f157600190506154ad565b816153ff57600090506154ad565b8160018114615415576002811461541f5761544e565b60019150506154ad565b60ff8411156154315761543061574e565b5b8360020a9150848211156154485761544761574e565b5b506154ad565b5060208310610133831016604e8410600b84101617156154835782820a90508381111561547e5761547d61574e565b5b6154ad565b6154908484846001615343565b925090508184048111156154a7576154a661574e565b5b81810290505b9392505050565b60006154bf82615625565b91506154ca83615625565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156155035761550261574e565b5b828202905092915050565b60006155198261562f565b91506155248361562f565b92508160ff048311821515161561553e5761553d61574e565b5b828202905092915050565b600061555482615625565b915061555f83615625565b9250828210156155725761557161574e565b5b828203905092915050565b60006155888261562f565b91506155938361562f565b9250828210156155a6576155a561574e565b5b828203905092915050565b60006155bc82615605565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b8381101561566957808201518184015260208101905061564e565b83811115615678576000848401525b50505050565b6000600282049050600182168061569657607f821691505b602082108114156156aa576156a96157ac565b5b50919050565b60006156bb82615625565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156156ee576156ed61574e565b5b600182019050919050565b60006157048261570b565b9050919050565b60006157168261581b565b9050919050565b600061572882615625565b915061573383615625565b9250826157435761574261577d565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b60008160011c9050919050565b61583e816155b1565b811461584957600080fd5b50565b615855816155c3565b811461586057600080fd5b50565b61586c816155d9565b811461587757600080fd5b50565b61588381615625565b811461588e57600080fd5b5056fea2646970667358221220a7a4bba48fbd991fdba1c96c93ad34d3964c76aea7ef54d3ff31a8d9e830690664736f6c63430008000033697066733a2f2f516d6144324b385a6342727451436e315566446d513172745773633667646677425239354d687a32644656317a352f68696464656e2e6a736f6e
Deployed Bytecode
0x6080604052600436106102885760003560e01c80636352211e1161015a578063a4a1edb1116100c1578063d720f9da1161007a578063d720f9da146109b4578063e0a80853146109f1578063e985e9c514610a1a578063efbd73f414610a57578063f19e75d414610a80578063f2fde38b14610aa957610288565b8063a4a1edb114610892578063b071401b146108cf578063b88d4fde146108f8578063ba7d2c7614610921578063c87b56dd1461094c578063d5abeb011461098957610288565b806395d89b411161011357806395d89b411461078f5780639c6add8e146107ba5780639c70b512146107f7578063a0712d6814610822578063a22cb4651461083e578063a45ba8e71461086757610288565b80636352211e1461067f57806370a08231146106bc578063715018a6146106f95780637ec4a659146107105780638da5cb5b1461073957806394354fd01461076457610288565b80633c952764116101fe5780634e21dc40116101b75780634e21dc401461058e5780634fdd43cb146105aa57806351830227146105d35780635503a0e8146105fe5780635c975abb1461062957806362b99ad41461065457610288565b80633c952764146104945780633ccfd60b146104bd57806340838f74146104d457806342842e0e146104ff578063438b63001461052857806344a0d68a1461056557610288565b806316ba10e01161025057806316ba10e01461038657806316c38b3c146103af57806318160ddd146103d857806318cae2691461040357806323b872dd14610440578063346d14ae1461046957610288565b806301ffc9a71461028d57806306fdde03146102ca578063081812fc146102f5578063095ea7b31461033257806313faede61461035b575b600080fd5b34801561029957600080fd5b506102b460048036038101906102af9190613e7f565b610ad2565b6040516102c19190614ccd565b60405180910390f35b3480156102d657600080fd5b506102df610bb4565b6040516102ec9190614d6a565b60405180910390f35b34801561030157600080fd5b5061031c60048036038101906103179190613fa7565b610c46565b6040516103299190614c44565b60405180910390f35b34801561033e57600080fd5b5061035960048036038101906103549190613e1a565b610ccb565b005b34801561036757600080fd5b50610370610de3565b60405161037d919061510c565b60405180910390f35b34801561039257600080fd5b506103ad60048036038101906103a89190613f66565b610de9565b005b3480156103bb57600080fd5b506103d660048036038101906103d19190613e56565b610e7f565b005b3480156103e457600080fd5b506103ed610f18565b6040516103fa919061510c565b60405180910390f35b34801561040f57600080fd5b5061042a60048036038101906104259190613caf565b610f29565b604051610437919061510c565b60405180910390f35b34801561044c57600080fd5b5061046760048036038101906104629190613d14565b610f41565b005b34801561047557600080fd5b5061047e610fa1565b60405161048b9190614d6a565b60405180910390f35b3480156104a057600080fd5b506104bb60048036038101906104b69190613e56565b610fb1565b005b3480156104c957600080fd5b506104d261104a565b005b3480156104e057600080fd5b506104e9611146565b6040516104f69190614ce8565b60405180910390f35b34801561050b57600080fd5b5061052660048036038101906105219190613d14565b61115d565b005b34801561053457600080fd5b5061054f600480360381019061054a9190613caf565b61117d565b60405161055c9190614cab565b60405180910390f35b34801561057157600080fd5b5061058c60048036038101906105879190613fa7565b6112d4565b005b6105a860048036038101906105a39190613f12565b61135a565b005b3480156105b657600080fd5b506105d160048036038101906105cc9190613f66565b611657565b005b3480156105df57600080fd5b506105e86116ed565b6040516105f59190614ccd565b60405180910390f35b34801561060a57600080fd5b50610613611700565b6040516106209190614d6a565b60405180910390f35b34801561063557600080fd5b5061063e61178e565b60405161064b9190614ccd565b60405180910390f35b34801561066057600080fd5b506106696117a1565b6040516106769190614d6a565b60405180910390f35b34801561068b57600080fd5b506106a660048036038101906106a19190613fa7565b61182f565b6040516106b39190614c44565b60405180910390f35b3480156106c857600080fd5b506106e360048036038101906106de9190613caf565b6118e1565b6040516106f0919061510c565b60405180910390f35b34801561070557600080fd5b5061070e611999565b005b34801561071c57600080fd5b5061073760048036038101906107329190613f66565b611a21565b005b34801561074557600080fd5b5061074e611ab7565b60405161075b9190614c44565b60405180910390f35b34801561077057600080fd5b50610779611ae1565b604051610786919061510c565b60405180910390f35b34801561079b57600080fd5b506107a4611ae7565b6040516107b19190614d6a565b60405180910390f35b3480156107c657600080fd5b506107e160048036038101906107dc9190613ed1565b611b79565b6040516107ee9190614d48565b60405180910390f35b34801561080357600080fd5b5061080c611bb0565b6040516108199190614ccd565b60405180910390f35b61083c60048036038101906108379190613fa7565b611bc3565b005b34801561084a57600080fd5b5061086560048036038101906108609190613dde565b611d6c565b005b34801561087357600080fd5b5061087c611d82565b6040516108899190614d6a565b60405180910390f35b34801561089e57600080fd5b506108b960048036038101906108b49190613ed1565b611e10565b6040516108c69190614c44565b60405180910390f35b3480156108db57600080fd5b506108f660048036038101906108f19190613fa7565b611e46565b005b34801561090457600080fd5b5061091f600480360381019061091a9190613d63565b611ecc565b005b34801561092d57600080fd5b50610936611f2e565b604051610943919061510c565b60405180910390f35b34801561095857600080fd5b50610973600480360381019061096e9190613fa7565b611f34565b6040516109809190614d6a565b60405180910390f35b34801561099557600080fd5b5061099e61208d565b6040516109ab919061510c565b60405180910390f35b3480156109c057600080fd5b506109db60048036038101906109d69190613f66565b612093565b6040516109e89190614ce8565b60405180910390f35b3480156109fd57600080fd5b50610a186004803603810190610a139190613e56565b6120d3565b005b348015610a2657600080fd5b50610a416004803603810190610a3c9190613cd8565b61216c565b604051610a4e9190614ccd565b60405180910390f35b348015610a6357600080fd5b50610a7e6004803603810190610a799190613fd0565b612200565b005b348015610a8c57600080fd5b50610aa76004803603810190610aa29190613fa7565b612336565b005b348015610ab557600080fd5b50610ad06004803603810190610acb9190613caf565b6123bf565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b9d57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610bad5750610bac826124b7565b5b9050919050565b606060008054610bc39061567e565b80601f0160208091040260200160405190810160405280929190818152602001828054610bef9061567e565b8015610c3c5780601f10610c1157610100808354040283529160200191610c3c565b820191906000526020600020905b815481529060010190602001808311610c1f57829003601f168201915b5050505050905090565b6000610c5182612521565b610c90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8790614f8c565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610cd68261182f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3e9061504c565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d6661258d565b73ffffffffffffffffffffffffffffffffffffffff161480610d955750610d9481610d8f61258d565b61216c565b5b610dd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dcb90614eec565b60405180910390fd5b610dde8383612595565b505050565b600c5481565b610df161258d565b73ffffffffffffffffffffffffffffffffffffffff16610e0f611ab7565b73ffffffffffffffffffffffffffffffffffffffff1614610e65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5c90614fac565b60405180910390fd5b80600a9080519060200190610e7b929190613ad3565b5050565b610e8761258d565b73ffffffffffffffffffffffffffffffffffffffff16610ea5611ab7565b73ffffffffffffffffffffffffffffffffffffffff1614610efb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef290614fac565b60405180910390fd5b80601060006101000a81548160ff02191690831515021790555050565b6000610f24600861264e565b905090565b60116020528060005260406000206000915090505481565b610f52610f4c61258d565b8261265c565b610f91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f889061508c565b60405180910390fd5b610f9c83838361273a565b505050565b6060610fac33612996565b905090565b610fb961258d565b73ffffffffffffffffffffffffffffffffffffffff16610fd7611ab7565b73ffffffffffffffffffffffffffffffffffffffff161461102d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102490614fac565b60405180910390fd5b80601060026101000a81548160ff02191690831515021790555050565b61105261258d565b73ffffffffffffffffffffffffffffffffffffffff16611070611ab7565b73ffffffffffffffffffffffffffffffffffffffff16146110c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110bd90614fac565b60405180910390fd5b60006110d0611ab7565b73ffffffffffffffffffffffffffffffffffffffff16476040516110f390614c2f565b60006040518083038185875af1925050503d8060008114611130576040519150601f19603f3d011682016040523d82523d6000602084013e611135565b606091505b505090508061114357600080fd5b50565b6000611158611153610fa1565b612093565b905090565b61117883838360405180602001604052806000815250611ecc565b505050565b6060600061118a836118e1565b905060008167ffffffffffffffff8111156111ce577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156111fc5781602001602082028036833780820191505090505b50905060006001905060005b83811080156112195750600d548211155b156112c85760006112298361182f565b90508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156112b45782848381518110611299577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101818152505081806112b0906156b0565b9250505b82806112bf906156b0565b93505050611208565b82945050505050919050565b6112dc61258d565b73ffffffffffffffffffffffffffffffffffffffff166112fa611ab7565b73ffffffffffffffffffffffffffffffffffffffff1614611350576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134790614fac565b60405180910390fd5b80600c8190555050565b8060008111801561136d5750600e548111155b6113ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a390614e2c565b60405180910390fd5b600d54816113ba600861264e565b6113c49190615254565b1115611405576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113fc9061506c565b60405180910390fd5b826000611418611413610fa1565b612093565b9050600061142f8383612bcb90919063ffffffff16565b9050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146114c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b8906150cc565b60405180910390fd5b601060009054906101000a900460ff1615611511576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150890614fcc565b60405180910390fd5b601060029054906101000a900460ff16611560576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115579061500c565b60405180910390fd5b84600c5461156e91906154b4565b3410156115b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a7906150ec565b60405180910390fd5b6000601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600f5486826116039190615254565b1115611644576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163b90614e4c565b60405180910390fd5b61164e3387612bf2565b50505050505050565b61165f61258d565b73ffffffffffffffffffffffffffffffffffffffff1661167d611ab7565b73ffffffffffffffffffffffffffffffffffffffff16146116d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ca90614fac565b60405180910390fd5b80600b90805190602001906116e9929190613ad3565b5050565b601060019054906101000a900460ff1681565b600a805461170d9061567e565b80601f01602080910402602001604051908101604052809291908181526020018280546117399061567e565b80156117865780601f1061175b57610100808354040283529160200191611786565b820191906000526020600020905b81548152906001019060200180831161176957829003601f168201915b505050505081565b601060009054906101000a900460ff1681565b600980546117ae9061567e565b80601f01602080910402602001604051908101604052809291908181526020018280546117da9061567e565b80156118275780601f106117fc57610100808354040283529160200191611827565b820191906000526020600020905b81548152906001019060200180831161180a57829003601f168201915b505050505081565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156118d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118cf90614f2c565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611952576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194990614f0c565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6119a161258d565b73ffffffffffffffffffffffffffffffffffffffff166119bf611ab7565b73ffffffffffffffffffffffffffffffffffffffff1614611a15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0c90614fac565b60405180910390fd5b611a1f6000612c87565b565b611a2961258d565b73ffffffffffffffffffffffffffffffffffffffff16611a47611ab7565b73ffffffffffffffffffffffffffffffffffffffff1614611a9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9490614fac565b60405180910390fd5b8060099080519060200190611ab3929190613ad3565b5050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600e5481565b606060018054611af69061567e565b80601f0160208091040260200160405190810160405280929190818152602001828054611b229061567e565b8015611b6f5780601f10611b4457610100808354040283529160200191611b6f565b820191906000526020600020905b815481529060010190602001808311611b5257829003601f168201915b5050505050905090565b60606000611b8683611e10565b905080604051602001611b999190614bb4565b604051602081830303815290604052915050919050565b601060029054906101000a900460ff1681565b80600081118015611bd65750600e548111155b611c15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0c90614e2c565b60405180910390fd5b600d5481611c23600861264e565b611c2d9190615254565b1115611c6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c659061506c565b60405180910390fd5b601060009054906101000a900460ff1615611cbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb590614fcc565b60405180910390fd5b601060029054906101000a900460ff1615611d0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d05906150ac565b60405180910390fd5b81600c54611d1c91906154b4565b341015611d5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d55906150ec565b60405180910390fd5b611d683383612bf2565b5050565b611d7e611d7761258d565b8383612d4d565b5050565b600b8054611d8f9061567e565b80601f0160208091040260200160405190810160405280929190818152602001828054611dbb9061567e565b8015611e085780601f10611ddd57610100808354040283529160200191611e08565b820191906000526020600020905b815481529060010190602001808311611deb57829003601f168201915b505050505081565b600080611e23611e1e610fa1565b612093565b90506000611e3a8483612bcb90919063ffffffff16565b90508092505050919050565b611e4e61258d565b73ffffffffffffffffffffffffffffffffffffffff16611e6c611ab7565b73ffffffffffffffffffffffffffffffffffffffff1614611ec2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eb990614fac565b60405180910390fd5b80600e8190555050565b611edd611ed761258d565b8361265c565b611f1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f139061508c565b60405180910390fd5b611f2884848484612eba565b50505050565b600f5481565b6060611f3f82612521565b611f7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f759061502c565b60405180910390fd5b60001515601060019054906101000a900460ff161515141561202c57600b8054611fa79061567e565b80601f0160208091040260200160405190810160405280929190818152602001828054611fd39061567e565b80156120205780601f10611ff557610100808354040283529160200191612020565b820191906000526020600020905b81548152906001019060200180831161200357829003601f168201915b50505050509050612088565b6000612036612f16565b905060008151116120565760405180602001604052806000815250612084565b8061206084612fa8565b600a60405160200161207493929190614bcf565b6040516020818303038152906040525b9150505b919050565b600d5481565b6000808290506120a38151612fa8565b816040516020016120b5929190614c00565b60405160208183030381529060405280519060200120915050919050565b6120db61258d565b73ffffffffffffffffffffffffffffffffffffffff166120f9611ab7565b73ffffffffffffffffffffffffffffffffffffffff161461214f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214690614fac565b60405180910390fd5b80601060016101000a81548160ff02191690831515021790555050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b816000811180156122135750600e548111155b612252576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161224990614e2c565b60405180910390fd5b600d5481612260600861264e565b61226a9190615254565b11156122ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122a29061506c565b60405180910390fd5b6122b361258d565b73ffffffffffffffffffffffffffffffffffffffff166122d1611ab7565b73ffffffffffffffffffffffffffffffffffffffff1614612327576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161231e90614fac565b60405180910390fd5b6123318284612bf2565b505050565b61233e61258d565b73ffffffffffffffffffffffffffffffffffffffff1661235c611ab7565b73ffffffffffffffffffffffffffffffffffffffff16146123b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a990614fac565b60405180910390fd5b6123bc3382612bf2565b50565b6123c761258d565b73ffffffffffffffffffffffffffffffffffffffff166123e5611ab7565b73ffffffffffffffffffffffffffffffffffffffff161461243b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243290614fac565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156124ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124a290614dec565b60405180910390fd5b6124b481612c87565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166126088361182f565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b600061266782612521565b6126a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161269d90614ecc565b60405180910390fd5b60006126b18361182f565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061272057508373ffffffffffffffffffffffffffffffffffffffff1661270884610c46565b73ffffffffffffffffffffffffffffffffffffffff16145b806127315750612730818561216c565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661275a8261182f565b73ffffffffffffffffffffffffffffffffffffffff16146127b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127a790614fec565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612820576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161281790614e6c565b60405180910390fd5b61282b838383613155565b612836600082612595565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128869190615549565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128dd9190615254565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60606000602867ffffffffffffffff8111156129db577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612a0d5781602001600182028036833780820191505090505b50905060005b6014811015612bc1576000816013612a2b9190615549565b6008612a3791906154b4565b6002612a439190615396565b8573ffffffffffffffffffffffffffffffffffffffff16612a6491906152e1565b60f81b9050600060108260f81c612a7b9190615312565b60f81b905060008160f81c6010612a92919061550e565b8360f81c612aa0919061557d565b60f81b9050612aae8261315a565b85856002612abc91906154b4565b81518110612af3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612b2b8161315a565b856001866002612b3b91906154b4565b612b459190615254565b81518110612b7c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505050508080612bb9906156b0565b915050612a13565b5080915050919050565b6000806000612bda858561319d565b91509150612be781613220565b819250505092915050565b60005b81811015612c8257601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190612c4d906156b0565b9190505550612c5c6008613571565b612c6f83612c6a600861264e565b613587565b8080612c7a906156b0565b915050612bf5565b505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612dbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612db390614e8c565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612ead9190614ccd565b60405180910390a3505050565b612ec584848461273a565b612ed1848484846135a5565b612f10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f0790614dcc565b60405180910390fd5b50505050565b606060098054612f259061567e565b80601f0160208091040260200160405190810160405280929190818152602001828054612f519061567e565b8015612f9e5780601f10612f7357610100808354040283529160200191612f9e565b820191906000526020600020905b815481529060010190602001808311612f8157829003601f168201915b5050505050905090565b60606000821415612ff0576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613150565b600082905060005b6000821461302257808061300b906156b0565b915050600a8261301b91906152e1565b9150612ff8565b60008167ffffffffffffffff811115613064577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156130965781602001600182028036833780820191505090505b5090505b60008514613149576001826130af9190615549565b9150600a856130be919061571d565b60306130ca9190615254565b60f81b818381518110613106577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561314291906152e1565b945061309a565b8093505050505b919050565b505050565b6000600a8260f81c60ff16106131825760578260f81c61317a91906152aa565b60f81b613196565b60308260f81c61319291906152aa565b60f81b5b9050919050565b6000806041835114156131df5760008060006020860151925060408601519150606086015160001a90506131d38782858561373c565b94509450505050613219565b604083511415613210576000806020850151915060408501519050613205868383613849565b935093505050613219565b60006002915091505b9250929050565b6000600481111561325a577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115613293577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b141561329e5761356e565b600160048111156132d8577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115613311577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415613352576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161334990614d8c565b60405180910390fd5b6002600481111561338c577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8160048111156133c5577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415613406576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133fd90614dac565b60405180910390fd5b60036004811115613440577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115613479577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14156134ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134b190614eac565b60405180910390fd5b6004808111156134f3577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b81600481111561352c577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b141561356d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161356490614f4c565b60405180910390fd5b5b50565b6001816000016000828254019250508190555050565b6135a1828260405180602001604052806000815250613897565b5050565b60006135c68473ffffffffffffffffffffffffffffffffffffffff166138f2565b1561372f578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026135ef61258d565b8786866040518563ffffffff1660e01b81526004016136119493929190614c5f565b602060405180830381600087803b15801561362b57600080fd5b505af192505050801561365c57506040513d601f19601f820116820180604052508101906136599190613ea8565b60015b6136df573d806000811461368c576040519150601f19603f3d011682016040523d82523d6000602084013e613691565b606091505b506000815114156136d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136ce90614dcc565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613734565b600190505b949350505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115613777576000600391509150613840565b601b8560ff161415801561378f5750601c8560ff1614155b156137a1576000600491509150613840565b6000600187878787604051600081526020016040526040516137c69493929190614d03565b6020604051602081039080840390855afa1580156137e8573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561383757600060019250925050613840565b80600092509250505b94509492505050565b6000806000807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85169150601b8560ff1c0190506138898782888561373c565b935093505050935093915050565b6138a18383613905565b6138ae60008484846135a5565b6138ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138e490614dcc565b60405180910390fd5b505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613975576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161396c90614f6c565b60405180910390fd5b61397e81612521565b156139be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139b590614e0c565b60405180910390fd5b6139ca60008383613155565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613a1a9190615254565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b828054613adf9061567e565b90600052602060002090601f016020900481019282613b015760008555613b48565b82601f10613b1a57805160ff1916838001178555613b48565b82800160010185558215613b48579182015b82811115613b47578251825591602001919060010190613b2c565b5b509050613b559190613b59565b5090565b5b80821115613b72576000816000905550600101613b5a565b5090565b6000613b89613b8484615158565b615127565b905082815260208101848484011115613ba157600080fd5b613bac84828561563c565b509392505050565b6000613bc7613bc284615188565b615127565b905082815260208101848484011115613bdf57600080fd5b613bea84828561563c565b509392505050565b600081359050613c0181615835565b92915050565b600081359050613c168161584c565b92915050565b600081359050613c2b81615863565b92915050565b600081519050613c4081615863565b92915050565b600082601f830112613c5757600080fd5b8135613c67848260208601613b76565b91505092915050565b600082601f830112613c8157600080fd5b8135613c91848260208601613bb4565b91505092915050565b600081359050613ca98161587a565b92915050565b600060208284031215613cc157600080fd5b6000613ccf84828501613bf2565b91505092915050565b60008060408385031215613ceb57600080fd5b6000613cf985828601613bf2565b9250506020613d0a85828601613bf2565b9150509250929050565b600080600060608486031215613d2957600080fd5b6000613d3786828701613bf2565b9350506020613d4886828701613bf2565b9250506040613d5986828701613c9a565b9150509250925092565b60008060008060808587031215613d7957600080fd5b6000613d8787828801613bf2565b9450506020613d9887828801613bf2565b9350506040613da987828801613c9a565b925050606085013567ffffffffffffffff811115613dc657600080fd5b613dd287828801613c46565b91505092959194509250565b60008060408385031215613df157600080fd5b6000613dff85828601613bf2565b9250506020613e1085828601613c07565b9150509250929050565b60008060408385031215613e2d57600080fd5b6000613e3b85828601613bf2565b9250506020613e4c85828601613c9a565b9150509250929050565b600060208284031215613e6857600080fd5b6000613e7684828501613c07565b91505092915050565b600060208284031215613e9157600080fd5b6000613e9f84828501613c1c565b91505092915050565b600060208284031215613eba57600080fd5b6000613ec884828501613c31565b91505092915050565b600060208284031215613ee357600080fd5b600082013567ffffffffffffffff811115613efd57600080fd5b613f0984828501613c46565b91505092915050565b60008060408385031215613f2557600080fd5b600083013567ffffffffffffffff811115613f3f57600080fd5b613f4b85828601613c46565b9250506020613f5c85828601613c9a565b9150509250929050565b600060208284031215613f7857600080fd5b600082013567ffffffffffffffff811115613f9257600080fd5b613f9e84828501613c70565b91505092915050565b600060208284031215613fb957600080fd5b6000613fc784828501613c9a565b91505092915050565b60008060408385031215613fe357600080fd5b6000613ff185828601613c9a565b925050602061400285828601613bf2565b9150509250929050565b60006140188383614b87565b60208301905092915050565b61402d816155b1565b82525050565b61404461403f826155b1565b6156f9565b82525050565b6000614055826151dd565b61405f818561520b565b935061406a836151b8565b8060005b8381101561409b578151614082888261400c565b975061408d836151fe565b92505060018101905061406e565b5085935050505092915050565b6140b1816155c3565b82525050565b6140c0816155cf565b82525050565b60006140d1826151e8565b6140db818561521c565b93506140eb81856020860161564b565b6140f48161580a565b840191505092915050565b600061410a826151e8565b614114818561522d565b935061412481856020860161564b565b80840191505092915050565b600061413b826151f3565b6141458185615238565b935061415581856020860161564b565b61415e8161580a565b840191505092915050565b6000614174826151f3565b61417e8185615249565b935061418e81856020860161564b565b80840191505092915050565b600081546141a78161567e565b6141b18186615249565b945060018216600081146141cc57600181146141dd57614210565b60ff19831686528186019350614210565b6141e6856151c8565b60005b83811015614208578154818901526001820191506020810190506141e9565b838801955050505b50505092915050565b6000614226601883615238565b91507f45434453413a20696e76616c6964207369676e617475726500000000000000006000830152602082019050919050565b6000614266601f83615238565b91507f45434453413a20696e76616c6964207369676e6174757265206c656e677468006000830152602082019050919050565b60006142a6603283615238565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b600061430c602683615238565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614372601c83615238565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b60006143b2601483615238565b91507f496e76616c6964206d696e7420616d6f756e74210000000000000000000000006000830152602082019050919050565b60006143f2601c83615238565b91507f6d6178204e4654207065722061646472657373206578636565646564000000006000830152602082019050919050565b6000614432602483615238565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614498601983615238565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b60006144d8602283615238565b91507f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008301527f75650000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061453e602c83615238565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006145a4603883615238565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b600061460a602a83615238565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000614670602983615238565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006146d6602283615238565b91507f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008301527f75650000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061473c602083615238565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b600061477c602c83615238565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006147e2602083615238565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000614822601a83615249565b91507f19457468657265756d205369676e6564204d6573736167653a0a0000000000006000830152601a82019050919050565b6000614862601783615238565b91507f54686520636f6e747261637420697320706175736564210000000000000000006000830152602082019050919050565b60006148a2602983615238565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000614908601583615238565b91507f5075626c6963206d6f64652069732061637469766500000000000000000000006000830152602082019050919050565b6000614948602f83615238565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b60006149ae602183615238565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614a1460008361522d565b9150600082019050919050565b6000614a2e601483615238565b91507f4d617820737570706c79206578636565646564210000000000000000000000006000830152602082019050919050565b6000614a6e603183615238565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000614ad4601683615238565b91507f50726573616c65206d6f646520697320616374697665000000000000000000006000830152602082019050919050565b6000614b14601b83615238565b91507f496e76616c69642077686974656c697374207369676e617475726500000000006000830152602082019050919050565b6000614b54601383615238565b91507f496e73756666696369656e742066756e647321000000000000000000000000006000830152602082019050919050565b614b9081615625565b82525050565b614b9f81615625565b82525050565b614bae8161562f565b82525050565b6000614bc08284614033565b60148201915081905092915050565b6000614bdb8286614169565b9150614be78285614169565b9150614bf3828461419a565b9150819050949350505050565b6000614c0b82614815565b9150614c178285614169565b9150614c2382846140ff565b91508190509392505050565b6000614c3a82614a07565b9150819050919050565b6000602082019050614c596000830184614024565b92915050565b6000608082019050614c746000830187614024565b614c816020830186614024565b614c8e6040830185614b96565b8181036060830152614ca081846140c6565b905095945050505050565b60006020820190508181036000830152614cc5818461404a565b905092915050565b6000602082019050614ce260008301846140a8565b92915050565b6000602082019050614cfd60008301846140b7565b92915050565b6000608082019050614d1860008301876140b7565b614d256020830186614ba5565b614d3260408301856140b7565b614d3f60608301846140b7565b95945050505050565b60006020820190508181036000830152614d6281846140c6565b905092915050565b60006020820190508181036000830152614d848184614130565b905092915050565b60006020820190508181036000830152614da581614219565b9050919050565b60006020820190508181036000830152614dc581614259565b9050919050565b60006020820190508181036000830152614de581614299565b9050919050565b60006020820190508181036000830152614e05816142ff565b9050919050565b60006020820190508181036000830152614e2581614365565b9050919050565b60006020820190508181036000830152614e45816143a5565b9050919050565b60006020820190508181036000830152614e65816143e5565b9050919050565b60006020820190508181036000830152614e8581614425565b9050919050565b60006020820190508181036000830152614ea58161448b565b9050919050565b60006020820190508181036000830152614ec5816144cb565b9050919050565b60006020820190508181036000830152614ee581614531565b9050919050565b60006020820190508181036000830152614f0581614597565b9050919050565b60006020820190508181036000830152614f25816145fd565b9050919050565b60006020820190508181036000830152614f4581614663565b9050919050565b60006020820190508181036000830152614f65816146c9565b9050919050565b60006020820190508181036000830152614f858161472f565b9050919050565b60006020820190508181036000830152614fa58161476f565b9050919050565b60006020820190508181036000830152614fc5816147d5565b9050919050565b60006020820190508181036000830152614fe581614855565b9050919050565b6000602082019050818103600083015261500581614895565b9050919050565b60006020820190508181036000830152615025816148fb565b9050919050565b600060208201905081810360008301526150458161493b565b9050919050565b60006020820190508181036000830152615065816149a1565b9050919050565b6000602082019050818103600083015261508581614a21565b9050919050565b600060208201905081810360008301526150a581614a61565b9050919050565b600060208201905081810360008301526150c581614ac7565b9050919050565b600060208201905081810360008301526150e581614b07565b9050919050565b6000602082019050818103600083015261510581614b47565b9050919050565b60006020820190506151216000830184614b96565b92915050565b6000604051905081810181811067ffffffffffffffff8211171561514e5761514d6157db565b5b8060405250919050565b600067ffffffffffffffff821115615173576151726157db565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff8211156151a3576151a26157db565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061525f82615625565b915061526a83615625565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561529f5761529e61574e565b5b828201905092915050565b60006152b58261562f565b91506152c08361562f565b92508260ff038211156152d6576152d561574e565b5b828201905092915050565b60006152ec82615625565b91506152f783615625565b9250826153075761530661577d565b5b828204905092915050565b600061531d8261562f565b91506153288361562f565b9250826153385761533761577d565b5b828204905092915050565b6000808291508390505b600185111561538d578086048111156153695761536861574e565b5b60018516156153785780820291505b808102905061538685615828565b945061534d565b94509492505050565b60006153a182615625565b91506153ac83615625565b92506153d97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84846153e1565b905092915050565b6000826153f157600190506154ad565b816153ff57600090506154ad565b8160018114615415576002811461541f5761544e565b60019150506154ad565b60ff8411156154315761543061574e565b5b8360020a9150848211156154485761544761574e565b5b506154ad565b5060208310610133831016604e8410600b84101617156154835782820a90508381111561547e5761547d61574e565b5b6154ad565b6154908484846001615343565b925090508184048111156154a7576154a661574e565b5b81810290505b9392505050565b60006154bf82615625565b91506154ca83615625565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156155035761550261574e565b5b828202905092915050565b60006155198261562f565b91506155248361562f565b92508160ff048311821515161561553e5761553d61574e565b5b828202905092915050565b600061555482615625565b915061555f83615625565b9250828210156155725761557161574e565b5b828203905092915050565b60006155888261562f565b91506155938361562f565b9250828210156155a6576155a561574e565b5b828203905092915050565b60006155bc82615605565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b8381101561566957808201518184015260208101905061564e565b83811115615678576000848401525b50505050565b6000600282049050600182168061569657607f821691505b602082108114156156aa576156a96157ac565b5b50919050565b60006156bb82615625565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156156ee576156ed61574e565b5b600182019050919050565b60006157048261570b565b9050919050565b60006157168261581b565b9050919050565b600061572882615625565b915061573383615625565b9250826157435761574261577d565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b60008160011c9050919050565b61583e816155b1565b811461584957600080fd5b50565b615855816155c3565b811461586057600080fd5b50565b61586c816155d9565b811461587757600080fd5b50565b61588381615625565b811461588e57600080fd5b5056fea2646970667358221220a7a4bba48fbd991fdba1c96c93ad34d3964c76aea7ef54d3ff31a8d9e830690664736f6c63430008000033
Deployed Bytecode Sourcemap
48362:4629:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36216:300;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37134:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38645:217;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38183:401;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48636:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52227:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52329:75;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49392:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48890:55;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39372:330;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25809:102;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52408:93;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52505:134;;;;;;;;;;;;;:::i;:::-;;25133:115;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39768:179;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50606:612;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51783:72;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49484:543;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51991:130;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48819:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48561:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48790:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48529:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36837:235;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36575:205;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15362:101;;;;;;;;;;;;;:::i;:::-;;52125:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14730:85;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48707:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37296:102;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24708:186;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48851:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50031:303;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38929:153;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48598:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24898:231;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51859:128;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40013:320;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48748:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51222:474;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48672:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25541:264;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51700:79;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39148:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50448:153;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50338:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15612:198;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36216:300;36318:4;36368:25;36353:40;;;:11;:40;;;;:104;;;;36424:33;36409:48;;;:11;:48;;;;36353:104;:156;;;;36473:36;36497:11;36473:23;:36::i;:::-;36353:156;36334:175;;36216:300;;;:::o;37134:98::-;37188:13;37220:5;37213:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37134:98;:::o;38645:217::-;38721:7;38748:16;38756:7;38748;:16::i;:::-;38740:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;38831:15;:24;38847:7;38831:24;;;;;;;;;;;;;;;;;;;;;38824:31;;38645:217;;;:::o;38183:401::-;38263:13;38279:23;38294:7;38279:14;:23::i;:::-;38263:39;;38326:5;38320:11;;:2;:11;;;;38312:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;38417:5;38401:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;38426:37;38443:5;38450:12;:10;:12::i;:::-;38426:16;:37::i;:::-;38401:62;38380:165;;;;;;;;;;;;:::i;:::-;;;;;;;;;38556:21;38565:2;38569:7;38556:8;:21::i;:::-;38183:401;;;:::o;48636:32::-;;;;:::o;52227:98::-;14953:12;:10;:12::i;:::-;14942:23;;:7;:5;:7::i;:::-;:23;;;14934:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52310:10:::1;52298:9;:22;;;;;;;;;;;;:::i;:::-;;52227:98:::0;:::o;52329:75::-;14953:12;:10;:12::i;:::-;14942:23;;:7;:5;:7::i;:::-;:23;;;14934:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52393:6:::1;52384;;:15;;;;;;;;;;;;;;;;;;52329:75:::0;:::o;49392:87::-;49436:7;49458:16;:6;:14;:16::i;:::-;49451:23;;49392:87;:::o;48890:55::-;;;;;;;;;;;;;;;;;:::o;39372:330::-;39561:41;39580:12;:10;:12::i;:::-;39594:7;39561:18;:41::i;:::-;39553:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;39667:28;39677:4;39683:2;39687:7;39667:9;:28::i;:::-;39372:330;;;:::o;25809:102::-;25853:13;25881:25;25895:10;25881:13;:25::i;:::-;25874:32;;25809:102;:::o;52408:93::-;14953:12;:10;:12::i;:::-;14942:23;;:7;:5;:7::i;:::-;:23;;;14934:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52490:6:::1;52472:15;;:24;;;;;;;;;;;;;;;;;;52408:93:::0;:::o;52505:134::-;14953:12;:10;:12::i;:::-;14942:23;;:7;:5;:7::i;:::-;:23;;;14934:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52549:7:::1;52570;:5;:7::i;:::-;52562:21;;52591;52562:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52548:69;;;52631:2;52623:11;;;::::0;::::1;;15012:1;52505:134::o:0;25133:115::-;25184:7;25206:37;25229:13;:11;:13::i;:::-;25206:22;:37::i;:::-;25199:44;;25133:115;:::o;39768:179::-;39901:39;39918:4;39924:2;39928:7;39901:39;;;;;;;;;;;;:16;:39::i;:::-;39768:179;;;:::o;50606:612::-;50678:16;50704:23;50730:17;50740:6;50730:9;:17::i;:::-;50704:43;;50753:30;50800:15;50786:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50753:63;;50822:22;50847:1;50822:26;;50854:23;50888:299;50913:15;50895;:33;:64;;;;;50950:9;;50932:14;:27;;50895:64;50888:299;;;50969:25;50997:23;51005:14;50997:7;:23::i;:::-;50969:51;;51054:6;51033:27;;:17;:27;;;51029:127;;;51105:14;51072:13;51086:15;51072:30;;;;;;;;;;;;;;;;;;;;;:47;;;;;51130:17;;;;;:::i;:::-;;;;51029:127;51164:16;;;;;:::i;:::-;;;;50888:299;;;;51200:13;51193:20;;;;;;50606:612;;;:::o;51783:72::-;14953:12;:10;:12::i;:::-;14942:23;;:7;:5;:7::i;:::-;:23;;;14934:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51845:5:::1;51838:4;:12;;;;51783:72:::0;:::o;49484:543::-;49589:11;49231:1;49217:11;:15;:52;;;;;49251:18;;49236:11;:33;;49217:52;49209:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;49342:9;;49327:11;49308:16;:6;:14;:16::i;:::-;:30;;;;:::i;:::-;:43;;49300:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;49630:9:::1;24516:19;24538:37;24561:13;:11;:13::i;:::-;24538:22;:37::i;:::-;24516:59;;24581:14;24598:30;24618:9;24598:11;:19;;:30;;;;:::i;:::-;24581:47;;24653:7;;;;;;;;;;;24643:17;;:6;:17;;;24635:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;49658:6:::2;;;;;;;;;;;49657:7;49649:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;49706:15;;;;;;;;;;;49698:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;49781:11;49774:4;;:18;;;;:::i;:::-;49761:9;:31;;49753:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;49823:24;49850:20;:32;49871:10;49850:32;;;;;;;;;;;;;;;;49823:59;;49930:18;;49915:11;49896:16;:30;;;;:::i;:::-;:52;;49888:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;49988:34;49998:10;50010:11;49988:9;:34::i;:::-;24698:1;49382::::1;;;49484:543:::0;;;:::o;51991:130::-;14953:12;:10;:12::i;:::-;14942:23;;:7;:5;:7::i;:::-;:23;;;14934:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52098:18:::1;52078:17;:38;;;;;;;;;;;;:::i;:::-;;51991:130:::0;:::o;48819:28::-;;;;;;;;;;;;;:::o;48561:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;48790:25::-;;;;;;;;;;;;;:::o;48529:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;36837:235::-;36909:7;36928:13;36944:7;:16;36952:7;36944:16;;;;;;;;;;;;;;;;;;;;;36928:32;;36995:1;36978:19;;:5;:19;;;;36970:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;37060:5;37053:12;;;36837:235;;;:::o;36575:205::-;36647:7;36691:1;36674:19;;:5;:19;;;;36666:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;36757:9;:16;36767:5;36757:16;;;;;;;;;;;;;;;;36750:23;;36575:205;;;:::o;15362:101::-;14953:12;:10;:12::i;:::-;14942:23;;:7;:5;:7::i;:::-;:23;;;14934:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;15426:30:::1;15453:1;15426:18;:30::i;:::-;15362:101::o:0;52125:98::-;14953:12;:10;:12::i;:::-;14942:23;;:7;:5;:7::i;:::-;:23;;;14934:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52208:10:::1;52196:9;:22;;;;;;;;;;;;:::i;:::-;;52125:98:::0;:::o;14730:85::-;14776:7;14802:6;;;;;;;;;;;14795:13;;14730:85;:::o;48707:37::-;;;;:::o;37296:102::-;37352:13;37384:7;37377:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37296:102;:::o;24708:186::-;24779:12;24799:23;24825:18;24833:9;24825:7;:18::i;:::-;24799:44;;24873:15;24856:33;;;;;;;;:::i;:::-;;;;;;;;;;;;;24849:40;;;24708:186;;;:::o;48851:34::-;;;;;;;;;;;;;:::o;50031:303::-;50096:11;49231:1;49217:11;:15;:52;;;;;49251:18;;49236:11;:33;;49217:52;49209:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;49342:9;;49327:11;49308:16;:6;:14;:16::i;:::-;:30;;;;:::i;:::-;:43;;49300:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;50124:6:::1;;;;;;;;;;;50123:7;50115:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;50173:15;;;;;;;;;;;50172:16;50164:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;50249:11;50242:4;;:18;;;;:::i;:::-;50229:9;:31;;50221:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;50295:34;50305:10;50317:11;50295:9;:34::i;:::-;50031:303:::0;;:::o;38929:153::-;39023:52;39042:12;:10;:12::i;:::-;39056:8;39066;39023:18;:52::i;:::-;38929:153;;:::o;48598:31::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;24898:231::-;24960:7;24975:19;24997:37;25020:13;:11;:13::i;:::-;24997:22;:37::i;:::-;24975:59;;25040:23;25066:30;25086:9;25066:11;:19;;:30;;;;:::i;:::-;25040:56;;25109:15;25102:22;;;;24898:231;;;:::o;51859:128::-;14953:12;:10;:12::i;:::-;14942:23;;:7;:5;:7::i;:::-;:23;;;14934:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51963:19:::1;51942:18;:40;;;;51859:128:::0;:::o;40013:320::-;40182:41;40201:12;:10;:12::i;:::-;40215:7;40182:18;:41::i;:::-;40174:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;40287:39;40301:4;40307:2;40311:7;40320:5;40287:13;:39::i;:::-;40013:320;;;;:::o;48748:37::-;;;;:::o;51222:474::-;51316:13;51354:17;51362:8;51354:7;:17::i;:::-;51339:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;51457:5;51445:17;;:8;;;;;;;;;;;:17;;;51441:62;;;51479:17;51472:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51441:62;51509:28;51540:10;:8;:10::i;:::-;51509:41;;51594:1;51569:14;51563:28;:32;:128;;;;;;;;;;;;;;;;;51630:14;51646:19;:8;:17;:19::i;:::-;51667:9;51613:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;51563:128;51556:135;;;51222:474;;;;:::o;48672:31::-;;;;:::o;25541:264::-;25611:7;25626:14;25649:1;25626:25;;25749:26;25766:1;:8;25749:16;:26::i;:::-;25785:1;25681:113;;;;;;;;;:::i;:::-;;;;;;;;;;;;;25664:136;;;;;;25657:143;;;25541:264;;;:::o;51700:79::-;14953:12;:10;:12::i;:::-;14942:23;;:7;:5;:7::i;:::-;:23;;;14934:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51768:6:::1;51757:8;;:17;;;;;;;;;;;;;;;;;;51700:79:::0;:::o;39148:162::-;39245:4;39268:18;:25;39287:5;39268:25;;;;;;;;;;;;;;;:35;39294:8;39268:35;;;;;;;;;;;;;;;;;;;;;;;;;39261:42;;39148:162;;;;:::o;50448:153::-;50534:11;49231:1;49217:11;:15;:52;;;;;49251:18;;49236:11;:33;;49217:52;49209:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;49342:9;;49327:11;49308:16;:6;:14;:16::i;:::-;:30;;;;:::i;:::-;:43;;49300:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;14953:12:::1;:10;:12::i;:::-;14942:23;;:7;:5;:7::i;:::-;:23;;;14934:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50563:33:::2;50573:9;50584:11;50563:9;:33::i;:::-;50448:153:::0;;;:::o;50338:104::-;14953:12;:10;:12::i;:::-;14942:23;;:7;:5;:7::i;:::-;:23;;;14934:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50403:34:::1;50413:10;50425:11;50403:9;:34::i;:::-;50338:104:::0;:::o;15612:198::-;14953:12;:10;:12::i;:::-;14942:23;;:7;:5;:7::i;:::-;:23;;;14934:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;15720:1:::1;15700:22;;:8;:22;;;;15692:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;15775:28;15794:8;15775:18;:28::i;:::-;15612:198:::0;:::o;29216:155::-;29301:4;29339:25;29324:40;;;:11;:40;;;;29317:47;;29216:155;;;:::o;41805:125::-;41870:4;41921:1;41893:30;;:7;:16;41901:7;41893:16;;;;;;;;;;;;;;;;;;;;;:30;;;;41886:37;;41805:125;;;:::o;13498:96::-;13551:7;13577:10;13570:17;;13498:96;:::o;45656:171::-;45757:2;45730:15;:24;45746:7;45730:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;45812:7;45808:2;45774:46;;45783:23;45798:7;45783:14;:23::i;:::-;45774:46;;;;;;;;;;;;45656:171;;:::o;883:112::-;948:7;974;:14;;;967:21;;883:112;;;:::o;42088:344::-;42181:4;42205:16;42213:7;42205;:16::i;:::-;42197:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;42280:13;42296:23;42311:7;42296:14;:23::i;:::-;42280:39;;42348:5;42337:16;;:7;:16;;;:51;;;;42381:7;42357:31;;:20;42369:7;42357:11;:20::i;:::-;:31;;;42337:51;:87;;;;42392:32;42409:5;42416:7;42392:16;:32::i;:::-;42337:87;42329:96;;;42088:344;;;;:::o;44985:560::-;45139:4;45112:31;;:23;45127:7;45112:14;:23::i;:::-;:31;;;45104:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;45221:1;45207:16;;:2;:16;;;;45199:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;45275:39;45296:4;45302:2;45306:7;45275:20;:39::i;:::-;45376:29;45393:1;45397:7;45376:8;:29::i;:::-;45435:1;45416:9;:15;45426:4;45416:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;45463:1;45446:9;:13;45456:2;45446:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;45493:2;45474:7;:16;45482:7;45474:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;45530:7;45526:2;45511:27;;45520:4;45511:27;;;;;;;;;;;;44985:560;;;:::o;25915:411::-;25972:13;25993:14;26020:2;26010:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25993:30;;26035:9;26030:269;26054:2;26050:1;:6;26030:269;;;26071:8;26134:1;26129:2;:6;;;;:::i;:::-;26124:1;:12;;;;:::i;:::-;26118:1;:19;;;;:::i;:::-;26111:1;26095:19;;:43;;;;:::i;:::-;26082:58;;26071:69;;26148:9;26178:2;26173:1;26167:8;;:13;;;;:::i;:::-;26160:21;;26148:33;;26189:9;26230:2;26224:9;;26219:2;:14;;;;:::i;:::-;26214:1;26208:8;;:25;;;;:::i;:::-;26201:33;;26189:45;;26253:8;26258:2;26253:4;:8::i;:::-;26242:1;26248;26244;:5;;;;:::i;:::-;26242:8;;;;;;;;;;;;;;;;;;;:19;;;;;;;;;;;26284:8;26289:2;26284:4;:8::i;:::-;26269:1;26279;26275;26271;:5;;;;:::i;:::-;:9;;;;:::i;:::-;26269:12;;;;;;;;;;;;;;;;;;;:23;;;;;;;;;;;26030:269;;;26058:3;;;;;:::i;:::-;;;;26030:269;;;;26319:1;26305:16;;;25915:411;;;:::o;7807:227::-;7885:7;7905:17;7924:18;7946:27;7957:4;7963:9;7946:10;:27::i;:::-;7904:69;;;;7983:18;7995:5;7983:11;:18::i;:::-;8018:9;8011:16;;;;7807:227;;;;:::o;52643:240::-;52722:9;52717:162;52741:11;52737:1;:15;52717:162;;;52767:20;:31;52788:9;52767:31;;;;;;;;;;;;;;;;:33;;;;;;;;;:::i;:::-;;;;;;52808:18;:6;:16;:18::i;:::-;52834:38;52844:9;52855:16;:6;:14;:16::i;:::-;52834:9;:38::i;:::-;52754:3;;;;;:::i;:::-;;;;52717:162;;;;52643:240;;:::o;15964:187::-;16037:16;16056:6;;;;;;;;;;;16037:25;;16081:8;16072:6;;:17;;;;;;;;;;;;;;;;;;16135:8;16104:40;;16125:8;16104:40;;;;;;;;;;;;15964:187;;:::o;45962:307::-;46112:8;46103:17;;:5;:17;;;;46095:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;46198:8;46160:18;:25;46179:5;46160:25;;;;;;;;;;;;;;;:35;46186:8;46160:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;46243:8;46221:41;;46236:5;46221:41;;;46253:8;46221:41;;;;;;:::i;:::-;;;;;;;;45962:307;;;:::o;41195:::-;41346:28;41356:4;41362:2;41366:7;41346:9;:28::i;:::-;41392:48;41415:4;41421:2;41425:7;41434:5;41392:22;:48::i;:::-;41384:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;41195:307;;;;:::o;52887:102::-;52947:13;52975:9;52968:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52887:102;:::o;1802:703::-;1858:13;2084:1;2075:5;:10;2071:51;;;2101:10;;;;;;;;;;;;;;;;;;;;;2071:51;2131:12;2146:5;2131:20;;2161:14;2185:75;2200:1;2192:4;:9;2185:75;;2217:8;;;;;:::i;:::-;;;;2247:2;2239:10;;;;;:::i;:::-;;;2185:75;;;2269:19;2301:6;2291:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2269:39;;2318:150;2334:1;2325:5;:10;2318:150;;2361:1;2351:11;;;;;:::i;:::-;;;2427:2;2419:5;:10;;;;:::i;:::-;2406:2;:24;;;;:::i;:::-;2393:39;;2376:6;2383;2376:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;2455:2;2446:11;;;;;:::i;:::-;;;2318:150;;;2491:6;2477:21;;;;;1802:703;;;;:::o;48156:122::-;;;;:::o;26330:154::-;26377:8;26412:2;26407:1;26401:8;;:13;;;26400:79;;26474:4;26469:1;26463:8;;:15;;;;:::i;:::-;26456:23;;26400:79;;;26442:4;26437:1;26431:8;;:15;;;;:::i;:::-;26424:23;;26400:79;26393:86;;26330:154;;;:::o;5742:1279::-;5823:7;5832:12;6073:2;6053:9;:16;:22;6049:966;;;6091:9;6114;6137:7;6342:4;6331:9;6327:20;6321:27;6316:32;;6391:4;6380:9;6376:20;6370:27;6365:32;;6448:4;6437:9;6433:20;6427:27;6424:1;6419:36;6414:41;;6489:25;6500:4;6506:1;6509;6512;6489:10;:25::i;:::-;6482:32;;;;;;;;;6049:966;6555:2;6535:9;:16;:22;6531:484;;;6573:9;6596:10;6804:4;6793:9;6789:20;6783:27;6778:32;;6854:4;6843:9;6839:20;6833:27;6827:33;;6894:23;6905:4;6911:1;6914:2;6894:10;:23::i;:::-;6887:30;;;;;;;;6531:484;6964:1;6968:35;6948:56;;;;5742:1279;;;;;;:::o;4047:631::-;4124:20;4115:29;;;;;;;;;;;;;;;;:5;:29;;;;;;;;;;;;;;;;;4111:561;;;4160:7;;4111:561;4220:29;4211:38;;;;;;;;;;;;;;;;:5;:38;;;;;;;;;;;;;;;;;4207:465;;;4265:34;;;;;;;;;;:::i;:::-;;;;;;;;4207:465;4329:35;4320:44;;;;;;;;;;;;;;;;:5;:44;;;;;;;;;;;;;;;;;4316:356;;;4380:41;;;;;;;;;;:::i;:::-;;;;;;;;4316:356;4451:30;4442:39;;;;;;;;;;;;;;;;:5;:39;;;;;;;;;;;;;;;;;4438:234;;;4497:44;;;;;;;;;;:::i;:::-;;;;;;;;4438:234;4571:30;4562:39;;;;;;;;;;;;;;;;:5;:39;;;;;;;;;;;;;;;;;4558:114;;;4617:44;;;;;;;;;;:::i;:::-;;;;;;;;4558:114;4047:631;;:::o;1001:123::-;1106:1;1088:7;:14;;;:19;;;;;;;;;;;1001:123;:::o;42762:108::-;42837:26;42847:2;42851:7;42837:26;;;;;;;;;;;;:9;:26::i;:::-;42762:108;;:::o;46822:778::-;46972:4;46992:15;:2;:13;;;:15::i;:::-;46988:606;;;47043:2;47027:36;;;47064:12;:10;:12::i;:::-;47078:4;47084:7;47093:5;47027:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;47023:519;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47283:1;47266:6;:13;:18;47262:266;;;47308:60;;;;;;;;;;:::i;:::-;;;;;;;;47262:266;47480:6;47474:13;47465:6;47461:2;47457:15;47450:38;47023:519;47159:41;;;47149:51;;;:6;:51;;;;47142:58;;;;;46988:606;47579:4;47572:11;;46822:778;;;;;;;:::o;9258:1603::-;9384:7;9393:12;10308:66;10303:1;10295:10;;:79;10291:161;;;10406:1;10410:30;10390:51;;;;;;10291:161;10470:2;10465:1;:7;;;;:18;;;;;10481:2;10476:1;:7;;;;10465:18;10461:100;;;10515:1;10519:30;10499:51;;;;;;10461:100;10655:14;10672:24;10682:4;10688:1;10691;10694;10672:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10655:41;;10728:1;10710:20;;:6;:20;;;10706:101;;;10762:1;10766:29;10746:50;;;;;;;10706:101;10825:6;10833:20;10817:37;;;;;9258:1603;;;;;;;;:::o;8288:379::-;8398:7;8407:12;8431:9;8450:7;8503:66;8499:2;8495:75;8490:80;;8606:2;8601;8596:3;8592:12;8588:21;8583:26;;8635:25;8646:4;8652:1;8655;8658;8635:10;:25::i;:::-;8628:32;;;;;;8288:379;;;;;;:::o;43091:311::-;43216:18;43222:2;43226:7;43216:5;:18::i;:::-;43265:54;43296:1;43300:2;43304:7;43313:5;43265:22;:54::i;:::-;43244:151;;;;;;;;;;;;:::i;:::-;;;;;;;;;43091:311;;;:::o;16947:377::-;17007:4;17210:12;17275:7;17263:20;17255:28;;17316:1;17309:4;:8;17302:15;;;16947:377;;;:::o;43724:372::-;43817:1;43803:16;;:2;:16;;;;43795:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;43875:16;43883:7;43875;:16::i;:::-;43874:17;43866:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;43935:45;43964:1;43968:2;43972:7;43935:20;:45::i;:::-;44008:1;43991:9;:13;44001:2;43991:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;44038:2;44019:7;:16;44027:7;44019:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;44081:7;44077:2;44056:33;;44073:1;44056:33;;;;;;;;;;;;43724:372;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:342:2:-;;109:64;124:48;165:6;124:48;:::i;:::-;109:64;:::i;:::-;100:73;;196:6;189:5;182:21;234:4;227:5;223:16;272:3;263:6;258:3;254:16;251:25;248:2;;;289:1;286;279:12;248:2;302:41;336:6;331:3;326;302:41;:::i;:::-;90:259;;;;;;:::o;355:344::-;;458:65;473:49;515:6;473:49;:::i;:::-;458:65;:::i;:::-;449:74;;546:6;539:5;532:21;584:4;577:5;573:16;622:3;613:6;608:3;604:16;601:25;598:2;;;639:1;636;629:12;598:2;652:41;686:6;681:3;676;652:41;:::i;:::-;439:260;;;;;;:::o;705:139::-;;789:6;776:20;767:29;;805:33;832:5;805:33;:::i;:::-;757:87;;;;:::o;850:133::-;;931:6;918:20;909:29;;947:30;971:5;947:30;:::i;:::-;899:84;;;;:::o;989:137::-;;1072:6;1059:20;1050:29;;1088:32;1114:5;1088:32;:::i;:::-;1040:86;;;;:::o;1132:141::-;;1219:6;1213:13;1204:22;;1235:32;1261:5;1235:32;:::i;:::-;1194:79;;;;:::o;1292:271::-;;1396:3;1389:4;1381:6;1377:17;1373:27;1363:2;;1414:1;1411;1404:12;1363:2;1454:6;1441:20;1479:78;1553:3;1545:6;1538:4;1530:6;1526:17;1479:78;:::i;:::-;1470:87;;1353:210;;;;;:::o;1583:273::-;;1688:3;1681:4;1673:6;1669:17;1665:27;1655:2;;1706:1;1703;1696:12;1655:2;1746:6;1733:20;1771:79;1846:3;1838:6;1831:4;1823:6;1819:17;1771:79;:::i;:::-;1762:88;;1645:211;;;;;:::o;1862:139::-;;1946:6;1933:20;1924:29;;1962:33;1989:5;1962:33;:::i;:::-;1914:87;;;;:::o;2007:262::-;;2115:2;2103:9;2094:7;2090:23;2086:32;2083:2;;;2131:1;2128;2121:12;2083:2;2174:1;2199:53;2244:7;2235:6;2224:9;2220:22;2199:53;:::i;:::-;2189:63;;2145:117;2073:196;;;;:::o;2275:407::-;;;2400:2;2388:9;2379:7;2375:23;2371:32;2368:2;;;2416:1;2413;2406:12;2368:2;2459:1;2484:53;2529:7;2520:6;2509:9;2505:22;2484:53;:::i;:::-;2474:63;;2430:117;2586:2;2612:53;2657:7;2648:6;2637:9;2633:22;2612:53;:::i;:::-;2602:63;;2557:118;2358:324;;;;;:::o;2688:552::-;;;;2830:2;2818:9;2809:7;2805:23;2801:32;2798:2;;;2846:1;2843;2836:12;2798:2;2889:1;2914:53;2959:7;2950:6;2939:9;2935:22;2914:53;:::i;:::-;2904:63;;2860:117;3016:2;3042:53;3087:7;3078:6;3067:9;3063:22;3042:53;:::i;:::-;3032:63;;2987:118;3144:2;3170:53;3215:7;3206:6;3195:9;3191:22;3170:53;:::i;:::-;3160:63;;3115:118;2788:452;;;;;:::o;3246:809::-;;;;;3414:3;3402:9;3393:7;3389:23;3385:33;3382:2;;;3431:1;3428;3421:12;3382:2;3474:1;3499:53;3544:7;3535:6;3524:9;3520:22;3499:53;:::i;:::-;3489:63;;3445:117;3601:2;3627:53;3672:7;3663:6;3652:9;3648:22;3627:53;:::i;:::-;3617:63;;3572:118;3729:2;3755:53;3800:7;3791:6;3780:9;3776:22;3755:53;:::i;:::-;3745:63;;3700:118;3885:2;3874:9;3870:18;3857:32;3916:18;3908:6;3905:30;3902:2;;;3948:1;3945;3938:12;3902:2;3976:62;4030:7;4021:6;4010:9;4006:22;3976:62;:::i;:::-;3966:72;;3828:220;3372:683;;;;;;;:::o;4061:401::-;;;4183:2;4171:9;4162:7;4158:23;4154:32;4151:2;;;4199:1;4196;4189:12;4151:2;4242:1;4267:53;4312:7;4303:6;4292:9;4288:22;4267:53;:::i;:::-;4257:63;;4213:117;4369:2;4395:50;4437:7;4428:6;4417:9;4413:22;4395:50;:::i;:::-;4385:60;;4340:115;4141:321;;;;;:::o;4468:407::-;;;4593:2;4581:9;4572:7;4568:23;4564:32;4561:2;;;4609:1;4606;4599:12;4561:2;4652:1;4677:53;4722:7;4713:6;4702:9;4698:22;4677:53;:::i;:::-;4667:63;;4623:117;4779:2;4805:53;4850:7;4841:6;4830:9;4826:22;4805:53;:::i;:::-;4795:63;;4750:118;4551:324;;;;;:::o;4881:256::-;;4986:2;4974:9;4965:7;4961:23;4957:32;4954:2;;;5002:1;4999;4992:12;4954:2;5045:1;5070:50;5112:7;5103:6;5092:9;5088:22;5070:50;:::i;:::-;5060:60;;5016:114;4944:193;;;;:::o;5143:260::-;;5250:2;5238:9;5229:7;5225:23;5221:32;5218:2;;;5266:1;5263;5256:12;5218:2;5309:1;5334:52;5378:7;5369:6;5358:9;5354:22;5334:52;:::i;:::-;5324:62;;5280:116;5208:195;;;;:::o;5409:282::-;;5527:2;5515:9;5506:7;5502:23;5498:32;5495:2;;;5543:1;5540;5533:12;5495:2;5586:1;5611:63;5666:7;5657:6;5646:9;5642:22;5611:63;:::i;:::-;5601:73;;5557:127;5485:206;;;;:::o;5697:373::-;;5814:2;5802:9;5793:7;5789:23;5785:32;5782:2;;;5830:1;5827;5820:12;5782:2;5901:1;5890:9;5886:17;5873:31;5931:18;5923:6;5920:30;5917:2;;;5963:1;5960;5953:12;5917:2;5991:62;6045:7;6036:6;6025:9;6021:22;5991:62;:::i;:::-;5981:72;;5844:219;5772:298;;;;:::o;6076:518::-;;;6210:2;6198:9;6189:7;6185:23;6181:32;6178:2;;;6226:1;6223;6216:12;6178:2;6297:1;6286:9;6282:17;6269:31;6327:18;6319:6;6316:30;6313:2;;;6359:1;6356;6349:12;6313:2;6387:62;6441:7;6432:6;6421:9;6417:22;6387:62;:::i;:::-;6377:72;;6240:219;6498:2;6524:53;6569:7;6560:6;6549:9;6545:22;6524:53;:::i;:::-;6514:63;;6469:118;6168:426;;;;;:::o;6600:375::-;;6718:2;6706:9;6697:7;6693:23;6689:32;6686:2;;;6734:1;6731;6724:12;6686:2;6805:1;6794:9;6790:17;6777:31;6835:18;6827:6;6824:30;6821:2;;;6867:1;6864;6857:12;6821:2;6895:63;6950:7;6941:6;6930:9;6926:22;6895:63;:::i;:::-;6885:73;;6748:220;6676:299;;;;:::o;6981:262::-;;7089:2;7077:9;7068:7;7064:23;7060:32;7057:2;;;7105:1;7102;7095:12;7057:2;7148:1;7173:53;7218:7;7209:6;7198:9;7194:22;7173:53;:::i;:::-;7163:63;;7119:117;7047:196;;;;:::o;7249:407::-;;;7374:2;7362:9;7353:7;7349:23;7345:32;7342:2;;;7390:1;7387;7380:12;7342:2;7433:1;7458:53;7503:7;7494:6;7483:9;7479:22;7458:53;:::i;:::-;7448:63;;7404:117;7560:2;7586:53;7631:7;7622:6;7611:9;7607:22;7586:53;:::i;:::-;7576:63;;7531:118;7332:324;;;;;:::o;7662:179::-;;7752:46;7794:3;7786:6;7752:46;:::i;:::-;7830:4;7825:3;7821:14;7807:28;;7742:99;;;;:::o;7847:118::-;7934:24;7952:5;7934:24;:::i;:::-;7929:3;7922:37;7912:53;;:::o;7971:157::-;8076:45;8096:24;8114:5;8096:24;:::i;:::-;8076:45;:::i;:::-;8071:3;8064:58;8054:74;;:::o;8164:732::-;;8312:54;8360:5;8312:54;:::i;:::-;8382:86;8461:6;8456:3;8382:86;:::i;:::-;8375:93;;8492:56;8542:5;8492:56;:::i;:::-;8571:7;8602:1;8587:284;8612:6;8609:1;8606:13;8587:284;;;8688:6;8682:13;8715:63;8774:3;8759:13;8715:63;:::i;:::-;8708:70;;8801:60;8854:6;8801:60;:::i;:::-;8791:70;;8647:224;8634:1;8631;8627:9;8622:14;;8587:284;;;8591:14;8887:3;8880:10;;8288:608;;;;;;;:::o;8902:109::-;8983:21;8998:5;8983:21;:::i;:::-;8978:3;8971:34;8961:50;;:::o;9017:118::-;9104:24;9122:5;9104:24;:::i;:::-;9099:3;9092:37;9082:53;;:::o;9141:360::-;;9255:38;9287:5;9255:38;:::i;:::-;9309:70;9372:6;9367:3;9309:70;:::i;:::-;9302:77;;9388:52;9433:6;9428:3;9421:4;9414:5;9410:16;9388:52;:::i;:::-;9465:29;9487:6;9465:29;:::i;:::-;9460:3;9456:39;9449:46;;9231:270;;;;;:::o;9507:373::-;;9639:38;9671:5;9639:38;:::i;:::-;9693:88;9774:6;9769:3;9693:88;:::i;:::-;9686:95;;9790:52;9835:6;9830:3;9823:4;9816:5;9812:16;9790:52;:::i;:::-;9867:6;9862:3;9858:16;9851:23;;9615:265;;;;;:::o;9886:364::-;;10002:39;10035:5;10002:39;:::i;:::-;10057:71;10121:6;10116:3;10057:71;:::i;:::-;10050:78;;10137:52;10182:6;10177:3;10170:4;10163:5;10159:16;10137:52;:::i;:::-;10214:29;10236:6;10214:29;:::i;:::-;10209:3;10205:39;10198:46;;9978:272;;;;;:::o;10256:377::-;;10390:39;10423:5;10390:39;:::i;:::-;10445:89;10527:6;10522:3;10445:89;:::i;:::-;10438:96;;10543:52;10588:6;10583:3;10576:4;10569:5;10565:16;10543:52;:::i;:::-;10620:6;10615:3;10611:16;10604:23;;10366:267;;;;;:::o;10663:845::-;;10803:5;10797:12;10832:36;10858:9;10832:36;:::i;:::-;10884:89;10966:6;10961:3;10884:89;:::i;:::-;10877:96;;11004:1;10993:9;10989:17;11020:1;11015:137;;;;11166:1;11161:341;;;;10982:520;;11015:137;11099:4;11095:9;11084;11080:25;11075:3;11068:38;11135:6;11130:3;11126:16;11119:23;;11015:137;;11161:341;11228:38;11260:5;11228:38;:::i;:::-;11288:1;11302:154;11316:6;11313:1;11310:13;11302:154;;;11390:7;11384:14;11380:1;11375:3;11371:11;11364:35;11440:1;11431:7;11427:15;11416:26;;11338:4;11335:1;11331:12;11326:17;;11302:154;;;11485:6;11480:3;11476:16;11469:23;;11168:334;;10982:520;;10770:738;;;;;;:::o;11514:322::-;;11677:67;11741:2;11736:3;11677:67;:::i;:::-;11670:74;;11774:26;11770:1;11765:3;11761:11;11754:47;11827:2;11822:3;11818:12;11811:19;;11660:176;;;:::o;11842:329::-;;12005:67;12069:2;12064:3;12005:67;:::i;:::-;11998:74;;12102:33;12098:1;12093:3;12089:11;12082:54;12162:2;12157:3;12153:12;12146:19;;11988:183;;;:::o;12177:382::-;;12340:67;12404:2;12399:3;12340:67;:::i;:::-;12333:74;;12437:34;12433:1;12428:3;12424:11;12417:55;12503:20;12498:2;12493:3;12489:12;12482:42;12550:2;12545:3;12541:12;12534:19;;12323:236;;;:::o;12565:370::-;;12728:67;12792:2;12787:3;12728:67;:::i;:::-;12721:74;;12825:34;12821:1;12816:3;12812:11;12805:55;12891:8;12886:2;12881:3;12877:12;12870:30;12926:2;12921:3;12917:12;12910:19;;12711:224;;;:::o;12941:326::-;;13104:67;13168:2;13163:3;13104:67;:::i;:::-;13097:74;;13201:30;13197:1;13192:3;13188:11;13181:51;13258:2;13253:3;13249:12;13242:19;;13087:180;;;:::o;13273:318::-;;13436:67;13500:2;13495:3;13436:67;:::i;:::-;13429:74;;13533:22;13529:1;13524:3;13520:11;13513:43;13582:2;13577:3;13573:12;13566:19;;13419:172;;;:::o;13597:326::-;;13760:67;13824:2;13819:3;13760:67;:::i;:::-;13753:74;;13857:30;13853:1;13848:3;13844:11;13837:51;13914:2;13909:3;13905:12;13898:19;;13743:180;;;:::o;13929:368::-;;14092:67;14156:2;14151:3;14092:67;:::i;:::-;14085:74;;14189:34;14185:1;14180:3;14176:11;14169:55;14255:6;14250:2;14245:3;14241:12;14234:28;14288:2;14283:3;14279:12;14272:19;;14075:222;;;:::o;14303:323::-;;14466:67;14530:2;14525:3;14466:67;:::i;:::-;14459:74;;14563:27;14559:1;14554:3;14550:11;14543:48;14617:2;14612:3;14608:12;14601:19;;14449:177;;;:::o;14632:366::-;;14795:67;14859:2;14854:3;14795:67;:::i;:::-;14788:74;;14892:34;14888:1;14883:3;14879:11;14872:55;14958:4;14953:2;14948:3;14944:12;14937:26;14989:2;14984:3;14980:12;14973:19;;14778:220;;;:::o;15004:376::-;;15167:67;15231:2;15226:3;15167:67;:::i;:::-;15160:74;;15264:34;15260:1;15255:3;15251:11;15244:55;15330:14;15325:2;15320:3;15316:12;15309:36;15371:2;15366:3;15362:12;15355:19;;15150:230;;;:::o;15386:388::-;;15549:67;15613:2;15608:3;15549:67;:::i;:::-;15542:74;;15646:34;15642:1;15637:3;15633:11;15626:55;15712:26;15707:2;15702:3;15698:12;15691:48;15765:2;15760:3;15756:12;15749:19;;15532:242;;;:::o;15780:374::-;;15943:67;16007:2;16002:3;15943:67;:::i;:::-;15936:74;;16040:34;16036:1;16031:3;16027:11;16020:55;16106:12;16101:2;16096:3;16092:12;16085:34;16145:2;16140:3;16136:12;16129:19;;15926:228;;;:::o;16160:373::-;;16323:67;16387:2;16382:3;16323:67;:::i;:::-;16316:74;;16420:34;16416:1;16411:3;16407:11;16400:55;16486:11;16481:2;16476:3;16472:12;16465:33;16524:2;16519:3;16515:12;16508:19;;16306:227;;;:::o;16539:366::-;;16702:67;16766:2;16761:3;16702:67;:::i;:::-;16695:74;;16799:34;16795:1;16790:3;16786:11;16779:55;16865:4;16860:2;16855:3;16851:12;16844:26;16896:2;16891:3;16887:12;16880:19;;16685:220;;;:::o;16911:330::-;;17074:67;17138:2;17133:3;17074:67;:::i;:::-;17067:74;;17171:34;17167:1;17162:3;17158:11;17151:55;17232:2;17227:3;17223:12;17216:19;;17057:184;;;:::o;17247:376::-;;17410:67;17474:2;17469:3;17410:67;:::i;:::-;17403:74;;17507:34;17503:1;17498:3;17494:11;17487:55;17573:14;17568:2;17563:3;17559:12;17552:36;17614:2;17609:3;17605:12;17598:19;;17393:230;;;:::o;17629:330::-;;17792:67;17856:2;17851:3;17792:67;:::i;:::-;17785:74;;17889:34;17885:1;17880:3;17876:11;17869:55;17950:2;17945:3;17941:12;17934:19;;17775:184;;;:::o;17965:398::-;;18146:85;18228:2;18223:3;18146:85;:::i;:::-;18139:92;;18261:66;18257:1;18252:3;18248:11;18241:87;18354:2;18349:3;18345:12;18338:19;;18129:234;;;:::o;18369:321::-;;18532:67;18596:2;18591:3;18532:67;:::i;:::-;18525:74;;18629:25;18625:1;18620:3;18616:11;18609:46;18681:2;18676:3;18672:12;18665:19;;18515:175;;;:::o;18696:373::-;;18859:67;18923:2;18918:3;18859:67;:::i;:::-;18852:74;;18956:34;18952:1;18947:3;18943:11;18936:55;19022:11;19017:2;19012:3;19008:12;19001:33;19060:2;19055:3;19051:12;19044:19;;18842:227;;;:::o;19075:319::-;;19238:67;19302:2;19297:3;19238:67;:::i;:::-;19231:74;;19335:23;19331:1;19326:3;19322:11;19315:44;19385:2;19380:3;19376:12;19369:19;;19221:173;;;:::o;19400:379::-;;19563:67;19627:2;19622:3;19563:67;:::i;:::-;19556:74;;19660:34;19656:1;19651:3;19647:11;19640:55;19726:17;19721:2;19716:3;19712:12;19705:39;19770:2;19765:3;19761:12;19754:19;;19546:233;;;:::o;19785:365::-;;19948:67;20012:2;20007:3;19948:67;:::i;:::-;19941:74;;20045:34;20041:1;20036:3;20032:11;20025:55;20111:3;20106:2;20101:3;20097:12;20090:25;20141:2;20136:3;20132:12;20125:19;;19931:219;;;:::o;20156:297::-;;20336:83;20417:1;20412:3;20336:83;:::i;:::-;20329:90;;20445:1;20440:3;20436:11;20429:18;;20319:134;;;:::o;20459:318::-;;20622:67;20686:2;20681:3;20622:67;:::i;:::-;20615:74;;20719:22;20715:1;20710:3;20706:11;20699:43;20768:2;20763:3;20759:12;20752:19;;20605:172;;;:::o;20783:381::-;;20946:67;21010:2;21005:3;20946:67;:::i;:::-;20939:74;;21043:34;21039:1;21034:3;21030:11;21023:55;21109:19;21104:2;21099:3;21095:12;21088:41;21155:2;21150:3;21146:12;21139:19;;20929:235;;;:::o;21170:320::-;;21333:67;21397:2;21392:3;21333:67;:::i;:::-;21326:74;;21430:24;21426:1;21421:3;21417:11;21410:45;21481:2;21476:3;21472:12;21465:19;;21316:174;;;:::o;21496:325::-;;21659:67;21723:2;21718:3;21659:67;:::i;:::-;21652:74;;21756:29;21752:1;21747:3;21743:11;21736:50;21812:2;21807:3;21803:12;21796:19;;21642:179;;;:::o;21827:317::-;;21990:67;22054:2;22049:3;21990:67;:::i;:::-;21983:74;;22087:21;22083:1;22078:3;22074:11;22067:42;22135:2;22130:3;22126:12;22119:19;;21973:171;;;:::o;22150:108::-;22227:24;22245:5;22227:24;:::i;:::-;22222:3;22215:37;22205:53;;:::o;22264:118::-;22351:24;22369:5;22351:24;:::i;:::-;22346:3;22339:37;22329:53;;:::o;22388:112::-;22471:22;22487:5;22471:22;:::i;:::-;22466:3;22459:35;22449:51;;:::o;22506:256::-;;22633:75;22704:3;22695:6;22633:75;:::i;:::-;22733:2;22728:3;22724:12;22717:19;;22753:3;22746:10;;22622:140;;;;:::o;22768:589::-;;23015:95;23106:3;23097:6;23015:95;:::i;:::-;23008:102;;23127:95;23218:3;23209:6;23127:95;:::i;:::-;23120:102;;23239:92;23327:3;23318:6;23239:92;:::i;:::-;23232:99;;23348:3;23341:10;;22997:360;;;;;;:::o;23363:697::-;;23664:148;23808:3;23664:148;:::i;:::-;23657:155;;23829:95;23920:3;23911:6;23829:95;:::i;:::-;23822:102;;23941:93;24030:3;24021:6;23941:93;:::i;:::-;23934:100;;24051:3;24044:10;;23646:414;;;;;:::o;24066:379::-;;24272:147;24415:3;24272:147;:::i;:::-;24265:154;;24436:3;24429:10;;24254:191;;;:::o;24451:222::-;;24582:2;24571:9;24567:18;24559:26;;24595:71;24663:1;24652:9;24648:17;24639:6;24595:71;:::i;:::-;24549:124;;;;:::o;24679:640::-;;24912:3;24901:9;24897:19;24889:27;;24926:71;24994:1;24983:9;24979:17;24970:6;24926:71;:::i;:::-;25007:72;25075:2;25064:9;25060:18;25051:6;25007:72;:::i;:::-;25089;25157:2;25146:9;25142:18;25133:6;25089:72;:::i;:::-;25208:9;25202:4;25198:20;25193:2;25182:9;25178:18;25171:48;25236:76;25307:4;25298:6;25236:76;:::i;:::-;25228:84;;24879:440;;;;;;;:::o;25325:373::-;;25506:2;25495:9;25491:18;25483:26;;25555:9;25549:4;25545:20;25541:1;25530:9;25526:17;25519:47;25583:108;25686:4;25677:6;25583:108;:::i;:::-;25575:116;;25473:225;;;;:::o;25704:210::-;;25829:2;25818:9;25814:18;25806:26;;25842:65;25904:1;25893:9;25889:17;25880:6;25842:65;:::i;:::-;25796:118;;;;:::o;25920:222::-;;26051:2;26040:9;26036:18;26028:26;;26064:71;26132:1;26121:9;26117:17;26108:6;26064:71;:::i;:::-;26018:124;;;;:::o;26148:545::-;;26359:3;26348:9;26344:19;26336:27;;26373:71;26441:1;26430:9;26426:17;26417:6;26373:71;:::i;:::-;26454:68;26518:2;26507:9;26503:18;26494:6;26454:68;:::i;:::-;26532:72;26600:2;26589:9;26585:18;26576:6;26532:72;:::i;:::-;26614;26682:2;26671:9;26667:18;26658:6;26614:72;:::i;:::-;26326:367;;;;;;;:::o;26699:309::-;;26848:2;26837:9;26833:18;26825:26;;26897:9;26891:4;26887:20;26883:1;26872:9;26868:17;26861:47;26925:76;26996:4;26987:6;26925:76;:::i;:::-;26917:84;;26815:193;;;;:::o;27014:313::-;;27165:2;27154:9;27150:18;27142:26;;27214:9;27208:4;27204:20;27200:1;27189:9;27185:17;27178:47;27242:78;27315:4;27306:6;27242:78;:::i;:::-;27234:86;;27132:195;;;;:::o;27333:419::-;;27537:2;27526:9;27522:18;27514:26;;27586:9;27580:4;27576:20;27572:1;27561:9;27557:17;27550:47;27614:131;27740:4;27614:131;:::i;:::-;27606:139;;27504:248;;;:::o;27758:419::-;;27962:2;27951:9;27947:18;27939:26;;28011:9;28005:4;28001:20;27997:1;27986:9;27982:17;27975:47;28039:131;28165:4;28039:131;:::i;:::-;28031:139;;27929:248;;;:::o;28183:419::-;;28387:2;28376:9;28372:18;28364:26;;28436:9;28430:4;28426:20;28422:1;28411:9;28407:17;28400:47;28464:131;28590:4;28464:131;:::i;:::-;28456:139;;28354:248;;;:::o;28608:419::-;;28812:2;28801:9;28797:18;28789:26;;28861:9;28855:4;28851:20;28847:1;28836:9;28832:17;28825:47;28889:131;29015:4;28889:131;:::i;:::-;28881:139;;28779:248;;;:::o;29033:419::-;;29237:2;29226:9;29222:18;29214:26;;29286:9;29280:4;29276:20;29272:1;29261:9;29257:17;29250:47;29314:131;29440:4;29314:131;:::i;:::-;29306:139;;29204:248;;;:::o;29458:419::-;;29662:2;29651:9;29647:18;29639:26;;29711:9;29705:4;29701:20;29697:1;29686:9;29682:17;29675:47;29739:131;29865:4;29739:131;:::i;:::-;29731:139;;29629:248;;;:::o;29883:419::-;;30087:2;30076:9;30072:18;30064:26;;30136:9;30130:4;30126:20;30122:1;30111:9;30107:17;30100:47;30164:131;30290:4;30164:131;:::i;:::-;30156:139;;30054:248;;;:::o;30308:419::-;;30512:2;30501:9;30497:18;30489:26;;30561:9;30555:4;30551:20;30547:1;30536:9;30532:17;30525:47;30589:131;30715:4;30589:131;:::i;:::-;30581:139;;30479:248;;;:::o;30733:419::-;;30937:2;30926:9;30922:18;30914:26;;30986:9;30980:4;30976:20;30972:1;30961:9;30957:17;30950:47;31014:131;31140:4;31014:131;:::i;:::-;31006:139;;30904:248;;;:::o;31158:419::-;;31362:2;31351:9;31347:18;31339:26;;31411:9;31405:4;31401:20;31397:1;31386:9;31382:17;31375:47;31439:131;31565:4;31439:131;:::i;:::-;31431:139;;31329:248;;;:::o;31583:419::-;;31787:2;31776:9;31772:18;31764:26;;31836:9;31830:4;31826:20;31822:1;31811:9;31807:17;31800:47;31864:131;31990:4;31864:131;:::i;:::-;31856:139;;31754:248;;;:::o;32008:419::-;;32212:2;32201:9;32197:18;32189:26;;32261:9;32255:4;32251:20;32247:1;32236:9;32232:17;32225:47;32289:131;32415:4;32289:131;:::i;:::-;32281:139;;32179:248;;;:::o;32433:419::-;;32637:2;32626:9;32622:18;32614:26;;32686:9;32680:4;32676:20;32672:1;32661:9;32657:17;32650:47;32714:131;32840:4;32714:131;:::i;:::-;32706:139;;32604:248;;;:::o;32858:419::-;;33062:2;33051:9;33047:18;33039:26;;33111:9;33105:4;33101:20;33097:1;33086:9;33082:17;33075:47;33139:131;33265:4;33139:131;:::i;:::-;33131:139;;33029:248;;;:::o;33283:419::-;;33487:2;33476:9;33472:18;33464:26;;33536:9;33530:4;33526:20;33522:1;33511:9;33507:17;33500:47;33564:131;33690:4;33564:131;:::i;:::-;33556:139;;33454:248;;;:::o;33708:419::-;;33912:2;33901:9;33897:18;33889:26;;33961:9;33955:4;33951:20;33947:1;33936:9;33932:17;33925:47;33989:131;34115:4;33989:131;:::i;:::-;33981:139;;33879:248;;;:::o;34133:419::-;;34337:2;34326:9;34322:18;34314:26;;34386:9;34380:4;34376:20;34372:1;34361:9;34357:17;34350:47;34414:131;34540:4;34414:131;:::i;:::-;34406:139;;34304:248;;;:::o;34558:419::-;;34762:2;34751:9;34747:18;34739:26;;34811:9;34805:4;34801:20;34797:1;34786:9;34782:17;34775:47;34839:131;34965:4;34839:131;:::i;:::-;34831:139;;34729:248;;;:::o;34983:419::-;;35187:2;35176:9;35172:18;35164:26;;35236:9;35230:4;35226:20;35222:1;35211:9;35207:17;35200:47;35264:131;35390:4;35264:131;:::i;:::-;35256:139;;35154:248;;;:::o;35408:419::-;;35612:2;35601:9;35597:18;35589:26;;35661:9;35655:4;35651:20;35647:1;35636:9;35632:17;35625:47;35689:131;35815:4;35689:131;:::i;:::-;35681:139;;35579:248;;;:::o;35833:419::-;;36037:2;36026:9;36022:18;36014:26;;36086:9;36080:4;36076:20;36072:1;36061:9;36057:17;36050:47;36114:131;36240:4;36114:131;:::i;:::-;36106:139;;36004:248;;;:::o;36258:419::-;;36462:2;36451:9;36447:18;36439:26;;36511:9;36505:4;36501:20;36497:1;36486:9;36482:17;36475:47;36539:131;36665:4;36539:131;:::i;:::-;36531:139;;36429:248;;;:::o;36683:419::-;;36887:2;36876:9;36872:18;36864:26;;36936:9;36930:4;36926:20;36922:1;36911:9;36907:17;36900:47;36964:131;37090:4;36964:131;:::i;:::-;36956:139;;36854:248;;;:::o;37108:419::-;;37312:2;37301:9;37297:18;37289:26;;37361:9;37355:4;37351:20;37347:1;37336:9;37332:17;37325:47;37389:131;37515:4;37389:131;:::i;:::-;37381:139;;37279:248;;;:::o;37533:419::-;;37737:2;37726:9;37722:18;37714:26;;37786:9;37780:4;37776:20;37772:1;37761:9;37757:17;37750:47;37814:131;37940:4;37814:131;:::i;:::-;37806:139;;37704:248;;;:::o;37958:419::-;;38162:2;38151:9;38147:18;38139:26;;38211:9;38205:4;38201:20;38197:1;38186:9;38182:17;38175:47;38239:131;38365:4;38239:131;:::i;:::-;38231:139;;38129:248;;;:::o;38383:419::-;;38587:2;38576:9;38572:18;38564:26;;38636:9;38630:4;38626:20;38622:1;38611:9;38607:17;38600:47;38664:131;38790:4;38664:131;:::i;:::-;38656:139;;38554:248;;;:::o;38808:419::-;;39012:2;39001:9;38997:18;38989:26;;39061:9;39055:4;39051:20;39047:1;39036:9;39032:17;39025:47;39089:131;39215:4;39089:131;:::i;:::-;39081:139;;38979:248;;;:::o;39233:222::-;;39364:2;39353:9;39349:18;39341:26;;39377:71;39445:1;39434:9;39430:17;39421:6;39377:71;:::i;:::-;39331:124;;;;:::o;39461:283::-;;39527:2;39521:9;39511:19;;39569:4;39561:6;39557:17;39676:6;39664:10;39661:22;39640:18;39628:10;39625:34;39622:62;39619:2;;;39687:18;;:::i;:::-;39619:2;39727:10;39723:2;39716:22;39501:243;;;;:::o;39750:331::-;;39901:18;39893:6;39890:30;39887:2;;;39923:18;;:::i;:::-;39887:2;40008:4;40004:9;39997:4;39989:6;39985:17;39981:33;39973:41;;40069:4;40063;40059:15;40051:23;;39816:265;;;:::o;40087:332::-;;40239:18;40231:6;40228:30;40225:2;;;40261:18;;:::i;:::-;40225:2;40346:4;40342:9;40335:4;40327:6;40323:17;40319:33;40311:41;;40407:4;40401;40397:15;40389:23;;40154:265;;;:::o;40425:132::-;;40515:3;40507:11;;40545:4;40540:3;40536:14;40528:22;;40497:60;;;:::o;40563:141::-;;40635:3;40627:11;;40658:3;40655:1;40648:14;40692:4;40689:1;40679:18;40671:26;;40617:87;;;:::o;40710:114::-;;40811:5;40805:12;40795:22;;40784:40;;;:::o;40830:98::-;;40915:5;40909:12;40899:22;;40888:40;;;:::o;40934:99::-;;41020:5;41014:12;41004:22;;40993:40;;;:::o;41039:113::-;;41141:4;41136:3;41132:14;41124:22;;41114:38;;;:::o;41158:184::-;;41291:6;41286:3;41279:19;41331:4;41326:3;41322:14;41307:29;;41269:73;;;;:::o;41348:168::-;;41465:6;41460:3;41453:19;41505:4;41500:3;41496:14;41481:29;;41443:73;;;;:::o;41522:147::-;;41660:3;41645:18;;41635:34;;;;:::o;41675:169::-;;41793:6;41788:3;41781:19;41833:4;41828:3;41824:14;41809:29;;41771:73;;;;:::o;41850:148::-;;41989:3;41974:18;;41964:34;;;;:::o;42004:305::-;;42063:20;42081:1;42063:20;:::i;:::-;42058:25;;42097:20;42115:1;42097:20;:::i;:::-;42092:25;;42251:1;42183:66;42179:74;42176:1;42173:81;42170:2;;;42257:18;;:::i;:::-;42170:2;42301:1;42298;42294:9;42287:16;;42048:261;;;;:::o;42315:237::-;;42372:18;42388:1;42372:18;:::i;:::-;42367:23;;42404:18;42420:1;42404:18;:::i;:::-;42399:23;;42494:1;42488:4;42484:12;42481:1;42478:19;42475:2;;;42500:18;;:::i;:::-;42475:2;42544:1;42541;42537:9;42530:16;;42357:195;;;;:::o;42558:185::-;;42615:20;42633:1;42615:20;:::i;:::-;42610:25;;42649:20;42667:1;42649:20;:::i;:::-;42644:25;;42688:1;42678:2;;42693:18;;:::i;:::-;42678:2;42735:1;42732;42728:9;42723:14;;42600:143;;;;:::o;42749:179::-;;42804:18;42820:1;42804:18;:::i;:::-;42799:23;;42836:18;42852:1;42836:18;:::i;:::-;42831:23;;42873:1;42863:2;;42878:18;;:::i;:::-;42863:2;42920:1;42917;42913:9;42908:14;;42789:139;;;;:::o;42934:848::-;;;43026:6;43017:15;;43050:5;43041:14;;43064:712;43085:1;43075:8;43072:15;43064:712;;;43180:4;43175:3;43171:14;43165:4;43162:24;43159:2;;;43189:18;;:::i;:::-;43159:2;43239:1;43229:8;43225:16;43222:2;;;43654:4;43647:5;43643:16;43634:25;;43222:2;43704:4;43698;43694:15;43686:23;;43734:32;43757:8;43734:32;:::i;:::-;43722:44;;43064:712;;;43007:775;;;;;;;:::o;43788:285::-;;43872:23;43890:4;43872:23;:::i;:::-;43864:31;;43916:27;43934:8;43916:27;:::i;:::-;43904:39;;43962:104;43999:66;43989:8;43983:4;43962:104;:::i;:::-;43953:113;;43854:219;;;;:::o;44079:1073::-;;44324:8;44314:2;;44345:1;44336:10;;44347:5;;44314:2;44373:4;44363:2;;44390:1;44381:10;;44392:5;;44363:2;44459:4;44507:1;44502:27;;;;44543:1;44538:191;;;;44452:277;;44502:27;44520:1;44511:10;;44522:5;;;44538:191;44583:3;44573:8;44570:17;44567:2;;;44590:18;;:::i;:::-;44567:2;44639:8;44636:1;44632:16;44623:25;;44674:3;44667:5;44664:14;44661:2;;;44681:18;;:::i;:::-;44661:2;44714:5;;;44452:277;;44838:2;44828:8;44825:16;44819:3;44813:4;44810:13;44806:36;44788:2;44778:8;44775:16;44770:2;44764:4;44761:12;44757:35;44741:111;44738:2;;;44894:8;44888:4;44884:19;44875:28;;44929:3;44922:5;44919:14;44916:2;;;44936:18;;:::i;:::-;44916:2;44969:5;;44738:2;45009:42;45047:3;45037:8;45031:4;45028:1;45009:42;:::i;:::-;44994:57;;;;45083:4;45078:3;45074:14;45067:5;45064:25;45061:2;;;45092:18;;:::i;:::-;45061:2;45141:4;45134:5;45130:16;45121:25;;44139:1013;;;;;;:::o;45158:348::-;;45221:20;45239:1;45221:20;:::i;:::-;45216:25;;45255:20;45273:1;45255:20;:::i;:::-;45250:25;;45443:1;45375:66;45371:74;45368:1;45365:81;45360:1;45353:9;45346:17;45342:105;45339:2;;;45450:18;;:::i;:::-;45339:2;45498:1;45495;45491:9;45480:20;;45206:300;;;;:::o;45512:280::-;;45573:18;45589:1;45573:18;:::i;:::-;45568:23;;45605:18;45621:1;45605:18;:::i;:::-;45600:23;;45729:1;45723:4;45719:12;45716:1;45713:19;45708:1;45701:9;45694:17;45690:43;45687:2;;;45736:18;;:::i;:::-;45687:2;45784:1;45781;45777:9;45766:20;;45558:234;;;;:::o;45798:191::-;;45858:20;45876:1;45858:20;:::i;:::-;45853:25;;45892:20;45910:1;45892:20;:::i;:::-;45887:25;;45931:1;45928;45925:8;45922:2;;;45936:18;;:::i;:::-;45922:2;45981:1;45978;45974:9;45966:17;;45843:146;;;;:::o;45995:185::-;;46053:18;46069:1;46053:18;:::i;:::-;46048:23;;46085:18;46101:1;46085:18;:::i;:::-;46080:23;;46122:1;46119;46116:8;46113:2;;;46127:18;;:::i;:::-;46113:2;46172:1;46169;46165:9;46157:17;;46038:142;;;;:::o;46186:96::-;;46252:24;46270:5;46252:24;:::i;:::-;46241:35;;46231:51;;;:::o;46288:90::-;;46365:5;46358:13;46351:21;46340:32;;46330:48;;;:::o;46384:77::-;;46450:5;46439:16;;46429:32;;;:::o;46467:149::-;;46543:66;46536:5;46532:78;46521:89;;46511:105;;;:::o;46622:126::-;;46699:42;46692:5;46688:54;46677:65;;46667:81;;;:::o;46754:77::-;;46820:5;46809:16;;46799:32;;;:::o;46837:86::-;;46912:4;46905:5;46901:16;46890:27;;46880:43;;;:::o;46929:154::-;47013:6;47008:3;47003;46990:30;47075:1;47066:6;47061:3;47057:16;47050:27;46980:103;;;:::o;47089:307::-;47157:1;47167:113;47181:6;47178:1;47175:13;47167:113;;;47266:1;47261:3;47257:11;47251:18;47247:1;47242:3;47238:11;47231:39;47203:2;47200:1;47196:10;47191:15;;47167:113;;;47298:6;47295:1;47292:13;47289:2;;;47378:1;47369:6;47364:3;47360:16;47353:27;47289:2;47138:258;;;;:::o;47402:320::-;;47483:1;47477:4;47473:12;47463:22;;47530:1;47524:4;47520:12;47551:18;47541:2;;47607:4;47599:6;47595:17;47585:27;;47541:2;47669;47661:6;47658:14;47638:18;47635:38;47632:2;;;47688:18;;:::i;:::-;47632:2;47453:269;;;;:::o;47728:233::-;;47790:24;47808:5;47790:24;:::i;:::-;47781:33;;47836:66;47829:5;47826:77;47823:2;;;47906:18;;:::i;:::-;47823:2;47953:1;47946:5;47942:13;47935:20;;47771:190;;;:::o;47967:100::-;;48035:26;48055:5;48035:26;:::i;:::-;48024:37;;48014:53;;;:::o;48073:94::-;;48141:20;48155:5;48141:20;:::i;:::-;48130:31;;48120:47;;;:::o;48173:176::-;;48222:20;48240:1;48222:20;:::i;:::-;48217:25;;48256:20;48274:1;48256:20;:::i;:::-;48251:25;;48295:1;48285:2;;48300:18;;:::i;:::-;48285:2;48341:1;48338;48334:9;48329:14;;48207:142;;;;:::o;48355:180::-;48403:77;48400:1;48393:88;48500:4;48497:1;48490:15;48524:4;48521:1;48514:15;48541:180;48589:77;48586:1;48579:88;48686:4;48683:1;48676:15;48710:4;48707:1;48700:15;48727:180;48775:77;48772:1;48765:88;48872:4;48869:1;48862:15;48896:4;48893:1;48886:15;48913:180;48961:77;48958:1;48951:88;49058:4;49055:1;49048:15;49082:4;49079:1;49072:15;49099:102;;49191:2;49187:7;49182:2;49175:5;49171:14;49167:28;49157:38;;49147:54;;;:::o;49207:94::-;;49288:5;49284:2;49280:14;49259:35;;49249:52;;;:::o;49307:102::-;;49396:5;49393:1;49389:13;49368:34;;49358:51;;;:::o;49415:122::-;49488:24;49506:5;49488:24;:::i;:::-;49481:5;49478:35;49468:2;;49527:1;49524;49517:12;49468:2;49458:79;:::o;49543:116::-;49613:21;49628:5;49613:21;:::i;:::-;49606:5;49603:32;49593:2;;49649:1;49646;49639:12;49593:2;49583:76;:::o;49665:120::-;49737:23;49754:5;49737:23;:::i;:::-;49730:5;49727:34;49717:2;;49775:1;49772;49765:12;49717:2;49707:78;:::o;49791:122::-;49864:24;49882:5;49864:24;:::i;:::-;49857:5;49854:35;49844:2;;49903:1;49900;49893:12;49844:2;49834:79;:::o
Swarm Source
ipfs://a7a4bba48fbd991fdba1c96c93ad34d3964c76aea7ef54d3ff31a8d9e8306906
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.