Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
424 CKF
Holders
71
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 CKFLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
CryptoKungfu
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-07-08 */ // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // 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); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return 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 /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: 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 Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: ERC721A.sol // Creator: Chiru Labs pragma solidity ^0.8.4; error ApprovalCallerNotOwnerNorApproved(); error ApprovalQueryForNonexistentToken(); error ApproveToCaller(); error ApprovalToCurrentOwner(); error BalanceQueryForZeroAddress(); error MintedQueryForZeroAddress(); error BurnedQueryForZeroAddress(); error AuxQueryForZeroAddress(); error MintToZeroAddress(); error MintZeroQuantity(); error OwnerIndexOutOfBounds(); error OwnerQueryForNonexistentToken(); error TokenIndexOutOfBounds(); error TransferCallerNotOwnerNorApproved(); error TransferFromIncorrectOwner(); error TransferToNonERC721ReceiverImplementer(); error TransferToZeroAddress(); error URIQueryForNonexistentToken(); /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..). * * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Compiler will pack this into a single 256bit word. struct TokenOwnership { // The address of the owner. address addr; // Keeps track of the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; } // Compiler will pack this into a single 256bit word. struct AddressData { // Realistically, 2**64-1 is more than enough. uint64 balance; // Keeps track of mint count with minimal overhead for tokenomics. uint64 numberMinted; // Keeps track of burn count with minimal overhead for tokenomics. uint64 numberBurned; // For miscellaneous variable(s) pertaining to the address // (e.g. number of whitelist mint slots used). // If there are multiple variables, please pack them into a uint64. uint64 aux; } // The tokenId of the next token to be minted. uint256 internal _currentIndex; // The number of tokens burned. uint256 internal _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details. mapping(uint256 => TokenOwnership) internal _ownerships; // Mapping owner address to address data mapping(address => AddressData) private _addressData; // 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; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } /** * To change the starting tokenId, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev See {IERC721Enumerable-totalSupply}. * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens. */ function totalSupply() public view returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than _currentIndex - _startTokenId() times unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view returns (uint256) { // Counter underflow is impossible as _currentIndex does not decrement, // and it is initialized to _startTokenId() unchecked { return _currentIndex - _startTokenId(); } } /** * @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 override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return uint256(_addressData[owner].balance); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. * This read function is O(collectionSize). If calling from a separate contract, be sure to test gas first. * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case. */ function tokenOfOwnerByIndex(address owner) public view returns (uint[] memory){ uint tokenCount = balanceOf(owner); uint256 numMintedSoFar = totalSupply(); uint256 tokenIdsIdx = 0; address currOwnershipAddr = address(0); uint[] memory tokensId = new uint256[](tokenCount); for (uint256 i = 0; i < numMintedSoFar; i++) { TokenOwnership memory ownership = _ownerships[i]; if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { tokensId[tokenIdsIdx] = i; tokenIdsIdx++; } } // revert("ERC721A: unable to get token of owner by index"); return tokensId; } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { if (owner == address(0)) revert MintedQueryForZeroAddress(); return uint256(_addressData[owner].numberMinted); } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { if (owner == address(0)) revert BurnedQueryForZeroAddress(); return uint256(_addressData[owner].numberBurned); } /** * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { if (owner == address(0)) revert AuxQueryForZeroAddress(); return _addressData[owner].aux; } /** * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal { if (owner == address(0)) revert AuxQueryForZeroAddress(); _addressData[owner].aux = aux; } /** * Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around in the collection over time. */ function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr && curr < _currentIndex) { TokenOwnership memory ownership = _ownerships[curr]; if (!ownership.burned) { if (ownership.addr != address(0)) { return ownership; } // Invariant: // There will always be an ownership that has an address and is not burned // before an ownership that does not have an address and is not burned. // Hence, curr will not underflow. while (true) { curr--; ownership = _ownerships[curr]; if (ownership.addr != address(0)) { return ownership; } } } } } revert OwnerQueryForNonexistentToken(); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return ownershipOf(tokenId).addr; } /** * @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) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); 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 override { address owner = ERC721A.ownerOf(tokenId); if (to == owner) revert ApprovalToCurrentOwner(); if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) { revert ApprovalCallerNotOwnerNorApproved(); } _approve(to, tokenId, owner); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public override { if (operator == _msgSender()) revert ApproveToCaller(); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_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 { _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 { _transfer(from, to, tokenId); if (to.isContract() && !_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @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`), */ function _exists(uint256 tokenId) internal view returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && !_ownerships[tokenId].burned; } function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ''); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { _mint(to, quantity, _data, true); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _mint( address to, uint256 quantity, bytes memory _data, bool safe ) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { _addressData[to].balance += uint64(quantity); _addressData[to].numberMinted += uint64(quantity); _ownerships[startTokenId].addr = to; _ownerships[startTokenId].startTimestamp = uint64(block.timestamp); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; if (safe && to.isContract()) { do { emit Transfer(address(0), to, updatedIndex); if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (updatedIndex != end); // Reentrancy protection if (_currentIndex != startTokenId) revert(); } else { do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex != end); } _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Transfers `tokenId` from `from` to `to`. * * 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 ) private { TokenOwnership memory prevOwnership = ownershipOf(tokenId); bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr || isApprovedForAll(prevOwnership.addr, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); if (prevOwnership.addr != from) revert TransferFromIncorrectOwner(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, prevOwnership.addr); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { _addressData[from].balance -= 1; _addressData[to].balance += 1; _ownerships[tokenId].addr = to; _ownerships[tokenId].startTimestamp = uint64(block.timestamp); // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; if (_ownerships[nextTokenId].addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId < _currentIndex) { _ownerships[nextTokenId].addr = prevOwnership.addr; _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @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 { TokenOwnership memory prevOwnership = ownershipOf(tokenId); _beforeTokenTransfers(prevOwnership.addr, address(0), tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, prevOwnership.addr); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { _addressData[prevOwnership.addr].balance -= 1; _addressData[prevOwnership.addr].numberBurned += 1; // Keep track of who burned the token, and the timestamp of burning. _ownerships[tokenId].addr = prevOwnership.addr; _ownerships[tokenId].startTimestamp = uint64(block.timestamp); _ownerships[tokenId].burned = true; // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; if (_ownerships[nextTokenId].addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId < _currentIndex) { _ownerships[nextTokenId].addr = prevOwnership.addr; _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(prevOwnership.addr, address(0), tokenId); _afterTokenTransfers(prevOwnership.addr, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve( address to, uint256 tokenId, address owner ) private { _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target 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 _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * And also called before burning one token. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * 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, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes * minting. * And also called after one token has been burned. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} } // File: Contract.sol pragma solidity ^0.8.0; contract CryptoKungfu is ERC721A, Ownable { uint256 public immutable cost = 0.009 ether; uint32 public immutable maxMint = 10; uint32 public MAXSUPPLY = 5000; bool public started = true; mapping(address => bool) public freeClaimed; string public baseURI; constructor() ERC721A ("CryptoKungfu", "CKF") { _safeMint(msg.sender, 1); } function _baseURI() internal view override(ERC721A) returns (string memory) { return baseURI; } function _startTokenId() internal view virtual override(ERC721A) returns (uint256) { return 0; } function setBaseURI(string memory uri) public onlyOwner { baseURI = uri; } function mint(uint32 amount) public payable { require(tx.origin == msg.sender, "pls don't use contract call"); require(started,"not yet started"); require(totalSupply() + amount <= MAXSUPPLY,"sold out"); require(amount <= maxMint,"max 10 amount"); if(freeClaimed[msg.sender]) { require(msg.value >= amount * cost,"insufficient"); } else { freeClaimed[msg.sender] = true; require(msg.value >= (amount-1) * cost,"insufficient"); } _safeMint(msg.sender, amount); } function enableMint(bool mintStarted) external onlyOwner { started = mintStarted; } function getMintedFree(address addr) public view returns (bool){ return freeClaimed[addr]; } function setMaxSupply(uint32 max) external onlyOwner { MAXSUPPLY = max; } function withdraw() public onlyOwner { (bool success, ) = payable(msg.sender).call{ value: address(this).balance }(""); require(success, "failed"); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAXSUPPLY","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"mintStarted","type":"bool"}],"name":"enableMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"freeClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"getMintedFree","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"maxMint","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"amount","type":"uint32"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"max","type":"uint32"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"started","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"address","name":"owner","type":"address"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60c0604052661ff973cafa8000608090815250600a63ffffffff1660a09063ffffffff1660e01b815250611388600860146101000a81548163ffffffff021916908363ffffffff1602179055506001600860186101000a81548160ff0219169083151502179055503480156200007457600080fd5b506040518060400160405280600c81526020017f43727970746f4b756e67667500000000000000000000000000000000000000008152506040518060400160405280600381526020017f434b4600000000000000000000000000000000000000000000000000000000008152508160029080519060200190620000f992919062000814565b5080600390805190602001906200011292919062000814565b50620001236200016460201b60201c565b60008190555050506200014b6200013f6200016960201b60201c565b6200017160201b60201c565b6200015e3360016200023760201b60201c565b62000b15565b600090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002598282604051806020016040528060008152506200025d60201b60201c565b5050565b6200027283838360016200027760201b60201c565b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415620002e5576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084141562000321576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200033660008683876200067360201b60201c565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600085820190508380156200050e57506200050d8773ffffffffffffffffffffffffffffffffffffffff166200067960201b620017cd1760201c565b5b15620005e1575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46200058c60008884806001019550886200069c60201b60201c565b620005c3576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082141562000515578260005414620005db57600080fd5b6200064e565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821415620005e2575b8160008190555050506200066c60008683876200080e60201b60201c565b5050505050565b50505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02620006ca6200016960201b60201c565b8786866040518563ffffffff1660e01b8152600401620006ee949392919062000970565b602060405180830381600087803b1580156200070957600080fd5b505af19250505080156200073d57506040513d601f19601f820116820180604052508101906200073a9190620008db565b60015b620007bb573d806000811462000770576040519150601f19603f3d011682016040523d82523d6000602084013e62000775565b606091505b50600081511415620007b3576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b50505050565b828054620008229062000a80565b90600052602060002090601f01602090048101928262000846576000855562000892565b82601f106200086157805160ff191683800117855562000892565b8280016001018555821562000892579182015b828111156200089157825182559160200191906001019062000874565b5b509050620008a19190620008a5565b5090565b5b80821115620008c0576000816000905550600101620008a6565b5090565b600081519050620008d58162000afb565b92915050565b600060208284031215620008f457620008f362000ae5565b5b60006200090484828501620008c4565b91505092915050565b6200091881620009e0565b82525050565b60006200092b82620009c4565b620009378185620009cf565b93506200094981856020860162000a4a565b620009548162000aea565b840191505092915050565b6200096a8162000a40565b82525050565b60006080820190506200098760008301876200090d565b6200099660208301866200090d565b620009a560408301856200095f565b8181036060830152620009b981846200091e565b905095945050505050565b600081519050919050565b600082825260208201905092915050565b6000620009ed8262000a20565b9050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b8381101562000a6a57808201518184015260208101905062000a4d565b8381111562000a7a576000848401525b50505050565b6000600282049050600182168062000a9957607f821691505b6020821081141562000ab05762000aaf62000ab6565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600080fd5b6000601f19601f8301169050919050565b62000b0681620009f4565b811462000b1257600080fd5b50565b60805160a05160e01c613ab162000b5360003960008181610f870152611325015260008181610a88015281816113e601526114b70152613ab16000f3fe6080604052600436106101cd5760003560e01c80636c0360eb116100f7578063a22cb46511610095578063c87b56dd11610064578063c87b56dd14610669578063e985e9c5146106a6578063f2fde38b146106e3578063f9da32241461070c576101cd565b8063a22cb465146105d2578063a71bbebe146105fb578063b88d4fde14610617578063c68b330514610640576101cd565b80637501f741116100d15780637501f74114610526578063758b4e86146105515780638da5cb5b1461057c57806395d89b41146105a7576101cd565b80636c0360eb146104a757806370a08231146104d2578063715018a61461050f576101cd565b80631f2698ab1161016f57806355f804b31161013e57806355f804b3146103c757806361c0b6a0146103f0578063622837e01461042d5780636352211e1461046a576101cd565b80631f2698ab1461033357806323b872dd1461035e5780633ccfd60b1461038757806342842e0e1461039e576101cd565b8063095ea7b3116101ab578063095ea7b31461027757806309c81ed8146102a057806313faede6146102dd57806318160ddd14610308576101cd565b806301ffc9a7146101d257806306fdde031461020f578063081812fc1461023a575b600080fd5b3480156101de57600080fd5b506101f960048036038101906101f49190612dbc565b610735565b604051610206919061321a565b60405180910390f35b34801561021b57600080fd5b50610224610817565b6040516102319190613235565b60405180910390f35b34801561024657600080fd5b50610261600480360381019061025c9190612e5f565b6108a9565b60405161026e9190613191565b60405180910390f35b34801561028357600080fd5b5061029e60048036038101906102999190612d4f565b610925565b005b3480156102ac57600080fd5b506102c760048036038101906102c29190612bcc565b610a30565b6040516102d4919061321a565b60405180910390f35b3480156102e957600080fd5b506102f2610a86565b6040516102ff9190613357565b60405180910390f35b34801561031457600080fd5b5061031d610aaa565b60405161032a9190613357565b60405180910390f35b34801561033f57600080fd5b50610348610ac1565b604051610355919061321a565b60405180910390f35b34801561036a57600080fd5b5061038560048036038101906103809190612c39565b610ad4565b005b34801561039357600080fd5b5061039c610ae4565b005b3480156103aa57600080fd5b506103c560048036038101906103c09190612c39565b610b9b565b005b3480156103d357600080fd5b506103ee60048036038101906103e99190612e16565b610bbb565b005b3480156103fc57600080fd5b5061041760048036038101906104129190612bcc565b610bdd565b604051610424919061321a565b60405180910390f35b34801561043957600080fd5b50610454600480360381019061044f9190612bcc565b610bfd565b60405161046191906131f8565b60405180910390f35b34801561047657600080fd5b50610491600480360381019061048c9190612e5f565b610dfd565b60405161049e9190613191565b60405180910390f35b3480156104b357600080fd5b506104bc610e13565b6040516104c99190613235565b60405180910390f35b3480156104de57600080fd5b506104f960048036038101906104f49190612bcc565b610ea1565b6040516105069190613357565b60405180910390f35b34801561051b57600080fd5b50610524610f71565b005b34801561053257600080fd5b5061053b610f85565b6040516105489190613372565b60405180910390f35b34801561055d57600080fd5b50610566610fa9565b6040516105739190613372565b60405180910390f35b34801561058857600080fd5b50610591610fbf565b60405161059e9190613191565b60405180910390f35b3480156105b357600080fd5b506105bc610fe9565b6040516105c99190613235565b60405180910390f35b3480156105de57600080fd5b506105f960048036038101906105f49190612d0f565b61107b565b005b61061560048036038101906106109190612e8c565b6111f3565b005b34801561062357600080fd5b5061063e60048036038101906106399190612c8c565b611549565b005b34801561064c57600080fd5b5061066760048036038101906106629190612d8f565b6115c5565b005b34801561067557600080fd5b50610690600480360381019061068b9190612e5f565b6115ea565b60405161069d9190613235565b60405180910390f35b3480156106b257600080fd5b506106cd60048036038101906106c89190612bf9565b611689565b6040516106da919061321a565b60405180910390f35b3480156106ef57600080fd5b5061070a60048036038101906107059190612bcc565b61171d565b005b34801561071857600080fd5b50610733600480360381019061072e9190612e8c565b6117a1565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061080057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610810575061080f826117f0565b5b9050919050565b606060028054610826906136aa565b80601f0160208091040260200160405190810160405280929190818152602001828054610852906136aa565b801561089f5780601f106108745761010080835404028352916020019161089f565b820191906000526020600020905b81548152906001019060200180831161088257829003601f168201915b5050505050905090565b60006108b48261185a565b6108ea576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061093082610dfd565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610998576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109b76118a8565b73ffffffffffffffffffffffffffffffffffffffff16141580156109e957506109e7816109e26118a8565b611689565b155b15610a20576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610a2b8383836118b0565b505050565b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000610ab4611962565b6001546000540303905090565b600860189054906101000a900460ff1681565b610adf838383611967565b505050565b610aec611e58565b60003373ffffffffffffffffffffffffffffffffffffffff1647604051610b129061317c565b60006040518083038185875af1925050503d8060008114610b4f576040519150601f19603f3d011682016040523d82523d6000602084013e610b54565b606091505b5050905080610b98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8f906132d7565b60405180910390fd5b50565b610bb683838360405180602001604052806000815250611549565b505050565b610bc3611e58565b80600a9080519060200190610bd9929190612988565b5050565b60096020528060005260406000206000915054906101000a900460ff1681565b60606000610c0a83610ea1565b90506000610c16610aaa565b905060008060008467ffffffffffffffff811115610c3757610c36613843565b5b604051908082528060200260200182016040528015610c655781602001602082028036833780820191505090505b50905060005b84811015610def576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610d7857806000015193505b8873ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415610ddb5781838681518110610dc057610dbf613814565b5b6020026020010181815250508480610dd79061370d565b9550505b508080610de79061370d565b915050610c6b565b508095505050505050919050565b6000610e0882611ed6565b600001519050919050565b600a8054610e20906136aa565b80601f0160208091040260200160405190810160405280929190818152602001828054610e4c906136aa565b8015610e995780601f10610e6e57610100808354040283529160200191610e99565b820191906000526020600020905b815481529060010190602001808311610e7c57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f09576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b610f79611e58565b610f836000612165565b565b7f000000000000000000000000000000000000000000000000000000000000000081565b600860149054906101000a900463ffffffff1681565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610ff8906136aa565b80601f0160208091040260200160405190810160405280929190818152602001828054611024906136aa565b80156110715780601f1061104657610100808354040283529160200191611071565b820191906000526020600020905b81548152906001019060200180831161105457829003601f168201915b5050505050905090565b6110836118a8565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156110e8576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006110f56118a8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166111a26118a8565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516111e7919061321a565b60405180910390a35050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611261576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125890613297565b60405180910390fd5b600860189054906101000a900460ff166112b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a790613337565b60405180910390fd5b600860149054906101000a900463ffffffff1663ffffffff168163ffffffff166112d8610aaa565b6112e2919061349b565b1115611323576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131a906132b7565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000063ffffffff168163ffffffff161115611392576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138990613317565b60405180910390fd5b600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561145d577f00000000000000000000000000000000000000000000000000000000000000008163ffffffff166114169190613522565b341015611458576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144f90613257565b60405180910390fd5b611536565b6001600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507f00000000000000000000000000000000000000000000000000000000000000006001826114e391906135b0565b63ffffffff166114f39190613522565b341015611535576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152c90613257565b60405180910390fd5b5b611546338263ffffffff1661222b565b50565b611554848484611967565b6115738373ffffffffffffffffffffffffffffffffffffffff166117cd565b8015611588575061158684848484612249565b155b156115bf576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6115cd611e58565b80600860186101000a81548160ff02191690831515021790555050565b60606115f58261185a565b61162b576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006116356123a9565b90506000815114156116565760405180602001604052806000815250611681565b806116608461243b565b604051602001611671929190613158565b6040516020818303038152906040525b915050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611725611e58565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611795576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178c90613277565b60405180910390fd5b61179e81612165565b50565b6117a9611e58565b80600860146101000a81548163ffffffff021916908363ffffffff16021790555050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600081611865611962565b11158015611874575060005482105b80156118a1575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b600061197282611ed6565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff166119996118a8565b73ffffffffffffffffffffffffffffffffffffffff1614806119cc57506119cb82600001516119c66118a8565b611689565b5b80611a1157506119da6118a8565b73ffffffffffffffffffffffffffffffffffffffff166119f9846108a9565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611a4a576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611ab3576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611b1a576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b27858585600161259c565b611b3760008484600001516118b0565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611de857600054811015611de75782600001516004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611e5185858560016125a2565b5050505050565b611e606118a8565b73ffffffffffffffffffffffffffffffffffffffff16611e7e610fbf565b73ffffffffffffffffffffffffffffffffffffffff1614611ed4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ecb906132f7565b60405180910390fd5b565b611ede612a0e565b600082905080611eec611962565b11158015611efb575060005481105b1561212e576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161212c57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612010578092505050612160565b5b60011561212b57818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612126578092505050612160565b612011565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6122458282604051806020016040528060008152506125a8565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261226f6118a8565b8786866040518563ffffffff1660e01b815260040161229194939291906131ac565b602060405180830381600087803b1580156122ab57600080fd5b505af19250505080156122dc57506040513d601f19601f820116820180604052508101906122d99190612de9565b60015b612356573d806000811461230c576040519150601f19603f3d011682016040523d82523d6000602084013e612311565b606091505b5060008151141561234e576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600a80546123b8906136aa565b80601f01602080910402602001604051908101604052809291908181526020018280546123e4906136aa565b80156124315780601f1061240657610100808354040283529160200191612431565b820191906000526020600020905b81548152906001019060200180831161241457829003601f168201915b5050505050905090565b60606000821415612483576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612597565b600082905060005b600082146124b557808061249e9061370d565b915050600a826124ae91906134f1565b915061248b565b60008167ffffffffffffffff8111156124d1576124d0613843565b5b6040519080825280601f01601f1916602001820160405280156125035781602001600182028036833780820191505090505b5090505b600085146125905760018261251c919061357c565b9150600a8561252b9190613756565b6030612537919061349b565b60f81b81838151811061254d5761254c613814565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561258991906134f1565b9450612507565b8093505050505b919050565b50505050565b50505050565b6125b583838360016125ba565b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415612627576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415612662576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61266f600086838761259c565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060008190506000858201905083801561283957506128388773ffffffffffffffffffffffffffffffffffffffff166117cd565b5b156128ff575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46128ae6000888480600101955088612249565b6128e4576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082141561283f5782600054146128fa57600080fd5b61296b565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821415612900575b81600081905550505061298160008683876125a2565b5050505050565b828054612994906136aa565b90600052602060002090601f0160209004810192826129b657600085556129fd565b82601f106129cf57805160ff19168380011785556129fd565b828001600101855582156129fd579182015b828111156129fc5782518255916020019190600101906129e1565b5b509050612a0a9190612a51565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115612a6a576000816000905550600101612a52565b5090565b6000612a81612a7c846133b2565b61338d565b905082815260208101848484011115612a9d57612a9c613877565b5b612aa8848285613668565b509392505050565b6000612ac3612abe846133e3565b61338d565b905082815260208101848484011115612adf57612ade613877565b5b612aea848285613668565b509392505050565b600081359050612b0181613a08565b92915050565b600081359050612b1681613a1f565b92915050565b600081359050612b2b81613a36565b92915050565b600081519050612b4081613a36565b92915050565b600082601f830112612b5b57612b5a613872565b5b8135612b6b848260208601612a6e565b91505092915050565b600082601f830112612b8957612b88613872565b5b8135612b99848260208601612ab0565b91505092915050565b600081359050612bb181613a4d565b92915050565b600081359050612bc681613a64565b92915050565b600060208284031215612be257612be1613881565b5b6000612bf084828501612af2565b91505092915050565b60008060408385031215612c1057612c0f613881565b5b6000612c1e85828601612af2565b9250506020612c2f85828601612af2565b9150509250929050565b600080600060608486031215612c5257612c51613881565b5b6000612c6086828701612af2565b9350506020612c7186828701612af2565b9250506040612c8286828701612ba2565b9150509250925092565b60008060008060808587031215612ca657612ca5613881565b5b6000612cb487828801612af2565b9450506020612cc587828801612af2565b9350506040612cd687828801612ba2565b925050606085013567ffffffffffffffff811115612cf757612cf661387c565b5b612d0387828801612b46565b91505092959194509250565b60008060408385031215612d2657612d25613881565b5b6000612d3485828601612af2565b9250506020612d4585828601612b07565b9150509250929050565b60008060408385031215612d6657612d65613881565b5b6000612d7485828601612af2565b9250506020612d8585828601612ba2565b9150509250929050565b600060208284031215612da557612da4613881565b5b6000612db384828501612b07565b91505092915050565b600060208284031215612dd257612dd1613881565b5b6000612de084828501612b1c565b91505092915050565b600060208284031215612dff57612dfe613881565b5b6000612e0d84828501612b31565b91505092915050565b600060208284031215612e2c57612e2b613881565b5b600082013567ffffffffffffffff811115612e4a57612e4961387c565b5b612e5684828501612b74565b91505092915050565b600060208284031215612e7557612e74613881565b5b6000612e8384828501612ba2565b91505092915050565b600060208284031215612ea257612ea1613881565b5b6000612eb084828501612bb7565b91505092915050565b6000612ec5838361312b565b60208301905092915050565b612eda816135e4565b82525050565b6000612eeb82613424565b612ef58185613452565b9350612f0083613414565b8060005b83811015612f31578151612f188882612eb9565b9750612f2383613445565b925050600181019050612f04565b5085935050505092915050565b612f47816135f6565b82525050565b6000612f588261342f565b612f628185613463565b9350612f72818560208601613677565b612f7b81613886565b840191505092915050565b6000612f918261343a565b612f9b818561347f565b9350612fab818560208601613677565b612fb481613886565b840191505092915050565b6000612fca8261343a565b612fd48185613490565b9350612fe4818560208601613677565b80840191505092915050565b6000612ffd600c8361347f565b915061300882613897565b602082019050919050565b600061302060268361347f565b915061302b826138c0565b604082019050919050565b6000613043601b8361347f565b915061304e8261390f565b602082019050919050565b600061306660088361347f565b915061307182613938565b602082019050919050565b600061308960068361347f565b915061309482613961565b602082019050919050565b60006130ac60208361347f565b91506130b78261398a565b602082019050919050565b60006130cf600d8361347f565b91506130da826139b3565b602082019050919050565b60006130f2600083613474565b91506130fd826139dc565b600082019050919050565b6000613115600f8361347f565b9150613120826139df565b602082019050919050565b6131348161364e565b82525050565b6131438161364e565b82525050565b61315281613658565b82525050565b60006131648285612fbf565b91506131708284612fbf565b91508190509392505050565b6000613187826130e5565b9150819050919050565b60006020820190506131a66000830184612ed1565b92915050565b60006080820190506131c16000830187612ed1565b6131ce6020830186612ed1565b6131db604083018561313a565b81810360608301526131ed8184612f4d565b905095945050505050565b600060208201905081810360008301526132128184612ee0565b905092915050565b600060208201905061322f6000830184612f3e565b92915050565b6000602082019050818103600083015261324f8184612f86565b905092915050565b6000602082019050818103600083015261327081612ff0565b9050919050565b6000602082019050818103600083015261329081613013565b9050919050565b600060208201905081810360008301526132b081613036565b9050919050565b600060208201905081810360008301526132d081613059565b9050919050565b600060208201905081810360008301526132f08161307c565b9050919050565b600060208201905081810360008301526133108161309f565b9050919050565b60006020820190508181036000830152613330816130c2565b9050919050565b6000602082019050818103600083015261335081613108565b9050919050565b600060208201905061336c600083018461313a565b92915050565b60006020820190506133876000830184613149565b92915050565b60006133976133a8565b90506133a382826136dc565b919050565b6000604051905090565b600067ffffffffffffffff8211156133cd576133cc613843565b5b6133d682613886565b9050602081019050919050565b600067ffffffffffffffff8211156133fe576133fd613843565b5b61340782613886565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006134a68261364e565b91506134b18361364e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156134e6576134e5613787565b5b828201905092915050565b60006134fc8261364e565b91506135078361364e565b925082613517576135166137b6565b5b828204905092915050565b600061352d8261364e565b91506135388361364e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561357157613570613787565b5b828202905092915050565b60006135878261364e565b91506135928361364e565b9250828210156135a5576135a4613787565b5b828203905092915050565b60006135bb82613658565b91506135c683613658565b9250828210156135d9576135d8613787565b5b828203905092915050565b60006135ef8261362e565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b82818337600083830152505050565b60005b8381101561369557808201518184015260208101905061367a565b838111156136a4576000848401525b50505050565b600060028204905060018216806136c257607f821691505b602082108114156136d6576136d56137e5565b5b50919050565b6136e582613886565b810181811067ffffffffffffffff8211171561370457613703613843565b5b80604052505050565b60006137188261364e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561374b5761374a613787565b5b600182019050919050565b60006137618261364e565b915061376c8361364e565b92508261377c5761377b6137b6565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f696e73756666696369656e740000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f706c7320646f6e27742075736520636f6e74726163742063616c6c0000000000600082015250565b7f736f6c64206f7574000000000000000000000000000000000000000000000000600082015250565b7f6661696c65640000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f6d617820313020616d6f756e7400000000000000000000000000000000000000600082015250565b50565b7f6e6f742079657420737461727465640000000000000000000000000000000000600082015250565b613a11816135e4565b8114613a1c57600080fd5b50565b613a28816135f6565b8114613a3357600080fd5b50565b613a3f81613602565b8114613a4a57600080fd5b50565b613a568161364e565b8114613a6157600080fd5b50565b613a6d81613658565b8114613a7857600080fd5b5056fea264697066735822122083deac0b5cc274e11b83725a283b8a1a0f72d7ba0545a72812fd9ff43c1596e464736f6c63430008070033
Deployed Bytecode
0x6080604052600436106101cd5760003560e01c80636c0360eb116100f7578063a22cb46511610095578063c87b56dd11610064578063c87b56dd14610669578063e985e9c5146106a6578063f2fde38b146106e3578063f9da32241461070c576101cd565b8063a22cb465146105d2578063a71bbebe146105fb578063b88d4fde14610617578063c68b330514610640576101cd565b80637501f741116100d15780637501f74114610526578063758b4e86146105515780638da5cb5b1461057c57806395d89b41146105a7576101cd565b80636c0360eb146104a757806370a08231146104d2578063715018a61461050f576101cd565b80631f2698ab1161016f57806355f804b31161013e57806355f804b3146103c757806361c0b6a0146103f0578063622837e01461042d5780636352211e1461046a576101cd565b80631f2698ab1461033357806323b872dd1461035e5780633ccfd60b1461038757806342842e0e1461039e576101cd565b8063095ea7b3116101ab578063095ea7b31461027757806309c81ed8146102a057806313faede6146102dd57806318160ddd14610308576101cd565b806301ffc9a7146101d257806306fdde031461020f578063081812fc1461023a575b600080fd5b3480156101de57600080fd5b506101f960048036038101906101f49190612dbc565b610735565b604051610206919061321a565b60405180910390f35b34801561021b57600080fd5b50610224610817565b6040516102319190613235565b60405180910390f35b34801561024657600080fd5b50610261600480360381019061025c9190612e5f565b6108a9565b60405161026e9190613191565b60405180910390f35b34801561028357600080fd5b5061029e60048036038101906102999190612d4f565b610925565b005b3480156102ac57600080fd5b506102c760048036038101906102c29190612bcc565b610a30565b6040516102d4919061321a565b60405180910390f35b3480156102e957600080fd5b506102f2610a86565b6040516102ff9190613357565b60405180910390f35b34801561031457600080fd5b5061031d610aaa565b60405161032a9190613357565b60405180910390f35b34801561033f57600080fd5b50610348610ac1565b604051610355919061321a565b60405180910390f35b34801561036a57600080fd5b5061038560048036038101906103809190612c39565b610ad4565b005b34801561039357600080fd5b5061039c610ae4565b005b3480156103aa57600080fd5b506103c560048036038101906103c09190612c39565b610b9b565b005b3480156103d357600080fd5b506103ee60048036038101906103e99190612e16565b610bbb565b005b3480156103fc57600080fd5b5061041760048036038101906104129190612bcc565b610bdd565b604051610424919061321a565b60405180910390f35b34801561043957600080fd5b50610454600480360381019061044f9190612bcc565b610bfd565b60405161046191906131f8565b60405180910390f35b34801561047657600080fd5b50610491600480360381019061048c9190612e5f565b610dfd565b60405161049e9190613191565b60405180910390f35b3480156104b357600080fd5b506104bc610e13565b6040516104c99190613235565b60405180910390f35b3480156104de57600080fd5b506104f960048036038101906104f49190612bcc565b610ea1565b6040516105069190613357565b60405180910390f35b34801561051b57600080fd5b50610524610f71565b005b34801561053257600080fd5b5061053b610f85565b6040516105489190613372565b60405180910390f35b34801561055d57600080fd5b50610566610fa9565b6040516105739190613372565b60405180910390f35b34801561058857600080fd5b50610591610fbf565b60405161059e9190613191565b60405180910390f35b3480156105b357600080fd5b506105bc610fe9565b6040516105c99190613235565b60405180910390f35b3480156105de57600080fd5b506105f960048036038101906105f49190612d0f565b61107b565b005b61061560048036038101906106109190612e8c565b6111f3565b005b34801561062357600080fd5b5061063e60048036038101906106399190612c8c565b611549565b005b34801561064c57600080fd5b5061066760048036038101906106629190612d8f565b6115c5565b005b34801561067557600080fd5b50610690600480360381019061068b9190612e5f565b6115ea565b60405161069d9190613235565b60405180910390f35b3480156106b257600080fd5b506106cd60048036038101906106c89190612bf9565b611689565b6040516106da919061321a565b60405180910390f35b3480156106ef57600080fd5b5061070a60048036038101906107059190612bcc565b61171d565b005b34801561071857600080fd5b50610733600480360381019061072e9190612e8c565b6117a1565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061080057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610810575061080f826117f0565b5b9050919050565b606060028054610826906136aa565b80601f0160208091040260200160405190810160405280929190818152602001828054610852906136aa565b801561089f5780601f106108745761010080835404028352916020019161089f565b820191906000526020600020905b81548152906001019060200180831161088257829003601f168201915b5050505050905090565b60006108b48261185a565b6108ea576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061093082610dfd565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610998576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109b76118a8565b73ffffffffffffffffffffffffffffffffffffffff16141580156109e957506109e7816109e26118a8565b611689565b155b15610a20576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610a2b8383836118b0565b505050565b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b7f000000000000000000000000000000000000000000000000001ff973cafa800081565b6000610ab4611962565b6001546000540303905090565b600860189054906101000a900460ff1681565b610adf838383611967565b505050565b610aec611e58565b60003373ffffffffffffffffffffffffffffffffffffffff1647604051610b129061317c565b60006040518083038185875af1925050503d8060008114610b4f576040519150601f19603f3d011682016040523d82523d6000602084013e610b54565b606091505b5050905080610b98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8f906132d7565b60405180910390fd5b50565b610bb683838360405180602001604052806000815250611549565b505050565b610bc3611e58565b80600a9080519060200190610bd9929190612988565b5050565b60096020528060005260406000206000915054906101000a900460ff1681565b60606000610c0a83610ea1565b90506000610c16610aaa565b905060008060008467ffffffffffffffff811115610c3757610c36613843565b5b604051908082528060200260200182016040528015610c655781602001602082028036833780820191505090505b50905060005b84811015610def576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610d7857806000015193505b8873ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415610ddb5781838681518110610dc057610dbf613814565b5b6020026020010181815250508480610dd79061370d565b9550505b508080610de79061370d565b915050610c6b565b508095505050505050919050565b6000610e0882611ed6565b600001519050919050565b600a8054610e20906136aa565b80601f0160208091040260200160405190810160405280929190818152602001828054610e4c906136aa565b8015610e995780601f10610e6e57610100808354040283529160200191610e99565b820191906000526020600020905b815481529060010190602001808311610e7c57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f09576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b610f79611e58565b610f836000612165565b565b7f000000000000000000000000000000000000000000000000000000000000000a81565b600860149054906101000a900463ffffffff1681565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610ff8906136aa565b80601f0160208091040260200160405190810160405280929190818152602001828054611024906136aa565b80156110715780601f1061104657610100808354040283529160200191611071565b820191906000526020600020905b81548152906001019060200180831161105457829003601f168201915b5050505050905090565b6110836118a8565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156110e8576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006110f56118a8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166111a26118a8565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516111e7919061321a565b60405180910390a35050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611261576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125890613297565b60405180910390fd5b600860189054906101000a900460ff166112b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a790613337565b60405180910390fd5b600860149054906101000a900463ffffffff1663ffffffff168163ffffffff166112d8610aaa565b6112e2919061349b565b1115611323576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131a906132b7565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000a63ffffffff168163ffffffff161115611392576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138990613317565b60405180910390fd5b600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561145d577f000000000000000000000000000000000000000000000000001ff973cafa80008163ffffffff166114169190613522565b341015611458576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144f90613257565b60405180910390fd5b611536565b6001600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507f000000000000000000000000000000000000000000000000001ff973cafa80006001826114e391906135b0565b63ffffffff166114f39190613522565b341015611535576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152c90613257565b60405180910390fd5b5b611546338263ffffffff1661222b565b50565b611554848484611967565b6115738373ffffffffffffffffffffffffffffffffffffffff166117cd565b8015611588575061158684848484612249565b155b156115bf576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6115cd611e58565b80600860186101000a81548160ff02191690831515021790555050565b60606115f58261185a565b61162b576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006116356123a9565b90506000815114156116565760405180602001604052806000815250611681565b806116608461243b565b604051602001611671929190613158565b6040516020818303038152906040525b915050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611725611e58565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611795576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178c90613277565b60405180910390fd5b61179e81612165565b50565b6117a9611e58565b80600860146101000a81548163ffffffff021916908363ffffffff16021790555050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600081611865611962565b11158015611874575060005482105b80156118a1575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b600061197282611ed6565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff166119996118a8565b73ffffffffffffffffffffffffffffffffffffffff1614806119cc57506119cb82600001516119c66118a8565b611689565b5b80611a1157506119da6118a8565b73ffffffffffffffffffffffffffffffffffffffff166119f9846108a9565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611a4a576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611ab3576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611b1a576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b27858585600161259c565b611b3760008484600001516118b0565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611de857600054811015611de75782600001516004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611e5185858560016125a2565b5050505050565b611e606118a8565b73ffffffffffffffffffffffffffffffffffffffff16611e7e610fbf565b73ffffffffffffffffffffffffffffffffffffffff1614611ed4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ecb906132f7565b60405180910390fd5b565b611ede612a0e565b600082905080611eec611962565b11158015611efb575060005481105b1561212e576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161212c57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612010578092505050612160565b5b60011561212b57818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612126578092505050612160565b612011565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6122458282604051806020016040528060008152506125a8565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261226f6118a8565b8786866040518563ffffffff1660e01b815260040161229194939291906131ac565b602060405180830381600087803b1580156122ab57600080fd5b505af19250505080156122dc57506040513d601f19601f820116820180604052508101906122d99190612de9565b60015b612356573d806000811461230c576040519150601f19603f3d011682016040523d82523d6000602084013e612311565b606091505b5060008151141561234e576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600a80546123b8906136aa565b80601f01602080910402602001604051908101604052809291908181526020018280546123e4906136aa565b80156124315780601f1061240657610100808354040283529160200191612431565b820191906000526020600020905b81548152906001019060200180831161241457829003601f168201915b5050505050905090565b60606000821415612483576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612597565b600082905060005b600082146124b557808061249e9061370d565b915050600a826124ae91906134f1565b915061248b565b60008167ffffffffffffffff8111156124d1576124d0613843565b5b6040519080825280601f01601f1916602001820160405280156125035781602001600182028036833780820191505090505b5090505b600085146125905760018261251c919061357c565b9150600a8561252b9190613756565b6030612537919061349b565b60f81b81838151811061254d5761254c613814565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561258991906134f1565b9450612507565b8093505050505b919050565b50505050565b50505050565b6125b583838360016125ba565b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415612627576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415612662576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61266f600086838761259c565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060008190506000858201905083801561283957506128388773ffffffffffffffffffffffffffffffffffffffff166117cd565b5b156128ff575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46128ae6000888480600101955088612249565b6128e4576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082141561283f5782600054146128fa57600080fd5b61296b565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821415612900575b81600081905550505061298160008683876125a2565b5050505050565b828054612994906136aa565b90600052602060002090601f0160209004810192826129b657600085556129fd565b82601f106129cf57805160ff19168380011785556129fd565b828001600101855582156129fd579182015b828111156129fc5782518255916020019190600101906129e1565b5b509050612a0a9190612a51565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115612a6a576000816000905550600101612a52565b5090565b6000612a81612a7c846133b2565b61338d565b905082815260208101848484011115612a9d57612a9c613877565b5b612aa8848285613668565b509392505050565b6000612ac3612abe846133e3565b61338d565b905082815260208101848484011115612adf57612ade613877565b5b612aea848285613668565b509392505050565b600081359050612b0181613a08565b92915050565b600081359050612b1681613a1f565b92915050565b600081359050612b2b81613a36565b92915050565b600081519050612b4081613a36565b92915050565b600082601f830112612b5b57612b5a613872565b5b8135612b6b848260208601612a6e565b91505092915050565b600082601f830112612b8957612b88613872565b5b8135612b99848260208601612ab0565b91505092915050565b600081359050612bb181613a4d565b92915050565b600081359050612bc681613a64565b92915050565b600060208284031215612be257612be1613881565b5b6000612bf084828501612af2565b91505092915050565b60008060408385031215612c1057612c0f613881565b5b6000612c1e85828601612af2565b9250506020612c2f85828601612af2565b9150509250929050565b600080600060608486031215612c5257612c51613881565b5b6000612c6086828701612af2565b9350506020612c7186828701612af2565b9250506040612c8286828701612ba2565b9150509250925092565b60008060008060808587031215612ca657612ca5613881565b5b6000612cb487828801612af2565b9450506020612cc587828801612af2565b9350506040612cd687828801612ba2565b925050606085013567ffffffffffffffff811115612cf757612cf661387c565b5b612d0387828801612b46565b91505092959194509250565b60008060408385031215612d2657612d25613881565b5b6000612d3485828601612af2565b9250506020612d4585828601612b07565b9150509250929050565b60008060408385031215612d6657612d65613881565b5b6000612d7485828601612af2565b9250506020612d8585828601612ba2565b9150509250929050565b600060208284031215612da557612da4613881565b5b6000612db384828501612b07565b91505092915050565b600060208284031215612dd257612dd1613881565b5b6000612de084828501612b1c565b91505092915050565b600060208284031215612dff57612dfe613881565b5b6000612e0d84828501612b31565b91505092915050565b600060208284031215612e2c57612e2b613881565b5b600082013567ffffffffffffffff811115612e4a57612e4961387c565b5b612e5684828501612b74565b91505092915050565b600060208284031215612e7557612e74613881565b5b6000612e8384828501612ba2565b91505092915050565b600060208284031215612ea257612ea1613881565b5b6000612eb084828501612bb7565b91505092915050565b6000612ec5838361312b565b60208301905092915050565b612eda816135e4565b82525050565b6000612eeb82613424565b612ef58185613452565b9350612f0083613414565b8060005b83811015612f31578151612f188882612eb9565b9750612f2383613445565b925050600181019050612f04565b5085935050505092915050565b612f47816135f6565b82525050565b6000612f588261342f565b612f628185613463565b9350612f72818560208601613677565b612f7b81613886565b840191505092915050565b6000612f918261343a565b612f9b818561347f565b9350612fab818560208601613677565b612fb481613886565b840191505092915050565b6000612fca8261343a565b612fd48185613490565b9350612fe4818560208601613677565b80840191505092915050565b6000612ffd600c8361347f565b915061300882613897565b602082019050919050565b600061302060268361347f565b915061302b826138c0565b604082019050919050565b6000613043601b8361347f565b915061304e8261390f565b602082019050919050565b600061306660088361347f565b915061307182613938565b602082019050919050565b600061308960068361347f565b915061309482613961565b602082019050919050565b60006130ac60208361347f565b91506130b78261398a565b602082019050919050565b60006130cf600d8361347f565b91506130da826139b3565b602082019050919050565b60006130f2600083613474565b91506130fd826139dc565b600082019050919050565b6000613115600f8361347f565b9150613120826139df565b602082019050919050565b6131348161364e565b82525050565b6131438161364e565b82525050565b61315281613658565b82525050565b60006131648285612fbf565b91506131708284612fbf565b91508190509392505050565b6000613187826130e5565b9150819050919050565b60006020820190506131a66000830184612ed1565b92915050565b60006080820190506131c16000830187612ed1565b6131ce6020830186612ed1565b6131db604083018561313a565b81810360608301526131ed8184612f4d565b905095945050505050565b600060208201905081810360008301526132128184612ee0565b905092915050565b600060208201905061322f6000830184612f3e565b92915050565b6000602082019050818103600083015261324f8184612f86565b905092915050565b6000602082019050818103600083015261327081612ff0565b9050919050565b6000602082019050818103600083015261329081613013565b9050919050565b600060208201905081810360008301526132b081613036565b9050919050565b600060208201905081810360008301526132d081613059565b9050919050565b600060208201905081810360008301526132f08161307c565b9050919050565b600060208201905081810360008301526133108161309f565b9050919050565b60006020820190508181036000830152613330816130c2565b9050919050565b6000602082019050818103600083015261335081613108565b9050919050565b600060208201905061336c600083018461313a565b92915050565b60006020820190506133876000830184613149565b92915050565b60006133976133a8565b90506133a382826136dc565b919050565b6000604051905090565b600067ffffffffffffffff8211156133cd576133cc613843565b5b6133d682613886565b9050602081019050919050565b600067ffffffffffffffff8211156133fe576133fd613843565b5b61340782613886565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006134a68261364e565b91506134b18361364e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156134e6576134e5613787565b5b828201905092915050565b60006134fc8261364e565b91506135078361364e565b925082613517576135166137b6565b5b828204905092915050565b600061352d8261364e565b91506135388361364e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561357157613570613787565b5b828202905092915050565b60006135878261364e565b91506135928361364e565b9250828210156135a5576135a4613787565b5b828203905092915050565b60006135bb82613658565b91506135c683613658565b9250828210156135d9576135d8613787565b5b828203905092915050565b60006135ef8261362e565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b82818337600083830152505050565b60005b8381101561369557808201518184015260208101905061367a565b838111156136a4576000848401525b50505050565b600060028204905060018216806136c257607f821691505b602082108114156136d6576136d56137e5565b5b50919050565b6136e582613886565b810181811067ffffffffffffffff8211171561370457613703613843565b5b80604052505050565b60006137188261364e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561374b5761374a613787565b5b600182019050919050565b60006137618261364e565b915061376c8361364e565b92508261377c5761377b6137b6565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f696e73756666696369656e740000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f706c7320646f6e27742075736520636f6e74726163742063616c6c0000000000600082015250565b7f736f6c64206f7574000000000000000000000000000000000000000000000000600082015250565b7f6661696c65640000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f6d617820313020616d6f756e7400000000000000000000000000000000000000600082015250565b50565b7f6e6f742079657420737461727465640000000000000000000000000000000000600082015250565b613a11816135e4565b8114613a1c57600080fd5b50565b613a28816135f6565b8114613a3357600080fd5b50565b613a3f81613602565b8114613a4a57600080fd5b50565b613a568161364e565b8114613a6157600080fd5b50565b613a6d81613658565b8114613a7857600080fd5b5056fea264697066735822122083deac0b5cc274e11b83725a283b8a1a0f72d7ba0545a72812fd9ff43c1596e464736f6c63430008070033
Deployed Bytecode Sourcemap
47517:1848:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28882:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33377:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34880:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34443:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48959:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47566:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28131:303;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47696:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35737:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49168:194;;;;;;;;;;;;;:::i;:::-;;35978:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48147:88;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47729:43;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29760:807;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33186:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47779:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29251:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5273:103;;;;;;;;;;;;;:::i;:::-;;47616:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47659:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4625:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33546:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35156:279;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48243:605;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36234:369;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48856:95;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33721:318;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35506:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5531:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49073:87;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28882:305;28984:4;29036:25;29021:40;;;:11;:40;;;;:105;;;;29093:33;29078:48;;;:11;:48;;;;29021:105;:158;;;;29143:36;29167:11;29143:23;:36::i;:::-;29021:158;29001:178;;28882:305;;;:::o;33377:100::-;33431:13;33464:5;33457:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33377:100;:::o;34880:204::-;34948:7;34973:16;34981:7;34973;:16::i;:::-;34968:64;;34998:34;;;;;;;;;;;;;;34968:64;35052:15;:24;35068:7;35052:24;;;;;;;;;;;;;;;;;;;;;35045:31;;34880:204;;;:::o;34443:371::-;34516:13;34532:24;34548:7;34532:15;:24::i;:::-;34516:40;;34577:5;34571:11;;:2;:11;;;34567:48;;;34591:24;;;;;;;;;;;;;;34567:48;34648:5;34632:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;34658:37;34675:5;34682:12;:10;:12::i;:::-;34658:16;:37::i;:::-;34657:38;34632:63;34628:138;;;34719:35;;;;;;;;;;;;;;34628:138;34778:28;34787:2;34791:7;34800:5;34778:8;:28::i;:::-;34505:309;34443:371;;:::o;48959:106::-;49017:4;49040:11;:17;49052:4;49040:17;;;;;;;;;;;;;;;;;;;;;;;;;49033:24;;48959:106;;;:::o;47566:43::-;;;:::o;28131:303::-;28175:7;28400:15;:13;:15::i;:::-;28385:12;;28369:13;;:28;:46;28362:53;;28131:303;:::o;47696:26::-;;;;;;;;;;;;;:::o;35737:170::-;35871:28;35881:4;35887:2;35891:7;35871:9;:28::i;:::-;35737:170;;;:::o;49168:194::-;4511:13;:11;:13::i;:::-;49217:12:::1;49243:10;49235:24;;49281:21;49235:82;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49216:101;;;49336:7;49328:26;;;;;;;;;;;;:::i;:::-;;;;;;;;;49205:157;49168:194::o:0;35978:185::-;36116:39;36133:4;36139:2;36143:7;36116:39;;;;;;;;;;;;:16;:39::i;:::-;35978:185;;;:::o;48147:88::-;4511:13;:11;:13::i;:::-;48224:3:::1;48214:7;:13;;;;;;;;;;;;:::i;:::-;;48147:88:::0;:::o;47729:43::-;;;;;;;;;;;;;;;;;;;;;;:::o;29760:807::-;29825:13;29850:15;29868:16;29878:5;29868:9;:16::i;:::-;29850:34;;29896:22;29921:13;:11;:13::i;:::-;29896:38;;29945:19;29979:25;30028:22;30067:10;30053:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30028:50;;30094:9;30089:375;30113:14;30109:1;:18;30089:375;;;30149:31;30183:11;:14;30195:1;30183:14;;;;;;;;;;;30149:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30242:1;30216:28;;:9;:14;;;:28;;;30212:103;;30285:9;:14;;;30265:34;;30212:103;30354:5;30333:26;;:17;:26;;;30329:124;;;30404:1;30380:8;30389:11;30380:21;;;;;;;;:::i;:::-;;;;;;;:25;;;;;30424:13;;;;;:::i;:::-;;;;30329:124;30134:330;30129:3;;;;;:::i;:::-;;;;30089:375;;;;30551:8;30544:15;;;;;;;29760:807;;;:::o;33186:124::-;33250:7;33277:20;33289:7;33277:11;:20::i;:::-;:25;;;33270:32;;33186:124;;;:::o;47779:22::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;29251:206::-;29315:7;29356:1;29339:19;;:5;:19;;;29335:60;;;29367:28;;;;;;;;;;;;;;29335:60;29421:12;:19;29434:5;29421:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;29413:36;;29406:43;;29251:206;;;:::o;5273:103::-;4511:13;:11;:13::i;:::-;5338:30:::1;5365:1;5338:18;:30::i;:::-;5273:103::o:0;47616:36::-;;;:::o;47659:30::-;;;;;;;;;;;;;:::o;4625:87::-;4671:7;4698:6;;;;;;;;;;;4691:13;;4625:87;:::o;33546:104::-;33602:13;33635:7;33628:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33546:104;:::o;35156:279::-;35259:12;:10;:12::i;:::-;35247:24;;:8;:24;;;35243:54;;;35280:17;;;;;;;;;;;;;;35243:54;35355:8;35310:18;:32;35329:12;:10;:12::i;:::-;35310:32;;;;;;;;;;;;;;;:42;35343:8;35310:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;35408:8;35379:48;;35394:12;:10;:12::i;:::-;35379:48;;;35418:8;35379:48;;;;;;:::i;:::-;;;;;;;;35156:279;;:::o;48243:605::-;48319:10;48306:23;;:9;:23;;;48298:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;48380:7;;;;;;;;;;;48372:34;;;;;;;;;;;;:::i;:::-;;;;;;;;;48451:9;;;;;;;;;;;48425:35;;48441:6;48425:22;;:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:35;;48417:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;48501:7;48491:17;;:6;:17;;;;48483:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;48539:11;:23;48551:10;48539:23;;;;;;;;;;;;;;;;;;;;;;;;;48536:265;;;48618:4;48609:6;:13;;;;;;:::i;:::-;48596:9;:26;;48588:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;48536:265;;;48716:4;48690:11;:23;48702:10;48690:23;;;;;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;48769:4;48764:1;48757:6;:8;;;;:::i;:::-;48756:17;;;;;;:::i;:::-;48743:9;:30;;48735:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;48536:265;48811:29;48821:10;48833:6;48811:29;;:9;:29::i;:::-;48243:605;:::o;36234:369::-;36401:28;36411:4;36417:2;36421:7;36401:9;:28::i;:::-;36444:15;:2;:13;;;:15::i;:::-;:76;;;;;36464:56;36495:4;36501:2;36505:7;36514:5;36464:30;:56::i;:::-;36463:57;36444:76;36440:156;;;36544:40;;;;;;;;;;;;;;36440:156;36234:369;;;;:::o;48856:95::-;4511:13;:11;:13::i;:::-;48932:11:::1;48922:7;;:21;;;;;;;;;;;;;;;;;;48856:95:::0;:::o;33721:318::-;33794:13;33825:16;33833:7;33825;:16::i;:::-;33820:59;;33850:29;;;;;;;;;;;;;;33820:59;33892:21;33916:10;:8;:10::i;:::-;33892:34;;33969:1;33950:7;33944:21;:26;;:87;;;;;;;;;;;;;;;;;33997:7;34006:18;:7;:16;:18::i;:::-;33980:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;33944:87;33937:94;;;33721:318;;;:::o;35506:164::-;35603:4;35627:18;:25;35646:5;35627:25;;;;;;;;;;;;;;;:35;35653:8;35627:35;;;;;;;;;;;;;;;;;;;;;;;;;35620:42;;35506:164;;;;:::o;5531:201::-;4511:13;:11;:13::i;:::-;5640:1:::1;5620:22;;:8;:22;;;;5612:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;5696:28;5715:8;5696:18;:28::i;:::-;5531:201:::0;:::o;49073:87::-;4511:13;:11;:13::i;:::-;49149:3:::1;49137:9;;:15;;;;;;;;;;;;;;;;;;49073:87:::0;:::o;7323:326::-;7383:4;7640:1;7618:7;:19;;;:23;7611:30;;7323:326;;;:::o;17479:157::-;17564:4;17603:25;17588:40;;;:11;:40;;;;17581:47;;17479:157;;;:::o;36858:187::-;36915:4;36958:7;36939:15;:13;:15::i;:::-;:26;;:53;;;;;36979:13;;36969:7;:23;36939:53;:98;;;;;37010:11;:20;37022:7;37010:20;;;;;;;;;;;:27;;;;;;;;;;;;37009:28;36939:98;36932:105;;36858:187;;;:::o;3176:98::-;3229:7;3256:10;3249:17;;3176:98;:::o;44469:196::-;44611:2;44584:15;:24;44600:7;44584:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;44649:7;44645:2;44629:28;;44638:5;44629:28;;;;;;;;;;;;44469:196;;;:::o;48029:110::-;48103:7;48029:110;:::o;39971:2112::-;40086:35;40124:20;40136:7;40124:11;:20::i;:::-;40086:58;;40157:22;40199:13;:18;;;40183:34;;:12;:10;:12::i;:::-;:34;;;:101;;;;40234:50;40251:13;:18;;;40271:12;:10;:12::i;:::-;40234:16;:50::i;:::-;40183:101;:154;;;;40325:12;:10;:12::i;:::-;40301:36;;:20;40313:7;40301:11;:20::i;:::-;:36;;;40183:154;40157:181;;40356:17;40351:66;;40382:35;;;;;;;;;;;;;;40351:66;40454:4;40432:26;;:13;:18;;;:26;;;40428:67;;40467:28;;;;;;;;;;;;;;40428:67;40524:1;40510:16;;:2;:16;;;40506:52;;;40535:23;;;;;;;;;;;;;;40506:52;40571:43;40593:4;40599:2;40603:7;40612:1;40571:21;:43::i;:::-;40679:49;40696:1;40700:7;40709:13;:18;;;40679:8;:49::i;:::-;41054:1;41024:12;:18;41037:4;41024:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41098:1;41070:12;:16;41083:2;41070:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41144:2;41116:11;:20;41128:7;41116:20;;;;;;;;;;;:25;;;:30;;;;;;;;;;;;;;;;;;41206:15;41161:11;:20;41173:7;41161:20;;;;;;;;;;;:35;;;:61;;;;;;;;;;;;;;;;;;41474:19;41506:1;41496:7;:11;41474:33;;41567:1;41526:43;;:11;:24;41538:11;41526:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;41522:445;;;41751:13;;41737:11;:27;41733:219;;;41821:13;:18;;;41789:11;:24;41801:11;41789:24;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;41904:13;:28;;;41862:11;:24;41874:11;41862:24;;;;;;;;;;;:39;;;:70;;;;;;;;;;;;;;;;;;41733:219;41522:445;40999:979;42014:7;42010:2;41995:27;;42004:4;41995:27;;;;;;;;;;;;42033:42;42054:4;42060:2;42064:7;42073:1;42033:20;:42::i;:::-;40075:2008;;39971:2112;;;:::o;4790:132::-;4865:12;:10;:12::i;:::-;4854:23;;:7;:5;:7::i;:::-;:23;;;4846:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4790:132::o;32016:1108::-;32077:21;;:::i;:::-;32111:12;32126:7;32111:22;;32194:4;32175:15;:13;:15::i;:::-;:23;;:47;;;;;32209:13;;32202:4;:20;32175:47;32171:886;;;32243:31;32277:11;:17;32289:4;32277:17;;;;;;;;;;;32243:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32318:9;:16;;;32313:729;;32389:1;32363:28;;:9;:14;;;:28;;;32359:101;;32427:9;32420:16;;;;;;32359:101;32762:261;32769:4;32762:261;;;32802:6;;;;;;;;32847:11;:17;32859:4;32847:17;;;;;;;;;;;32835:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32921:1;32895:28;;:9;:14;;;:28;;;32891:109;;32963:9;32956:16;;;;;;32891:109;32762:261;;;32313:729;32224:833;32171:886;33085:31;;;;;;;;;;;;;;32016:1108;;;;:::o;5892:191::-;5966:16;5985:6;;;;;;;;;;;5966:25;;6011:8;6002:6;;:17;;;;;;;;;;;;;;;;;;6066:8;6035:40;;6056:8;6035:40;;;;;;;;;;;;5955:128;5892:191;:::o;37053:104::-;37122:27;37132:2;37136:8;37122:27;;;;;;;;;;;;:9;:27::i;:::-;37053:104;;:::o;45157:667::-;45320:4;45357:2;45341:36;;;45378:12;:10;:12::i;:::-;45392:4;45398:7;45407:5;45341:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;45337:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45592:1;45575:6;:13;:18;45571:235;;;45621:40;;;;;;;;;;;;;;45571:235;45764:6;45758:13;45749:6;45745:2;45741:15;45734:38;45337:480;45470:45;;;45460:55;;;:6;:55;;;;45453:62;;;45157:667;;;;;;:::o;47912:109::-;47973:13;48006:7;47999:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47912:109;:::o;430:723::-;486:13;716:1;707:5;:10;703:53;;;734:10;;;;;;;;;;;;;;;;;;;;;703:53;766:12;781:5;766:20;;797:14;822:78;837:1;829:4;:9;822:78;;855:8;;;;;:::i;:::-;;;;886:2;878:10;;;;;:::i;:::-;;;822:78;;;910:19;942:6;932:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;910:39;;960:154;976:1;967:5;:10;960:154;;1004:1;994:11;;;;;:::i;:::-;;;1071:2;1063:5;:10;;;;:::i;:::-;1050:2;:24;;;;:::i;:::-;1037:39;;1020:6;1027;1020:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1100:2;1091:11;;;;;:::i;:::-;;;960:154;;;1138:6;1124:21;;;;;430:723;;;;:::o;46472:159::-;;;;;:::o;47290:158::-;;;;;:::o;37520:163::-;37643:32;37649:2;37653:8;37663:5;37670:4;37643:5;:32::i;:::-;37520:163;;;:::o;37942:1775::-;38081:20;38104:13;;38081:36;;38146:1;38132:16;;:2;:16;;;38128:48;;;38157:19;;;;;;;;;;;;;;38128:48;38203:1;38191:8;:13;38187:44;;;38213:18;;;;;;;;;;;;;;38187:44;38244:61;38274:1;38278:2;38282:12;38296:8;38244:21;:61::i;:::-;38617:8;38582:12;:16;38595:2;38582:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38681:8;38641:12;:16;38654:2;38641:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38740:2;38707:11;:25;38719:12;38707:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;38807:15;38757:11;:25;38769:12;38757:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;38840:20;38863:12;38840:35;;38890:11;38919:8;38904:12;:23;38890:37;;38948:4;:23;;;;;38956:15;:2;:13;;;:15::i;:::-;38948:23;38944:641;;;38992:314;39048:12;39044:2;39023:38;;39040:1;39023:38;;;;;;;;;;;;39089:69;39128:1;39132:2;39136:14;;;;;;39152:5;39089:30;:69::i;:::-;39084:174;;39194:40;;;;;;;;;;;;;;39084:174;39301:3;39285:12;:19;;38992:314;;39387:12;39370:13;;:29;39366:43;;39401:8;;;39366:43;38944:641;;;39450:120;39506:14;;;;;;39502:2;39481:40;;39498:1;39481:40;;;;;;;;;;;;39565:3;39549:12;:19;;39450:120;;38944:641;39615:12;39599:13;:28;;;;38557:1082;;39649:60;39678:1;39682:2;39686:12;39700:8;39649:20;:60::i;:::-;38070:1647;37942:1775;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:122;;1899:79;;:::i;:::-;1858:122;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;1786:340;;;;:::o;2132:139::-;2178:5;2216:6;2203:20;2194:29;;2232:33;2259:5;2232:33;:::i;:::-;2132:139;;;;:::o;2277:137::-;2322:5;2360:6;2347:20;2338:29;;2376:32;2402:5;2376:32;:::i;:::-;2277:137;;;;:::o;2420:329::-;2479:6;2528:2;2516:9;2507:7;2503:23;2499:32;2496:119;;;2534:79;;:::i;:::-;2496:119;2654:1;2679:53;2724:7;2715:6;2704:9;2700:22;2679:53;:::i;:::-;2669:63;;2625:117;2420:329;;;;:::o;2755:474::-;2823:6;2831;2880:2;2868:9;2859:7;2855:23;2851:32;2848:119;;;2886:79;;:::i;:::-;2848:119;3006:1;3031:53;3076:7;3067:6;3056:9;3052:22;3031:53;:::i;:::-;3021:63;;2977:117;3133:2;3159:53;3204:7;3195:6;3184:9;3180:22;3159:53;:::i;:::-;3149:63;;3104:118;2755:474;;;;;:::o;3235:619::-;3312:6;3320;3328;3377:2;3365:9;3356:7;3352:23;3348:32;3345:119;;;3383:79;;:::i;:::-;3345:119;3503:1;3528:53;3573:7;3564:6;3553:9;3549:22;3528:53;:::i;:::-;3518:63;;3474:117;3630:2;3656:53;3701:7;3692:6;3681:9;3677:22;3656:53;:::i;:::-;3646:63;;3601:118;3758:2;3784:53;3829:7;3820:6;3809:9;3805:22;3784:53;:::i;:::-;3774:63;;3729:118;3235:619;;;;;:::o;3860:943::-;3955:6;3963;3971;3979;4028:3;4016:9;4007:7;4003:23;3999:33;3996:120;;;4035:79;;:::i;:::-;3996:120;4155:1;4180:53;4225:7;4216:6;4205:9;4201:22;4180:53;:::i;:::-;4170:63;;4126:117;4282:2;4308:53;4353:7;4344:6;4333:9;4329:22;4308:53;:::i;:::-;4298:63;;4253:118;4410:2;4436:53;4481:7;4472:6;4461:9;4457:22;4436:53;:::i;:::-;4426:63;;4381:118;4566:2;4555:9;4551:18;4538:32;4597:18;4589:6;4586:30;4583:117;;;4619:79;;:::i;:::-;4583:117;4724:62;4778:7;4769:6;4758:9;4754:22;4724:62;:::i;:::-;4714:72;;4509:287;3860:943;;;;;;;:::o;4809:468::-;4874:6;4882;4931:2;4919:9;4910:7;4906:23;4902:32;4899:119;;;4937:79;;:::i;:::-;4899:119;5057:1;5082:53;5127:7;5118:6;5107:9;5103:22;5082:53;:::i;:::-;5072:63;;5028:117;5184:2;5210:50;5252:7;5243:6;5232:9;5228:22;5210:50;:::i;:::-;5200:60;;5155:115;4809:468;;;;;:::o;5283:474::-;5351:6;5359;5408:2;5396:9;5387:7;5383:23;5379:32;5376:119;;;5414:79;;:::i;:::-;5376:119;5534:1;5559:53;5604:7;5595:6;5584:9;5580:22;5559:53;:::i;:::-;5549:63;;5505:117;5661:2;5687:53;5732:7;5723:6;5712:9;5708:22;5687:53;:::i;:::-;5677:63;;5632:118;5283:474;;;;;:::o;5763:323::-;5819:6;5868:2;5856:9;5847:7;5843:23;5839:32;5836:119;;;5874:79;;:::i;:::-;5836:119;5994:1;6019:50;6061:7;6052:6;6041:9;6037:22;6019:50;:::i;:::-;6009:60;;5965:114;5763:323;;;;:::o;6092:327::-;6150:6;6199:2;6187:9;6178:7;6174:23;6170:32;6167:119;;;6205:79;;:::i;:::-;6167:119;6325:1;6350:52;6394:7;6385:6;6374:9;6370:22;6350:52;:::i;:::-;6340:62;;6296:116;6092:327;;;;:::o;6425:349::-;6494:6;6543:2;6531:9;6522:7;6518:23;6514:32;6511:119;;;6549:79;;:::i;:::-;6511:119;6669:1;6694:63;6749:7;6740:6;6729:9;6725:22;6694:63;:::i;:::-;6684:73;;6640:127;6425:349;;;;:::o;6780:509::-;6849:6;6898:2;6886:9;6877:7;6873:23;6869:32;6866:119;;;6904:79;;:::i;:::-;6866:119;7052:1;7041:9;7037:17;7024:31;7082:18;7074:6;7071:30;7068:117;;;7104:79;;:::i;:::-;7068:117;7209:63;7264:7;7255:6;7244:9;7240:22;7209:63;:::i;:::-;7199:73;;6995:287;6780:509;;;;:::o;7295:329::-;7354:6;7403:2;7391:9;7382:7;7378:23;7374:32;7371:119;;;7409:79;;:::i;:::-;7371:119;7529:1;7554:53;7599:7;7590:6;7579:9;7575:22;7554:53;:::i;:::-;7544:63;;7500:117;7295:329;;;;:::o;7630:327::-;7688:6;7737:2;7725:9;7716:7;7712:23;7708:32;7705:119;;;7743:79;;:::i;:::-;7705:119;7863:1;7888:52;7932:7;7923:6;7912:9;7908:22;7888:52;:::i;:::-;7878:62;;7834:116;7630:327;;;;:::o;7963:179::-;8032:10;8053:46;8095:3;8087:6;8053:46;:::i;:::-;8131:4;8126:3;8122:14;8108:28;;7963:179;;;;:::o;8148:118::-;8235:24;8253:5;8235:24;:::i;:::-;8230:3;8223:37;8148:118;;:::o;8302:732::-;8421:3;8450:54;8498:5;8450:54;:::i;:::-;8520:86;8599:6;8594:3;8520:86;:::i;:::-;8513:93;;8630:56;8680:5;8630:56;:::i;:::-;8709:7;8740:1;8725:284;8750:6;8747:1;8744:13;8725:284;;;8826:6;8820:13;8853:63;8912:3;8897:13;8853:63;:::i;:::-;8846:70;;8939:60;8992:6;8939:60;:::i;:::-;8929:70;;8785:224;8772:1;8769;8765:9;8760:14;;8725:284;;;8729:14;9025:3;9018:10;;8426:608;;;8302:732;;;;:::o;9040:109::-;9121:21;9136:5;9121:21;:::i;:::-;9116:3;9109:34;9040:109;;:::o;9155:360::-;9241:3;9269:38;9301:5;9269:38;:::i;:::-;9323:70;9386:6;9381:3;9323:70;:::i;:::-;9316:77;;9402:52;9447:6;9442:3;9435:4;9428:5;9424:16;9402:52;:::i;:::-;9479:29;9501:6;9479:29;:::i;:::-;9474:3;9470:39;9463:46;;9245:270;9155:360;;;;:::o;9521:364::-;9609:3;9637:39;9670:5;9637:39;:::i;:::-;9692:71;9756:6;9751:3;9692:71;:::i;:::-;9685:78;;9772:52;9817:6;9812:3;9805:4;9798:5;9794:16;9772:52;:::i;:::-;9849:29;9871:6;9849:29;:::i;:::-;9844:3;9840:39;9833:46;;9613:272;9521:364;;;;:::o;9891:377::-;9997:3;10025:39;10058:5;10025:39;:::i;:::-;10080:89;10162:6;10157:3;10080:89;:::i;:::-;10073:96;;10178:52;10223:6;10218:3;10211:4;10204:5;10200:16;10178:52;:::i;:::-;10255:6;10250:3;10246:16;10239:23;;10001:267;9891:377;;;;:::o;10274:366::-;10416:3;10437:67;10501:2;10496:3;10437:67;:::i;:::-;10430:74;;10513:93;10602:3;10513:93;:::i;:::-;10631:2;10626:3;10622:12;10615:19;;10274:366;;;:::o;10646:::-;10788:3;10809:67;10873:2;10868:3;10809:67;:::i;:::-;10802:74;;10885:93;10974:3;10885:93;:::i;:::-;11003:2;10998:3;10994:12;10987:19;;10646:366;;;:::o;11018:::-;11160:3;11181:67;11245:2;11240:3;11181:67;:::i;:::-;11174:74;;11257:93;11346:3;11257:93;:::i;:::-;11375:2;11370:3;11366:12;11359:19;;11018:366;;;:::o;11390:365::-;11532:3;11553:66;11617:1;11612:3;11553:66;:::i;:::-;11546:73;;11628:93;11717:3;11628:93;:::i;:::-;11746:2;11741:3;11737:12;11730:19;;11390:365;;;:::o;11761:::-;11903:3;11924:66;11988:1;11983:3;11924:66;:::i;:::-;11917:73;;11999:93;12088:3;11999:93;:::i;:::-;12117:2;12112:3;12108:12;12101:19;;11761:365;;;:::o;12132:366::-;12274:3;12295:67;12359:2;12354:3;12295:67;:::i;:::-;12288:74;;12371:93;12460:3;12371:93;:::i;:::-;12489:2;12484:3;12480:12;12473:19;;12132:366;;;:::o;12504:::-;12646:3;12667:67;12731:2;12726:3;12667:67;:::i;:::-;12660:74;;12743:93;12832:3;12743:93;:::i;:::-;12861:2;12856:3;12852:12;12845:19;;12504:366;;;:::o;12876:398::-;13035:3;13056:83;13137:1;13132:3;13056:83;:::i;:::-;13049:90;;13148:93;13237:3;13148:93;:::i;:::-;13266:1;13261:3;13257:11;13250:18;;12876:398;;;:::o;13280:366::-;13422:3;13443:67;13507:2;13502:3;13443:67;:::i;:::-;13436:74;;13519:93;13608:3;13519:93;:::i;:::-;13637:2;13632:3;13628:12;13621:19;;13280:366;;;:::o;13652:108::-;13729:24;13747:5;13729:24;:::i;:::-;13724:3;13717:37;13652:108;;:::o;13766:118::-;13853:24;13871:5;13853:24;:::i;:::-;13848:3;13841:37;13766:118;;:::o;13890:115::-;13975:23;13992:5;13975:23;:::i;:::-;13970:3;13963:36;13890:115;;:::o;14011:435::-;14191:3;14213:95;14304:3;14295:6;14213:95;:::i;:::-;14206:102;;14325:95;14416:3;14407:6;14325:95;:::i;:::-;14318:102;;14437:3;14430:10;;14011:435;;;;;:::o;14452:379::-;14636:3;14658:147;14801:3;14658:147;:::i;:::-;14651:154;;14822:3;14815:10;;14452:379;;;:::o;14837:222::-;14930:4;14968:2;14957:9;14953:18;14945:26;;14981:71;15049:1;15038:9;15034:17;15025:6;14981:71;:::i;:::-;14837:222;;;;:::o;15065:640::-;15260:4;15298:3;15287:9;15283:19;15275:27;;15312:71;15380:1;15369:9;15365:17;15356:6;15312:71;:::i;:::-;15393:72;15461:2;15450:9;15446:18;15437:6;15393:72;:::i;:::-;15475;15543:2;15532:9;15528:18;15519:6;15475:72;:::i;:::-;15594:9;15588:4;15584:20;15579:2;15568:9;15564:18;15557:48;15622:76;15693:4;15684:6;15622:76;:::i;:::-;15614:84;;15065:640;;;;;;;:::o;15711:373::-;15854:4;15892:2;15881:9;15877:18;15869:26;;15941:9;15935:4;15931:20;15927:1;15916:9;15912:17;15905:47;15969:108;16072:4;16063:6;15969:108;:::i;:::-;15961:116;;15711:373;;;;:::o;16090:210::-;16177:4;16215:2;16204:9;16200:18;16192:26;;16228:65;16290:1;16279:9;16275:17;16266:6;16228:65;:::i;:::-;16090:210;;;;:::o;16306:313::-;16419:4;16457:2;16446:9;16442:18;16434:26;;16506:9;16500:4;16496:20;16492:1;16481:9;16477:17;16470:47;16534:78;16607:4;16598:6;16534:78;:::i;:::-;16526:86;;16306:313;;;;:::o;16625:419::-;16791:4;16829:2;16818:9;16814:18;16806:26;;16878:9;16872:4;16868:20;16864:1;16853:9;16849:17;16842:47;16906:131;17032:4;16906:131;:::i;:::-;16898:139;;16625:419;;;:::o;17050:::-;17216:4;17254:2;17243:9;17239:18;17231:26;;17303:9;17297:4;17293:20;17289:1;17278:9;17274:17;17267:47;17331:131;17457:4;17331:131;:::i;:::-;17323:139;;17050:419;;;:::o;17475:::-;17641:4;17679:2;17668:9;17664:18;17656:26;;17728:9;17722:4;17718:20;17714:1;17703:9;17699:17;17692:47;17756:131;17882:4;17756:131;:::i;:::-;17748:139;;17475:419;;;:::o;17900:::-;18066:4;18104:2;18093:9;18089:18;18081:26;;18153:9;18147:4;18143:20;18139:1;18128:9;18124:17;18117:47;18181:131;18307:4;18181:131;:::i;:::-;18173:139;;17900:419;;;:::o;18325:::-;18491:4;18529:2;18518:9;18514:18;18506:26;;18578:9;18572:4;18568:20;18564:1;18553:9;18549:17;18542:47;18606:131;18732:4;18606:131;:::i;:::-;18598:139;;18325:419;;;:::o;18750:::-;18916:4;18954:2;18943:9;18939:18;18931:26;;19003:9;18997:4;18993:20;18989:1;18978:9;18974:17;18967:47;19031:131;19157:4;19031:131;:::i;:::-;19023:139;;18750:419;;;:::o;19175:::-;19341:4;19379:2;19368:9;19364:18;19356:26;;19428:9;19422:4;19418:20;19414:1;19403:9;19399:17;19392:47;19456:131;19582:4;19456:131;:::i;:::-;19448:139;;19175:419;;;:::o;19600:::-;19766:4;19804:2;19793:9;19789:18;19781:26;;19853:9;19847:4;19843:20;19839:1;19828:9;19824:17;19817:47;19881:131;20007:4;19881:131;:::i;:::-;19873:139;;19600:419;;;:::o;20025:222::-;20118:4;20156:2;20145:9;20141:18;20133:26;;20169:71;20237:1;20226:9;20222:17;20213:6;20169:71;:::i;:::-;20025:222;;;;:::o;20253:218::-;20344:4;20382:2;20371:9;20367:18;20359:26;;20395:69;20461:1;20450:9;20446:17;20437:6;20395:69;:::i;:::-;20253:218;;;;:::o;20477:129::-;20511:6;20538:20;;:::i;:::-;20528:30;;20567:33;20595:4;20587:6;20567:33;:::i;:::-;20477:129;;;:::o;20612:75::-;20645:6;20678:2;20672:9;20662:19;;20612:75;:::o;20693:307::-;20754:4;20844:18;20836:6;20833:30;20830:56;;;20866:18;;:::i;:::-;20830:56;20904:29;20926:6;20904:29;:::i;:::-;20896:37;;20988:4;20982;20978:15;20970:23;;20693:307;;;:::o;21006:308::-;21068:4;21158:18;21150:6;21147:30;21144:56;;;21180:18;;:::i;:::-;21144:56;21218:29;21240:6;21218:29;:::i;:::-;21210:37;;21302:4;21296;21292:15;21284:23;;21006:308;;;:::o;21320:132::-;21387:4;21410:3;21402:11;;21440:4;21435:3;21431:14;21423:22;;21320:132;;;:::o;21458:114::-;21525:6;21559:5;21553:12;21543:22;;21458:114;;;:::o;21578:98::-;21629:6;21663:5;21657:12;21647:22;;21578:98;;;:::o;21682:99::-;21734:6;21768:5;21762:12;21752:22;;21682:99;;;:::o;21787:113::-;21857:4;21889;21884:3;21880:14;21872:22;;21787:113;;;:::o;21906:184::-;22005:11;22039:6;22034:3;22027:19;22079:4;22074:3;22070:14;22055:29;;21906:184;;;;:::o;22096:168::-;22179:11;22213:6;22208:3;22201:19;22253:4;22248:3;22244:14;22229:29;;22096:168;;;;:::o;22270:147::-;22371:11;22408:3;22393:18;;22270:147;;;;:::o;22423:169::-;22507:11;22541:6;22536:3;22529:19;22581:4;22576:3;22572:14;22557:29;;22423:169;;;;:::o;22598:148::-;22700:11;22737:3;22722:18;;22598:148;;;;:::o;22752:305::-;22792:3;22811:20;22829:1;22811:20;:::i;:::-;22806:25;;22845:20;22863:1;22845:20;:::i;:::-;22840:25;;22999:1;22931:66;22927:74;22924:1;22921:81;22918:107;;;23005:18;;:::i;:::-;22918:107;23049:1;23046;23042:9;23035:16;;22752:305;;;;:::o;23063:185::-;23103:1;23120:20;23138:1;23120:20;:::i;:::-;23115:25;;23154:20;23172:1;23154:20;:::i;:::-;23149:25;;23193:1;23183:35;;23198:18;;:::i;:::-;23183:35;23240:1;23237;23233:9;23228:14;;23063:185;;;;:::o;23254:348::-;23294:7;23317:20;23335:1;23317:20;:::i;:::-;23312:25;;23351:20;23369:1;23351:20;:::i;:::-;23346:25;;23539:1;23471:66;23467:74;23464:1;23461:81;23456:1;23449:9;23442:17;23438:105;23435:131;;;23546:18;;:::i;:::-;23435:131;23594:1;23591;23587:9;23576:20;;23254:348;;;;:::o;23608:191::-;23648:4;23668:20;23686:1;23668:20;:::i;:::-;23663:25;;23702:20;23720:1;23702:20;:::i;:::-;23697:25;;23741:1;23738;23735:8;23732:34;;;23746:18;;:::i;:::-;23732:34;23791:1;23788;23784:9;23776:17;;23608:191;;;;:::o;23805:188::-;23844:4;23864:19;23881:1;23864:19;:::i;:::-;23859:24;;23897:19;23914:1;23897:19;:::i;:::-;23892:24;;23935:1;23932;23929:8;23926:34;;;23940:18;;:::i;:::-;23926:34;23985:1;23982;23978:9;23970:17;;23805:188;;;;:::o;23999:96::-;24036:7;24065:24;24083:5;24065:24;:::i;:::-;24054:35;;23999:96;;;:::o;24101:90::-;24135:7;24178:5;24171:13;24164:21;24153:32;;24101:90;;;:::o;24197:149::-;24233:7;24273:66;24266:5;24262:78;24251:89;;24197:149;;;:::o;24352:126::-;24389:7;24429:42;24422:5;24418:54;24407:65;;24352:126;;;:::o;24484:77::-;24521:7;24550:5;24539:16;;24484:77;;;:::o;24567:93::-;24603:7;24643:10;24636:5;24632:22;24621:33;;24567:93;;;:::o;24666:154::-;24750:6;24745:3;24740;24727:30;24812:1;24803:6;24798:3;24794:16;24787:27;24666:154;;;:::o;24826:307::-;24894:1;24904:113;24918:6;24915:1;24912:13;24904:113;;;25003:1;24998:3;24994:11;24988:18;24984:1;24979:3;24975:11;24968:39;24940:2;24937:1;24933:10;24928:15;;24904:113;;;25035:6;25032:1;25029:13;25026:101;;;25115:1;25106:6;25101:3;25097:16;25090:27;25026:101;24875:258;24826:307;;;:::o;25139:320::-;25183:6;25220:1;25214:4;25210:12;25200:22;;25267:1;25261:4;25257:12;25288:18;25278:81;;25344:4;25336:6;25332:17;25322:27;;25278:81;25406:2;25398:6;25395:14;25375:18;25372:38;25369:84;;;25425:18;;:::i;:::-;25369:84;25190:269;25139:320;;;:::o;25465:281::-;25548:27;25570:4;25548:27;:::i;:::-;25540:6;25536:40;25678:6;25666:10;25663:22;25642:18;25630:10;25627:34;25624:62;25621:88;;;25689:18;;:::i;:::-;25621:88;25729:10;25725:2;25718:22;25508:238;25465:281;;:::o;25752:233::-;25791:3;25814:24;25832:5;25814:24;:::i;:::-;25805:33;;25860:66;25853:5;25850:77;25847:103;;;25930:18;;:::i;:::-;25847:103;25977:1;25970:5;25966:13;25959:20;;25752:233;;;:::o;25991:176::-;26023:1;26040:20;26058:1;26040:20;:::i;:::-;26035:25;;26074:20;26092:1;26074:20;:::i;:::-;26069:25;;26113:1;26103:35;;26118:18;;:::i;:::-;26103:35;26159:1;26156;26152:9;26147:14;;25991:176;;;;:::o;26173:180::-;26221:77;26218:1;26211:88;26318:4;26315:1;26308:15;26342:4;26339:1;26332:15;26359:180;26407:77;26404:1;26397:88;26504:4;26501:1;26494:15;26528:4;26525:1;26518:15;26545:180;26593:77;26590:1;26583:88;26690:4;26687:1;26680:15;26714:4;26711:1;26704:15;26731:180;26779:77;26776:1;26769:88;26876:4;26873:1;26866:15;26900:4;26897:1;26890:15;26917:180;26965:77;26962:1;26955:88;27062:4;27059:1;27052:15;27086:4;27083:1;27076:15;27103:117;27212:1;27209;27202:12;27226:117;27335:1;27332;27325:12;27349:117;27458:1;27455;27448:12;27472:117;27581:1;27578;27571:12;27595:102;27636:6;27687:2;27683:7;27678:2;27671:5;27667:14;27663:28;27653:38;;27595:102;;;:::o;27703:162::-;27843:14;27839:1;27831:6;27827:14;27820:38;27703:162;:::o;27871:225::-;28011:34;28007:1;27999:6;27995:14;27988:58;28080:8;28075:2;28067:6;28063:15;28056:33;27871:225;:::o;28102:177::-;28242:29;28238:1;28230:6;28226:14;28219:53;28102:177;:::o;28285:158::-;28425:10;28421:1;28413:6;28409:14;28402:34;28285:158;:::o;28449:156::-;28589:8;28585:1;28577:6;28573:14;28566:32;28449:156;:::o;28611:182::-;28751:34;28747:1;28739:6;28735:14;28728:58;28611:182;:::o;28799:163::-;28939:15;28935:1;28927:6;28923:14;28916:39;28799:163;:::o;28968:114::-;;:::o;29088:165::-;29228:17;29224:1;29216:6;29212:14;29205:41;29088:165;:::o;29259:122::-;29332:24;29350:5;29332:24;:::i;:::-;29325:5;29322:35;29312:63;;29371:1;29368;29361:12;29312:63;29259:122;:::o;29387:116::-;29457:21;29472:5;29457:21;:::i;:::-;29450:5;29447:32;29437:60;;29493:1;29490;29483:12;29437:60;29387:116;:::o;29509:120::-;29581:23;29598:5;29581:23;:::i;:::-;29574:5;29571:34;29561:62;;29619:1;29616;29609:12;29561:62;29509:120;:::o;29635:122::-;29708:24;29726:5;29708:24;:::i;:::-;29701:5;29698:35;29688:63;;29747:1;29744;29737:12;29688:63;29635:122;:::o;29763:120::-;29835:23;29852:5;29835:23;:::i;:::-;29828:5;29825:34;29815:62;;29873:1;29870;29863:12;29815:62;29763:120;:::o
Swarm Source
ipfs://83deac0b5cc274e11b83725a283b8a1a0f72d7ba0545a72812fd9ff43c1596e4
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.