ERC-721
Overview
Max Total Supply
633 KryptoPetNFT
Holders
141
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
9 KryptoPetNFTLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
KryptoPetNFT
Compiler Version
v0.8.10+commit.fc410830
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-02-21 */ // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts v4.4.1 (utils/Address.sol) pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/utils/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/utils/Strings.sol // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/utils/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/ERC721.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol // OpenZeppelin Contracts v4.4.1 (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 tokenId); /** * @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/ERC721Enumerable.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } // File: @openzeppelin/contracts/utils/Counters.sol // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/math/SafeMath.sol // OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } // File: contracts/KryptoPetNFT.sol //SPDX-License-Identifier: MIT pragma solidity ^0.8.10; interface IERC20 { /** * @dev Returns the decimals. */ function decimals() external view returns (uint256); /** * @dev Returns the totalSupply */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } /* function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); }*/ /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } interface IUniswapV2Pair { function factory() external view returns (address); function token0() external view returns (address); function token1() external view returns (address); function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast); } contract KryptoPetNFT is ERC721Enumerable, Ownable{ using SafeMath for uint256; using Counters for Counters.Counter; using SafeERC20 for IERC20; modifier onlyClevel() { require(msg.sender == walletA || msg.sender == owner()); _; } Counters.Counter private _tokenIds; address walletA; uint256 public phaseEndsAt = 10000; uint256 public mintPriceEth = 0.015 ether; uint256 public updatePriceEth = 0.005 ether; uint256 public hatchPriceEth = 0.020 ether; uint256 public trainPriceEth = 0.010 ether; uint256 public revivePriceEth = 0.030 ether; uint256 public feedPriceEth = 0.005 ether; IERC20 public kryptoPetTokenContract; string private _baseTokenURI; event minting(uint256 id, address indexed customer); constructor(address _walletA, address _kryptoPetTokenContract) ERC721("KryptoPetNFT", "KryptoPetNFT") { _baseTokenURI = "http://157.245.247.146/pets/"; walletA = _walletA; kryptoPetTokenContract = IERC20(_kryptoPetTokenContract); } function _baseURI() internal view virtual override returns (string memory) { return _baseTokenURI; } function tokensOfOwner(address _owner) external view returns(uint256[] memory ) { uint256 tokenCount = balanceOf(_owner); if (tokenCount == 0) { // Return an empty array return new uint256[](0); } else { uint256[] memory result = new uint256[](tokenCount); uint256 index; for (index = 0; index < tokenCount; index++) { result[index] = tokenOfOwnerByIndex(_owner, index); } return result; } } function airdrop_nft(uint256 _amount, address _destination) public payable returns (uint256[] memory minted) { require(_tokenIds.current() < phaseEndsAt, "Minting Phase Ended"); require(_amount>0, "NFT: Invalid amount to mint."); require(msg.sender == owner(), "Who are you?"); // require(msg.value==_amount*mintPriceEth , "NFT: Invalid value."); uint256[] memory tokensMinted; for (uint256 i = 0; i < _amount; i++) { _tokenIds.increment(); uint256 newPack = _tokenIds.current(); _mint(_destination, newPack); emit minting(newPack, _destination); } return tokensMinted; } function mint_nft_for_eth(uint256 _amount) public payable returns (uint256[] memory minted) { require(_tokenIds.current() < phaseEndsAt, "Minting Phase Ended"); require(_amount>0, "NFT: Invalid amount to mint."); require(msg.value==_amount*mintPriceEth , "NFT: Invalid value."); uint256[] memory tokensMinted; for (uint256 i = 0; i < _amount; i++) { _tokenIds.increment(); uint256 newPack = _tokenIds.current(); _mint(msg.sender, newPack); emit minting(newPack, msg.sender); } return tokensMinted; } function getTokensForEth(uint _amountETH) public view returns(uint256){ IUniswapV2Pair pair = IUniswapV2Pair(0xC525C83168EF7B9D75dAa09581da5A8848Bc3a15); IERC20 token0 = IERC20(pair.token0()); (uint Res0, uint Res1,) = pair.getReserves(); // decimals uint res1 = Res1*(10**token0.decimals()); uint ethPrice = ((10e18*res1)/Res0); // return amount of ETH needed to buy KPET uint amountTokens = (_amountETH*10e18)/ethPrice; return amountTokens; } function mint_nft_for_kpet(uint256 _amount) public payable returns (uint256[] memory minted) { require(_tokenIds.current() < phaseEndsAt, "Minting Phase Ended"); require(_amount>0, "NFT: Invalid amount to mint."); uint256 numTokensNeeded= getTokensForEth(_amount*mintPriceEth); // uint256 numTokensNeeded= 10; require(kryptoPetTokenContract.balanceOf(msg.sender)>=numTokensNeeded, "Insufficient token balance."); kryptoPetTokenContract.transferFrom(msg.sender, address(this) , numTokensNeeded); uint256[] memory tokensMinted; for (uint256 i = 0; i < _amount; i++) { _tokenIds.increment(); uint256 newPack = _tokenIds.current(); _mint(msg.sender, newPack); emit minting(newPack, msg.sender); } return tokensMinted; } function update_nft_for_eth(uint256 _nftId) public payable returns(uint256){ uint256 tokenCount = balanceOf(msg.sender); require(tokenCount > 0, "No NFT for this address"); require(ownerOf(_nftId) == msg.sender, "Not the owner of this NFT"); return _nftId; } function update_nft_for_kpet(uint256 _nftId, uint256 _amount) public payable returns(uint256){ uint256 tokenCount = balanceOf(msg.sender); // require(msg.value== _amount , "NFT: Invalid value."); require(tokenCount > 0, "No NFT for this address"); require(ownerOf(_nftId) == msg.sender, "Not the owner of this NFT"); uint256 numTokensNeeded= getTokensForEth(_amount); require(kryptoPetTokenContract.balanceOf(msg.sender)>=numTokensNeeded, "Insufficient token balance."); kryptoPetTokenContract.transferFrom(msg.sender, address(this) , numTokensNeeded); return _nftId; } function revive_nft_for_eth(uint256 _nftId) public payable returns(uint256){ require(msg.value== revivePriceEth , "NFT: Invalid value."); return update_nft_for_eth(_nftId); } function revive_nft_for_kpet(uint256 _nftId) public payable returns(uint256){ return update_nft_for_kpet(_nftId, revivePriceEth); } function feed_nft_for_eth(uint256 _nftId) public payable returns(uint256){ require(msg.value== feedPriceEth , "NFT: Invalid value."); return update_nft_for_eth(_nftId); } function feed_nft_for_kpet(uint256 _nftId) public payable returns(uint256){ return update_nft_for_kpet(_nftId, feedPriceEth); } function train_nft_for_eth(uint256 _nftId) public payable returns(uint256){ require(msg.value== trainPriceEth , "NFT: Invalid value."); return update_nft_for_eth(_nftId); } function train_nft_for_kpet(uint256 _nftId) public payable returns(uint256){ return update_nft_for_kpet(_nftId, trainPriceEth); } function hatch_nft_for_eth(uint256 _nftId) public payable returns(uint256){ require(msg.value== hatchPriceEth , "NFT: Invalid value."); return update_nft_for_eth(_nftId); } function hatch_nft_for_kpet(uint256 _nftId) public payable returns(uint256){ return update_nft_for_kpet(_nftId, hatchPriceEth); } function setEthMintPrice(uint256 _priceEth) public onlyOwner { mintPriceEth =_priceEth; } function setEthUpdatePrice(uint256 _priceEth) public onlyOwner { updatePriceEth =_priceEth; } function setEthHatchPrice(uint256 _priceEth) public onlyOwner { hatchPriceEth =_priceEth; } function setEthFeedPrice(uint256 _priceEth) public onlyOwner { feedPriceEth =_priceEth; } function setEthRevivePrice(uint256 _priceEth) public onlyOwner { revivePriceEth =_priceEth; } function setEthTrainPrice(uint256 _priceEth) public onlyOwner { trainPriceEth =_priceEth; } function withdraw_all() public onlyClevel { if(address(this).balance>0){ uint256 amountEthA = address(this).balance; payable(walletA).transfer(amountEthA); } uint256 tokenBalance = kryptoPetTokenContract.balanceOf(address(this)); if (tokenBalance>0){ kryptoPetTokenContract.safeTransfer(walletA, tokenBalance); } } function setKryptoPetContractAddress(address _kryptoPetTokenContract) public onlyOwner { kryptoPetTokenContract = IERC20(_kryptoPetTokenContract); } function setWalletA(address _walletA) public { require (msg.sender == walletA, "Who are you?"); require (_walletA != address(0x0), "Invalid wallet"); walletA = _walletA; } function setPhaseEndsAt(uint256 _phaseEnds) public onlyOwner{ phaseEndsAt = _phaseEnds; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_walletA","type":"address"},{"internalType":"address","name":"_kryptoPetTokenContract","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":true,"internalType":"address","name":"customer","type":"address"}],"name":"minting","type":"event"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_destination","type":"address"}],"name":"airdrop_nft","outputs":[{"internalType":"uint256[]","name":"minted","type":"uint256[]"}],"stateMutability":"payable","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":"feedPriceEth","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nftId","type":"uint256"}],"name":"feed_nft_for_eth","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nftId","type":"uint256"}],"name":"feed_nft_for_kpet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amountETH","type":"uint256"}],"name":"getTokensForEth","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hatchPriceEth","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nftId","type":"uint256"}],"name":"hatch_nft_for_eth","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nftId","type":"uint256"}],"name":"hatch_nft_for_kpet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","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":"kryptoPetTokenContract","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintPriceEth","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint_nft_for_eth","outputs":[{"internalType":"uint256[]","name":"minted","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint_nft_for_kpet","outputs":[{"internalType":"uint256[]","name":"minted","type":"uint256[]"}],"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":"phaseEndsAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revivePriceEth","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nftId","type":"uint256"}],"name":"revive_nft_for_eth","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nftId","type":"uint256"}],"name":"revive_nft_for_kpet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_priceEth","type":"uint256"}],"name":"setEthFeedPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_priceEth","type":"uint256"}],"name":"setEthHatchPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_priceEth","type":"uint256"}],"name":"setEthMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_priceEth","type":"uint256"}],"name":"setEthRevivePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_priceEth","type":"uint256"}],"name":"setEthTrainPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_priceEth","type":"uint256"}],"name":"setEthUpdatePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_kryptoPetTokenContract","type":"address"}],"name":"setKryptoPetContractAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_phaseEnds","type":"uint256"}],"name":"setPhaseEndsAt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_walletA","type":"address"}],"name":"setWalletA","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"trainPriceEth","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nftId","type":"uint256"}],"name":"train_nft_for_eth","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nftId","type":"uint256"}],"name":"train_nft_for_kpet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","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":"updatePriceEth","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nftId","type":"uint256"}],"name":"update_nft_for_eth","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nftId","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"update_nft_for_kpet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdraw_all","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052612710600d5566354a6ba7a18000600e556611c37937e08000600f5566470de4df820000601055662386f26fc10000601155666a94d74f4300006012556611c37937e080006013553480156200005957600080fd5b50604051620063b5380380620063b583398181016040528101906200007f9190620003ff565b6040518060400160405280600c81526020017f4b727970746f5065744e465400000000000000000000000000000000000000008152506040518060400160405280600c81526020017f4b727970746f5065744e46540000000000000000000000000000000000000000815250816000908051906020019062000103929190620002e5565b5080600190805190602001906200011c929190620002e5565b5050506200013f620001336200021760201b60201c565b6200021f60201b60201c565b6040518060400160405280601c81526020017f687474703a2f2f3135372e3234352e3234372e3134362f706574732f00000000815250601590805190602001906200018c929190620002e5565b5081600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050620004ab565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002f39062000475565b90600052602060002090601f01602090048101928262000317576000855562000363565b82601f106200033257805160ff191683800117855562000363565b8280016001018555821562000363579182015b828111156200036257825182559160200191906001019062000345565b5b50905062000372919062000376565b5090565b5b808211156200039157600081600090555060010162000377565b5090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620003c7826200039a565b9050919050565b620003d981620003ba565b8114620003e557600080fd5b50565b600081519050620003f981620003ce565b92915050565b6000806040838503121562000419576200041862000395565b5b60006200042985828601620003e8565b92505060206200043c85828601620003e8565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200048e57607f821691505b60208210811415620004a557620004a462000446565b5b50919050565b615efa80620004bb6000396000f3fe6080604052600436106102ff5760003560e01c806388926ebf11610190578063c3291b71116100dc578063def2ef2811610095578063eb0d99391161006f578063eb0d993914610bc4578063f2fde38b14610bf4578063f55ad8ad14610c1d578063f7c8175414610c46576102ff565b8063def2ef2814610b1f578063dfe100d414610b4a578063e985e9c514610b87576102ff565b8063c3291b7114610a15578063c87b56dd14610a40578063cc02b89314610a7d578063dbe7aa7c14610aa8578063dc8868e414610ad8578063dd473d2b14610b08576102ff565b8063982cbd9011610149578063b5fdfbaf11610123578063b5fdfbaf1461096d578063b88d4fde14610998578063bc69e0ba146109c1578063c223e1ab146109ec576102ff565b8063982cbd90146108f2578063a22cb4651461091b578063ad92daa714610944576102ff565b806388926ebf146107dc5780638c7a24a11461080c5780638da5cb5b1461083c5780638df0a6df14610867578063908896e11461089757806395d89b41146108c7576102ff565b80634f6ccce71161024f57806367e3cc4111610208578063715018a6116101e2578063715018a614610736578063790a548a1461074d5780638462151c14610776578063853235e2146107b3576102ff565b806367e3cc41146106a05780636d5b758d146106c957806370a08231146106f9576102ff565b80634f6ccce714610570578063514f815b146105ad5780635563c5e2146105d85780635706ace0146106035780635b8096fa146106335780636352211e14610663576102ff565b80632f745c59116102bc57806342842e0e1161029657806342842e0e146104c3578063446510b5146104ec57806349e03c571461051c5780634c89b86c14610547576102ff565b80632f745c591461042657806332fb7b5014610463578063371af5ce14610493576102ff565b806301ffc9a71461030457806306fdde0314610341578063081812fc1461036c578063095ea7b3146103a957806318160ddd146103d257806323b872dd146103fd575b600080fd5b34801561031057600080fd5b5061032b6004803603810190610326919061413c565b610c6f565b6040516103389190614184565b60405180910390f35b34801561034d57600080fd5b50610356610ce9565b6040516103639190614238565b60405180910390f35b34801561037857600080fd5b50610393600480360381019061038e9190614290565b610d7b565b6040516103a091906142fe565b60405180910390f35b3480156103b557600080fd5b506103d060048036038101906103cb9190614345565b610e00565b005b3480156103de57600080fd5b506103e7610f18565b6040516103f49190614394565b60405180910390f35b34801561040957600080fd5b50610424600480360381019061041f91906143af565b610f25565b005b34801561043257600080fd5b5061044d60048036038101906104489190614345565b610f85565b60405161045a9190614394565b60405180910390f35b61047d60048036038101906104789190614290565b61102a565b60405161048a9190614394565b60405180910390f35b6104ad60048036038101906104a89190614290565b6110fa565b6040516104ba9190614394565b60405180910390f35b3480156104cf57600080fd5b506104ea60048036038101906104e591906143af565b611150565b005b61050660048036038101906105019190614290565b611170565b6040516105139190614394565b60405180910390f35b34801561052857600080fd5b50610531611185565b60405161053e9190614394565b60405180910390f35b34801561055357600080fd5b5061056e60048036038101906105699190614402565b61118b565b005b34801561057c57600080fd5b5061059760048036038101906105929190614290565b6112cf565b6040516105a49190614394565b60405180910390f35b3480156105b957600080fd5b506105c2611340565b6040516105cf9190614394565b60405180910390f35b3480156105e457600080fd5b506105ed611346565b6040516105fa9190614394565b60405180910390f35b61061d60048036038101906106189190614290565b61134c565b60405161062a91906144ed565b60405180910390f35b61064d60048036038101906106489190614290565b6114c8565b60405161065a9190614394565b60405180910390f35b34801561066f57600080fd5b5061068a60048036038101906106859190614290565b6114dd565b60405161069791906142fe565b60405180910390f35b3480156106ac57600080fd5b506106c760048036038101906106c29190614290565b61158f565b005b6106e360048036038101906106de9190614290565b611615565b6040516106f09190614394565b60405180910390f35b34801561070557600080fd5b50610720600480360381019061071b9190614402565b61166b565b60405161072d9190614394565b60405180910390f35b34801561074257600080fd5b5061074b611723565b005b34801561075957600080fd5b50610774600480360381019061076f9190614290565b6117ab565b005b34801561078257600080fd5b5061079d60048036038101906107989190614402565b611831565b6040516107aa91906144ed565b60405180910390f35b3480156107bf57600080fd5b506107da60048036038101906107d59190614290565b61193b565b005b6107f660048036038101906107f19190614290565b6119c1565b60405161080391906144ed565b60405180910390f35b6108266004803603810190610821919061450f565b611c8a565b60405161083391906144ed565b60405180910390f35b34801561084857600080fd5b50610851611e2d565b60405161085e91906142fe565b60405180910390f35b610881600480360381019061087c9190614290565b611e57565b60405161088e9190614394565b60405180910390f35b6108b160048036038101906108ac9190614290565b611ead565b6040516108be9190614394565b60405180910390f35b3480156108d357600080fd5b506108dc611f03565b6040516108e99190614238565b60405180910390f35b3480156108fe57600080fd5b5061091960048036038101906109149190614290565b611f95565b005b34801561092757600080fd5b50610942600480360381019061093d919061457b565b61201b565b005b34801561095057600080fd5b5061096b60048036038101906109669190614290565b612031565b005b34801561097957600080fd5b506109826120b7565b60405161098f9190614394565b60405180910390f35b3480156109a457600080fd5b506109bf60048036038101906109ba91906146f0565b6120bd565b005b3480156109cd57600080fd5b506109d661211f565b6040516109e39190614394565b60405180910390f35b3480156109f857600080fd5b50610a136004803603810190610a0e9190614402565b612125565b005b348015610a2157600080fd5b50610a2a6121e5565b604051610a379190614394565b60405180910390f35b348015610a4c57600080fd5b50610a676004803603810190610a629190614290565b6121eb565b604051610a749190614238565b60405180910390f35b348015610a8957600080fd5b50610a92612292565b604051610a9f9190614394565b60405180910390f35b610ac26004803603810190610abd9190614290565b612298565b604051610acf9190614394565b60405180910390f35b610af26004803603810190610aed9190614773565b6122ad565b604051610aff9190614394565b60405180910390f35b348015610b1457600080fd5b50610b1d61250d565b005b348015610b2b57600080fd5b50610b34612739565b604051610b419190614812565b60405180910390f35b348015610b5657600080fd5b50610b716004803603810190610b6c9190614290565b61275f565b604051610b7e9190614394565b60405180910390f35b348015610b9357600080fd5b50610bae6004803603810190610ba9919061482d565b612962565b604051610bbb9190614184565b60405180910390f35b610bde6004803603810190610bd99190614290565b6129f6565b604051610beb9190614394565b60405180910390f35b348015610c0057600080fd5b50610c1b6004803603810190610c169190614402565b612a0b565b005b348015610c2957600080fd5b50610c446004803603810190610c3f9190614290565b612b03565b005b348015610c5257600080fd5b50610c6d6004803603810190610c689190614290565b612b89565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610ce25750610ce182612c0f565b5b9050919050565b606060008054610cf89061489c565b80601f0160208091040260200160405190810160405280929190818152602001828054610d249061489c565b8015610d715780601f10610d4657610100808354040283529160200191610d71565b820191906000526020600020905b815481529060010190602001808311610d5457829003601f168201915b5050505050905090565b6000610d8682612cf1565b610dc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbc90614940565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610e0b826114dd565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610e7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e73906149d2565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610e9b612d5d565b73ffffffffffffffffffffffffffffffffffffffff161480610eca5750610ec981610ec4612d5d565b612962565b5b610f09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0090614a64565b60405180910390fd5b610f138383612d65565b505050565b6000600880549050905090565b610f36610f30612d5d565b82612e1e565b610f75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6c90614af6565b60405180910390fd5b610f80838383612efc565b505050565b6000610f908361166b565b8210610fd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc890614b88565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6000806110363361166b565b90506000811161107b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107290614bf4565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff1661109b846114dd565b73ffffffffffffffffffffffffffffffffffffffff16146110f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e890614c60565b60405180910390fd5b82915050919050565b60006012543414611140576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113790614ccc565b60405180910390fd5b6111498261102a565b9050919050565b61116b838383604051806020016040528060008152506120bd565b505050565b600061117e826010546122ad565b9050919050565b600d5481565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461121b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121290614d38565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561128b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128290614da4565b60405180910390fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60006112d9610f18565b821061131a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131190614e36565b60405180910390fd5b6008828154811061132e5761132d614e56565b5b90600052602060002001549050919050565b60115481565b60105481565b6060600d5461135b600b613158565b1061139b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139290614ed1565b60405180910390fd5b600082116113de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d590614f3d565b60405180910390fd5b600e54826113ec9190614f8c565b341461142d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142490614ccc565b60405180910390fd5b606060005b838110156114be57611444600b613166565b6000611450600b613158565b905061145c338261317c565b3373ffffffffffffffffffffffffffffffffffffffff167f54855a9fb433368921efe4d763fbb5327f14a84ed1e1a450367bd6811d96636f826040516114a29190614394565b60405180910390a25080806114b690614fe6565b915050611432565b5080915050919050565b60006114d6826011546122ad565b9050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611586576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157d906150a1565b60405180910390fd5b80915050919050565b611597612d5d565b73ffffffffffffffffffffffffffffffffffffffff166115b5611e2d565b73ffffffffffffffffffffffffffffffffffffffff161461160b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116029061510d565b60405180910390fd5b8060108190555050565b6000601054341461165b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165290614ccc565b60405180910390fd5b6116648261102a565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156116dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d39061519f565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61172b612d5d565b73ffffffffffffffffffffffffffffffffffffffff16611749611e2d565b73ffffffffffffffffffffffffffffffffffffffff161461179f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117969061510d565b60405180910390fd5b6117a9600061334a565b565b6117b3612d5d565b73ffffffffffffffffffffffffffffffffffffffff166117d1611e2d565b73ffffffffffffffffffffffffffffffffffffffff1614611827576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181e9061510d565b60405180910390fd5b8060128190555050565b6060600061183e8361166b565b9050600081141561189b57600067ffffffffffffffff811115611864576118636145c5565b5b6040519080825280602002602001820160405280156118925781602001602082028036833780820191505090505b50915050611936565b60008167ffffffffffffffff8111156118b7576118b66145c5565b5b6040519080825280602002602001820160405280156118e55781602001602082028036833780820191505090505b50905060005b8281101561192f576118fd8582610f85565b8282815181106119105761190f614e56565b5b602002602001018181525050808061192790614fe6565b9150506118eb565b8193505050505b919050565b611943612d5d565b73ffffffffffffffffffffffffffffffffffffffff16611961611e2d565b73ffffffffffffffffffffffffffffffffffffffff16146119b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ae9061510d565b60405180910390fd5b8060118190555050565b6060600d546119d0600b613158565b10611a10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0790614ed1565b60405180910390fd5b60008211611a53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4a90614f3d565b60405180910390fd5b6000611a6b600e5484611a669190614f8c565b61275f565b905080601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401611ac991906142fe565b602060405180830381865afa158015611ae6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b0a91906151d4565b1015611b4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b429061524d565b60405180910390fd5b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330846040518463ffffffff1660e01b8152600401611baa9392919061526d565b6020604051808303816000875af1158015611bc9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bed91906152b9565b50606060005b84811015611c7f57611c05600b613166565b6000611c11600b613158565b9050611c1d338261317c565b3373ffffffffffffffffffffffffffffffffffffffff167f54855a9fb433368921efe4d763fbb5327f14a84ed1e1a450367bd6811d96636f82604051611c639190614394565b60405180910390a2508080611c7790614fe6565b915050611bf3565b508092505050919050565b6060600d54611c99600b613158565b10611cd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd090614ed1565b60405180910390fd5b60008311611d1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1390614f3d565b60405180910390fd5b611d24611e2d565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611d91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8890614d38565b60405180910390fd5b606060005b84811015611e2257611da8600b613166565b6000611db4600b613158565b9050611dc0858261317c565b8473ffffffffffffffffffffffffffffffffffffffff167f54855a9fb433368921efe4d763fbb5327f14a84ed1e1a450367bd6811d96636f82604051611e069190614394565b60405180910390a2508080611e1a90614fe6565b915050611d96565b508091505092915050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60006013543414611e9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9490614ccc565b60405180910390fd5b611ea68261102a565b9050919050565b60006011543414611ef3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eea90614ccc565b60405180910390fd5b611efc8261102a565b9050919050565b606060018054611f129061489c565b80601f0160208091040260200160405190810160405280929190818152602001828054611f3e9061489c565b8015611f8b5780601f10611f6057610100808354040283529160200191611f8b565b820191906000526020600020905b815481529060010190602001808311611f6e57829003601f168201915b5050505050905090565b611f9d612d5d565b73ffffffffffffffffffffffffffffffffffffffff16611fbb611e2d565b73ffffffffffffffffffffffffffffffffffffffff1614612011576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120089061510d565b60405180910390fd5b8060138190555050565b61202d612026612d5d565b8383613410565b5050565b612039612d5d565b73ffffffffffffffffffffffffffffffffffffffff16612057611e2d565b73ffffffffffffffffffffffffffffffffffffffff16146120ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a49061510d565b60405180910390fd5b80600f8190555050565b600f5481565b6120ce6120c8612d5d565b83612e1e565b61210d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161210490614af6565b60405180910390fd5b6121198484848461357d565b50505050565b60135481565b61212d612d5d565b73ffffffffffffffffffffffffffffffffffffffff1661214b611e2d565b73ffffffffffffffffffffffffffffffffffffffff16146121a1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121989061510d565b60405180910390fd5b80601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60125481565b60606121f682612cf1565b612235576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222c90615358565b60405180910390fd5b600061223f6135d9565b9050600081511161225f576040518060200160405280600081525061228a565b806122698461366b565b60405160200161227a9291906153b4565b6040516020818303038152906040525b915050919050565b600e5481565b60006122a6826012546122ad565b9050919050565b6000806122b93361166b565b9050600081116122fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122f590614bf4565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff1661231e856114dd565b73ffffffffffffffffffffffffffffffffffffffff1614612374576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236b90614c60565b60405180910390fd5b600061237f8461275f565b905080601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b81526004016123dd91906142fe565b602060405180830381865afa1580156123fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061241e91906151d4565b101561245f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124569061524d565b60405180910390fd5b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330846040518463ffffffff1660e01b81526004016124be9392919061526d565b6020604051808303816000875af11580156124dd573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061250191906152b9565b50849250505092915050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061259b575061256c611e2d565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6125a457600080fd5b600047111561261d576000479050600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561261a573d6000803e3d6000fd5b50505b6000601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161267a91906142fe565b602060405180830381865afa158015612697573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126bb91906151d4565b9050600081111561273657612735600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166137cc9092919063ffffffff16565b5b50565b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008073c525c83168ef7b9d75daa09581da5a8848bc3a15905060008173ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa1580156127c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127ea91906153ed565b90506000808373ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa15801561283a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061285e919061549c565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff16915060008373ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156128d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128f491906151d4565b600a6129009190615622565b8261290b9190614f8c565b905060008382678ac7230489e800006129249190614f8c565b61292e919061569c565b9050600081678ac7230489e800008a6129479190614f8c565b612951919061569c565b905080975050505050505050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000612a04826013546122ad565b9050919050565b612a13612d5d565b73ffffffffffffffffffffffffffffffffffffffff16612a31611e2d565b73ffffffffffffffffffffffffffffffffffffffff1614612a87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a7e9061510d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612af7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aee9061573f565b60405180910390fd5b612b008161334a565b50565b612b0b612d5d565b73ffffffffffffffffffffffffffffffffffffffff16612b29611e2d565b73ffffffffffffffffffffffffffffffffffffffff1614612b7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b769061510d565b60405180910390fd5b80600d8190555050565b612b91612d5d565b73ffffffffffffffffffffffffffffffffffffffff16612baf611e2d565b73ffffffffffffffffffffffffffffffffffffffff1614612c05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bfc9061510d565b60405180910390fd5b80600e8190555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612cda57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612cea5750612ce982613852565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612dd8836114dd565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612e2982612cf1565b612e68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e5f906157d1565b60405180910390fd5b6000612e73836114dd565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612ee257508373ffffffffffffffffffffffffffffffffffffffff16612eca84610d7b565b73ffffffffffffffffffffffffffffffffffffffff16145b80612ef35750612ef28185612962565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612f1c826114dd565b73ffffffffffffffffffffffffffffffffffffffff1614612f72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f6990615863565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612fe2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fd9906158f5565b60405180910390fd5b612fed8383836138bc565b612ff8600082612d65565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546130489190615915565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461309f9190615949565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600081600001549050919050565b6001816000016000828254019250508190555050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156131ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131e3906159eb565b60405180910390fd5b6131f581612cf1565b15613235576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161322c90615a57565b60405180910390fd5b613241600083836138bc565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546132919190615949565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561347f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161347690615ac3565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516135709190614184565b60405180910390a3505050565b613588848484612efc565b613594848484846139d0565b6135d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135ca90615b55565b60405180910390fd5b50505050565b6060601580546135e89061489c565b80601f01602080910402602001604051908101604052809291908181526020018280546136149061489c565b80156136615780601f1061363657610100808354040283529160200191613661565b820191906000526020600020905b81548152906001019060200180831161364457829003601f168201915b5050505050905090565b606060008214156136b3576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506137c7565b600082905060005b600082146136e55780806136ce90614fe6565b915050600a826136de919061569c565b91506136bb565b60008167ffffffffffffffff811115613701576137006145c5565b5b6040519080825280601f01601f1916602001820160405280156137335781602001600182028036833780820191505090505b5090505b600085146137c05760018261374c9190615915565b9150600a8561375b9190615b75565b60306137679190615949565b60f81b81838151811061377d5761377c614e56565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856137b9919061569c565b9450613737565b8093505050505b919050565b61384d8363a9059cbb60e01b84846040516024016137eb929190615ba6565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613b58565b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6138c7838383613c1f565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561390a5761390581613c24565b613949565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614613948576139478382613c6d565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561398c5761398781613dda565b6139cb565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146139ca576139c98282613eab565b5b5b505050565b60006139f18473ffffffffffffffffffffffffffffffffffffffff16613f2a565b15613b4b578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613a1a612d5d565b8786866040518563ffffffff1660e01b8152600401613a3c9493929190615c24565b6020604051808303816000875af1925050508015613a7857506040513d601f19601f82011682018060405250810190613a759190615c85565b60015b613afb573d8060008114613aa8576040519150601f19603f3d011682016040523d82523d6000602084013e613aad565b606091505b50600081511415613af3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613aea90615b55565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613b50565b600190505b949350505050565b6000613bba826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16613f3d9092919063ffffffff16565b9050600081511115613c1a5780806020019051810190613bda91906152b9565b613c19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c1090615d24565b60405180910390fd5b5b505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613c7a8461166b565b613c849190615915565b9050600060076000848152602001908152602001600020549050818114613d69576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050613dee9190615915565b9050600060096000848152602001908152602001600020549050600060088381548110613e1e57613e1d614e56565b5b906000526020600020015490508060088381548110613e4057613e3f614e56565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613e8f57613e8e615d44565b5b6001900381819060005260206000200160009055905550505050565b6000613eb68361166b565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b6060613f4c8484600085613f55565b90509392505050565b606082471015613f9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613f9190615de5565b60405180910390fd5b613fa385613f2a565b613fe2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613fd990615e51565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161400b9190615ead565b60006040518083038185875af1925050503d8060008114614048576040519150601f19603f3d011682016040523d82523d6000602084013e61404d565b606091505b509150915061405d828286614069565b92505050949350505050565b60608315614079578290506140c9565b60008351111561408c5782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016140c09190614238565b60405180910390fd5b9392505050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b614119816140e4565b811461412457600080fd5b50565b60008135905061413681614110565b92915050565b600060208284031215614152576141516140da565b5b600061416084828501614127565b91505092915050565b60008115159050919050565b61417e81614169565b82525050565b60006020820190506141996000830184614175565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156141d95780820151818401526020810190506141be565b838111156141e8576000848401525b50505050565b6000601f19601f8301169050919050565b600061420a8261419f565b61421481856141aa565b93506142248185602086016141bb565b61422d816141ee565b840191505092915050565b6000602082019050818103600083015261425281846141ff565b905092915050565b6000819050919050565b61426d8161425a565b811461427857600080fd5b50565b60008135905061428a81614264565b92915050565b6000602082840312156142a6576142a56140da565b5b60006142b48482850161427b565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006142e8826142bd565b9050919050565b6142f8816142dd565b82525050565b600060208201905061431360008301846142ef565b92915050565b614322816142dd565b811461432d57600080fd5b50565b60008135905061433f81614319565b92915050565b6000806040838503121561435c5761435b6140da565b5b600061436a85828601614330565b925050602061437b8582860161427b565b9150509250929050565b61438e8161425a565b82525050565b60006020820190506143a96000830184614385565b92915050565b6000806000606084860312156143c8576143c76140da565b5b60006143d686828701614330565b93505060206143e786828701614330565b92505060406143f88682870161427b565b9150509250925092565b600060208284031215614418576144176140da565b5b600061442684828501614330565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6144648161425a565b82525050565b6000614476838361445b565b60208301905092915050565b6000602082019050919050565b600061449a8261442f565b6144a4818561443a565b93506144af8361444b565b8060005b838110156144e05781516144c7888261446a565b97506144d283614482565b9250506001810190506144b3565b5085935050505092915050565b60006020820190508181036000830152614507818461448f565b905092915050565b60008060408385031215614526576145256140da565b5b60006145348582860161427b565b925050602061454585828601614330565b9150509250929050565b61455881614169565b811461456357600080fd5b50565b6000813590506145758161454f565b92915050565b60008060408385031215614592576145916140da565b5b60006145a085828601614330565b92505060206145b185828601614566565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6145fd826141ee565b810181811067ffffffffffffffff8211171561461c5761461b6145c5565b5b80604052505050565b600061462f6140d0565b905061463b82826145f4565b919050565b600067ffffffffffffffff82111561465b5761465a6145c5565b5b614664826141ee565b9050602081019050919050565b82818337600083830152505050565b600061469361468e84614640565b614625565b9050828152602081018484840111156146af576146ae6145c0565b5b6146ba848285614671565b509392505050565b600082601f8301126146d7576146d66145bb565b5b81356146e7848260208601614680565b91505092915050565b6000806000806080858703121561470a576147096140da565b5b600061471887828801614330565b945050602061472987828801614330565b935050604061473a8782880161427b565b925050606085013567ffffffffffffffff81111561475b5761475a6140df565b5b614767878288016146c2565b91505092959194509250565b6000806040838503121561478a576147896140da565b5b60006147988582860161427b565b92505060206147a98582860161427b565b9150509250929050565b6000819050919050565b60006147d86147d36147ce846142bd565b6147b3565b6142bd565b9050919050565b60006147ea826147bd565b9050919050565b60006147fc826147df565b9050919050565b61480c816147f1565b82525050565b60006020820190506148276000830184614803565b92915050565b60008060408385031215614844576148436140da565b5b600061485285828601614330565b925050602061486385828601614330565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806148b457607f821691505b602082108114156148c8576148c761486d565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b600061492a602c836141aa565b9150614935826148ce565b604082019050919050565b600060208201905081810360008301526149598161491d565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006149bc6021836141aa565b91506149c782614960565b604082019050919050565b600060208201905081810360008301526149eb816149af565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000614a4e6038836141aa565b9150614a59826149f2565b604082019050919050565b60006020820190508181036000830152614a7d81614a41565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000614ae06031836141aa565b9150614aeb82614a84565b604082019050919050565b60006020820190508181036000830152614b0f81614ad3565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000614b72602b836141aa565b9150614b7d82614b16565b604082019050919050565b60006020820190508181036000830152614ba181614b65565b9050919050565b7f4e6f204e465420666f7220746869732061646472657373000000000000000000600082015250565b6000614bde6017836141aa565b9150614be982614ba8565b602082019050919050565b60006020820190508181036000830152614c0d81614bd1565b9050919050565b7f4e6f7420746865206f776e6572206f662074686973204e465400000000000000600082015250565b6000614c4a6019836141aa565b9150614c5582614c14565b602082019050919050565b60006020820190508181036000830152614c7981614c3d565b9050919050565b7f4e46543a20496e76616c69642076616c75652e00000000000000000000000000600082015250565b6000614cb66013836141aa565b9150614cc182614c80565b602082019050919050565b60006020820190508181036000830152614ce581614ca9565b9050919050565b7f57686f2061726520796f753f0000000000000000000000000000000000000000600082015250565b6000614d22600c836141aa565b9150614d2d82614cec565b602082019050919050565b60006020820190508181036000830152614d5181614d15565b9050919050565b7f496e76616c69642077616c6c6574000000000000000000000000000000000000600082015250565b6000614d8e600e836141aa565b9150614d9982614d58565b602082019050919050565b60006020820190508181036000830152614dbd81614d81565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000614e20602c836141aa565b9150614e2b82614dc4565b604082019050919050565b60006020820190508181036000830152614e4f81614e13565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4d696e74696e6720506861736520456e64656400000000000000000000000000600082015250565b6000614ebb6013836141aa565b9150614ec682614e85565b602082019050919050565b60006020820190508181036000830152614eea81614eae565b9050919050565b7f4e46543a20496e76616c696420616d6f756e7420746f206d696e742e00000000600082015250565b6000614f27601c836141aa565b9150614f3282614ef1565b602082019050919050565b60006020820190508181036000830152614f5681614f1a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614f978261425a565b9150614fa28361425a565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614fdb57614fda614f5d565b5b828202905092915050565b6000614ff18261425a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561502457615023614f5d565b5b600182019050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b600061508b6029836141aa565b91506150968261502f565b604082019050919050565b600060208201905081810360008301526150ba8161507e565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006150f76020836141aa565b9150615102826150c1565b602082019050919050565b60006020820190508181036000830152615126816150ea565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000615189602a836141aa565b91506151948261512d565b604082019050919050565b600060208201905081810360008301526151b88161517c565b9050919050565b6000815190506151ce81614264565b92915050565b6000602082840312156151ea576151e96140da565b5b60006151f8848285016151bf565b91505092915050565b7f496e73756666696369656e7420746f6b656e2062616c616e63652e0000000000600082015250565b6000615237601b836141aa565b915061524282615201565b602082019050919050565b600060208201905081810360008301526152668161522a565b9050919050565b600060608201905061528260008301866142ef565b61528f60208301856142ef565b61529c6040830184614385565b949350505050565b6000815190506152b38161454f565b92915050565b6000602082840312156152cf576152ce6140da565b5b60006152dd848285016152a4565b91505092915050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000615342602f836141aa565b915061534d826152e6565b604082019050919050565b6000602082019050818103600083015261537181615335565b9050919050565b600081905092915050565b600061538e8261419f565b6153988185615378565b93506153a88185602086016141bb565b80840191505092915050565b60006153c08285615383565b91506153cc8284615383565b91508190509392505050565b6000815190506153e781614319565b92915050565b600060208284031215615403576154026140da565b5b6000615411848285016153d8565b91505092915050565b60006dffffffffffffffffffffffffffff82169050919050565b61543d8161541a565b811461544857600080fd5b50565b60008151905061545a81615434565b92915050565b600063ffffffff82169050919050565b61547981615460565b811461548457600080fd5b50565b60008151905061549681615470565b92915050565b6000806000606084860312156154b5576154b46140da565b5b60006154c38682870161544b565b93505060206154d48682870161544b565b92505060406154e586828701615487565b9150509250925092565b60008160011c9050919050565b6000808291508390505b60018511156155465780860481111561552257615521614f5d565b5b60018516156155315780820291505b808102905061553f856154ef565b9450615506565b94509492505050565b60008261555f576001905061561b565b8161556d576000905061561b565b8160018114615583576002811461558d576155bc565b600191505061561b565b60ff84111561559f5761559e614f5d565b5b8360020a9150848211156155b6576155b5614f5d565b5b5061561b565b5060208310610133831016604e8410600b84101617156155f15782820a9050838111156155ec576155eb614f5d565b5b61561b565b6155fe84848460016154fc565b9250905081840481111561561557615614614f5d565b5b81810290505b9392505050565b600061562d8261425a565b91506156388361425a565b92506156657fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848461554f565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006156a78261425a565b91506156b28361425a565b9250826156c2576156c161566d565b5b828204905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006157296026836141aa565b9150615734826156cd565b604082019050919050565b600060208201905081810360008301526157588161571c565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b60006157bb602c836141aa565b91506157c68261575f565b604082019050919050565b600060208201905081810360008301526157ea816157ae565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b600061584d6029836141aa565b9150615858826157f1565b604082019050919050565b6000602082019050818103600083015261587c81615840565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006158df6024836141aa565b91506158ea82615883565b604082019050919050565b6000602082019050818103600083015261590e816158d2565b9050919050565b60006159208261425a565b915061592b8361425a565b92508282101561593e5761593d614f5d565b5b828203905092915050565b60006159548261425a565b915061595f8361425a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561599457615993614f5d565b5b828201905092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b60006159d56020836141aa565b91506159e08261599f565b602082019050919050565b60006020820190508181036000830152615a04816159c8565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000615a41601c836141aa565b9150615a4c82615a0b565b602082019050919050565b60006020820190508181036000830152615a7081615a34565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000615aad6019836141aa565b9150615ab882615a77565b602082019050919050565b60006020820190508181036000830152615adc81615aa0565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000615b3f6032836141aa565b9150615b4a82615ae3565b604082019050919050565b60006020820190508181036000830152615b6e81615b32565b9050919050565b6000615b808261425a565b9150615b8b8361425a565b925082615b9b57615b9a61566d565b5b828206905092915050565b6000604082019050615bbb60008301856142ef565b615bc86020830184614385565b9392505050565b600081519050919050565b600082825260208201905092915050565b6000615bf682615bcf565b615c008185615bda565b9350615c108185602086016141bb565b615c19816141ee565b840191505092915050565b6000608082019050615c3960008301876142ef565b615c4660208301866142ef565b615c536040830185614385565b8181036060830152615c658184615beb565b905095945050505050565b600081519050615c7f81614110565b92915050565b600060208284031215615c9b57615c9a6140da565b5b6000615ca984828501615c70565b91505092915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b6000615d0e602a836141aa565b9150615d1982615cb2565b604082019050919050565b60006020820190508181036000830152615d3d81615d01565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b6000615dcf6026836141aa565b9150615dda82615d73565b604082019050919050565b60006020820190508181036000830152615dfe81615dc2565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000615e3b601d836141aa565b9150615e4682615e05565b602082019050919050565b60006020820190508181036000830152615e6a81615e2e565b9050919050565b600081905092915050565b6000615e8782615bcf565b615e918185615e71565b9350615ea18185602086016141bb565b80840191505092915050565b6000615eb98284615e7c565b91508190509291505056fea26469706673582212205f028839e793623f1d1fe62ffe7361e96b474751292bc9b53356d7c4ecd3b24864736f6c634300080a0033000000000000000000000000bc2a91790f3f1bde4b0f8426e9a43c040126c639000000000000000000000000eef37d7bd4ae03fd8ee1c44491987e422b53ed25
Deployed Bytecode
0x6080604052600436106102ff5760003560e01c806388926ebf11610190578063c3291b71116100dc578063def2ef2811610095578063eb0d99391161006f578063eb0d993914610bc4578063f2fde38b14610bf4578063f55ad8ad14610c1d578063f7c8175414610c46576102ff565b8063def2ef2814610b1f578063dfe100d414610b4a578063e985e9c514610b87576102ff565b8063c3291b7114610a15578063c87b56dd14610a40578063cc02b89314610a7d578063dbe7aa7c14610aa8578063dc8868e414610ad8578063dd473d2b14610b08576102ff565b8063982cbd9011610149578063b5fdfbaf11610123578063b5fdfbaf1461096d578063b88d4fde14610998578063bc69e0ba146109c1578063c223e1ab146109ec576102ff565b8063982cbd90146108f2578063a22cb4651461091b578063ad92daa714610944576102ff565b806388926ebf146107dc5780638c7a24a11461080c5780638da5cb5b1461083c5780638df0a6df14610867578063908896e11461089757806395d89b41146108c7576102ff565b80634f6ccce71161024f57806367e3cc4111610208578063715018a6116101e2578063715018a614610736578063790a548a1461074d5780638462151c14610776578063853235e2146107b3576102ff565b806367e3cc41146106a05780636d5b758d146106c957806370a08231146106f9576102ff565b80634f6ccce714610570578063514f815b146105ad5780635563c5e2146105d85780635706ace0146106035780635b8096fa146106335780636352211e14610663576102ff565b80632f745c59116102bc57806342842e0e1161029657806342842e0e146104c3578063446510b5146104ec57806349e03c571461051c5780634c89b86c14610547576102ff565b80632f745c591461042657806332fb7b5014610463578063371af5ce14610493576102ff565b806301ffc9a71461030457806306fdde0314610341578063081812fc1461036c578063095ea7b3146103a957806318160ddd146103d257806323b872dd146103fd575b600080fd5b34801561031057600080fd5b5061032b6004803603810190610326919061413c565b610c6f565b6040516103389190614184565b60405180910390f35b34801561034d57600080fd5b50610356610ce9565b6040516103639190614238565b60405180910390f35b34801561037857600080fd5b50610393600480360381019061038e9190614290565b610d7b565b6040516103a091906142fe565b60405180910390f35b3480156103b557600080fd5b506103d060048036038101906103cb9190614345565b610e00565b005b3480156103de57600080fd5b506103e7610f18565b6040516103f49190614394565b60405180910390f35b34801561040957600080fd5b50610424600480360381019061041f91906143af565b610f25565b005b34801561043257600080fd5b5061044d60048036038101906104489190614345565b610f85565b60405161045a9190614394565b60405180910390f35b61047d60048036038101906104789190614290565b61102a565b60405161048a9190614394565b60405180910390f35b6104ad60048036038101906104a89190614290565b6110fa565b6040516104ba9190614394565b60405180910390f35b3480156104cf57600080fd5b506104ea60048036038101906104e591906143af565b611150565b005b61050660048036038101906105019190614290565b611170565b6040516105139190614394565b60405180910390f35b34801561052857600080fd5b50610531611185565b60405161053e9190614394565b60405180910390f35b34801561055357600080fd5b5061056e60048036038101906105699190614402565b61118b565b005b34801561057c57600080fd5b5061059760048036038101906105929190614290565b6112cf565b6040516105a49190614394565b60405180910390f35b3480156105b957600080fd5b506105c2611340565b6040516105cf9190614394565b60405180910390f35b3480156105e457600080fd5b506105ed611346565b6040516105fa9190614394565b60405180910390f35b61061d60048036038101906106189190614290565b61134c565b60405161062a91906144ed565b60405180910390f35b61064d60048036038101906106489190614290565b6114c8565b60405161065a9190614394565b60405180910390f35b34801561066f57600080fd5b5061068a60048036038101906106859190614290565b6114dd565b60405161069791906142fe565b60405180910390f35b3480156106ac57600080fd5b506106c760048036038101906106c29190614290565b61158f565b005b6106e360048036038101906106de9190614290565b611615565b6040516106f09190614394565b60405180910390f35b34801561070557600080fd5b50610720600480360381019061071b9190614402565b61166b565b60405161072d9190614394565b60405180910390f35b34801561074257600080fd5b5061074b611723565b005b34801561075957600080fd5b50610774600480360381019061076f9190614290565b6117ab565b005b34801561078257600080fd5b5061079d60048036038101906107989190614402565b611831565b6040516107aa91906144ed565b60405180910390f35b3480156107bf57600080fd5b506107da60048036038101906107d59190614290565b61193b565b005b6107f660048036038101906107f19190614290565b6119c1565b60405161080391906144ed565b60405180910390f35b6108266004803603810190610821919061450f565b611c8a565b60405161083391906144ed565b60405180910390f35b34801561084857600080fd5b50610851611e2d565b60405161085e91906142fe565b60405180910390f35b610881600480360381019061087c9190614290565b611e57565b60405161088e9190614394565b60405180910390f35b6108b160048036038101906108ac9190614290565b611ead565b6040516108be9190614394565b60405180910390f35b3480156108d357600080fd5b506108dc611f03565b6040516108e99190614238565b60405180910390f35b3480156108fe57600080fd5b5061091960048036038101906109149190614290565b611f95565b005b34801561092757600080fd5b50610942600480360381019061093d919061457b565b61201b565b005b34801561095057600080fd5b5061096b60048036038101906109669190614290565b612031565b005b34801561097957600080fd5b506109826120b7565b60405161098f9190614394565b60405180910390f35b3480156109a457600080fd5b506109bf60048036038101906109ba91906146f0565b6120bd565b005b3480156109cd57600080fd5b506109d661211f565b6040516109e39190614394565b60405180910390f35b3480156109f857600080fd5b50610a136004803603810190610a0e9190614402565b612125565b005b348015610a2157600080fd5b50610a2a6121e5565b604051610a379190614394565b60405180910390f35b348015610a4c57600080fd5b50610a676004803603810190610a629190614290565b6121eb565b604051610a749190614238565b60405180910390f35b348015610a8957600080fd5b50610a92612292565b604051610a9f9190614394565b60405180910390f35b610ac26004803603810190610abd9190614290565b612298565b604051610acf9190614394565b60405180910390f35b610af26004803603810190610aed9190614773565b6122ad565b604051610aff9190614394565b60405180910390f35b348015610b1457600080fd5b50610b1d61250d565b005b348015610b2b57600080fd5b50610b34612739565b604051610b419190614812565b60405180910390f35b348015610b5657600080fd5b50610b716004803603810190610b6c9190614290565b61275f565b604051610b7e9190614394565b60405180910390f35b348015610b9357600080fd5b50610bae6004803603810190610ba9919061482d565b612962565b604051610bbb9190614184565b60405180910390f35b610bde6004803603810190610bd99190614290565b6129f6565b604051610beb9190614394565b60405180910390f35b348015610c0057600080fd5b50610c1b6004803603810190610c169190614402565b612a0b565b005b348015610c2957600080fd5b50610c446004803603810190610c3f9190614290565b612b03565b005b348015610c5257600080fd5b50610c6d6004803603810190610c689190614290565b612b89565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610ce25750610ce182612c0f565b5b9050919050565b606060008054610cf89061489c565b80601f0160208091040260200160405190810160405280929190818152602001828054610d249061489c565b8015610d715780601f10610d4657610100808354040283529160200191610d71565b820191906000526020600020905b815481529060010190602001808311610d5457829003601f168201915b5050505050905090565b6000610d8682612cf1565b610dc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbc90614940565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610e0b826114dd565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610e7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e73906149d2565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610e9b612d5d565b73ffffffffffffffffffffffffffffffffffffffff161480610eca5750610ec981610ec4612d5d565b612962565b5b610f09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0090614a64565b60405180910390fd5b610f138383612d65565b505050565b6000600880549050905090565b610f36610f30612d5d565b82612e1e565b610f75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6c90614af6565b60405180910390fd5b610f80838383612efc565b505050565b6000610f908361166b565b8210610fd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc890614b88565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6000806110363361166b565b90506000811161107b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107290614bf4565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff1661109b846114dd565b73ffffffffffffffffffffffffffffffffffffffff16146110f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e890614c60565b60405180910390fd5b82915050919050565b60006012543414611140576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113790614ccc565b60405180910390fd5b6111498261102a565b9050919050565b61116b838383604051806020016040528060008152506120bd565b505050565b600061117e826010546122ad565b9050919050565b600d5481565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461121b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121290614d38565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561128b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128290614da4565b60405180910390fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60006112d9610f18565b821061131a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131190614e36565b60405180910390fd5b6008828154811061132e5761132d614e56565b5b90600052602060002001549050919050565b60115481565b60105481565b6060600d5461135b600b613158565b1061139b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139290614ed1565b60405180910390fd5b600082116113de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d590614f3d565b60405180910390fd5b600e54826113ec9190614f8c565b341461142d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142490614ccc565b60405180910390fd5b606060005b838110156114be57611444600b613166565b6000611450600b613158565b905061145c338261317c565b3373ffffffffffffffffffffffffffffffffffffffff167f54855a9fb433368921efe4d763fbb5327f14a84ed1e1a450367bd6811d96636f826040516114a29190614394565b60405180910390a25080806114b690614fe6565b915050611432565b5080915050919050565b60006114d6826011546122ad565b9050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611586576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157d906150a1565b60405180910390fd5b80915050919050565b611597612d5d565b73ffffffffffffffffffffffffffffffffffffffff166115b5611e2d565b73ffffffffffffffffffffffffffffffffffffffff161461160b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116029061510d565b60405180910390fd5b8060108190555050565b6000601054341461165b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165290614ccc565b60405180910390fd5b6116648261102a565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156116dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d39061519f565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61172b612d5d565b73ffffffffffffffffffffffffffffffffffffffff16611749611e2d565b73ffffffffffffffffffffffffffffffffffffffff161461179f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117969061510d565b60405180910390fd5b6117a9600061334a565b565b6117b3612d5d565b73ffffffffffffffffffffffffffffffffffffffff166117d1611e2d565b73ffffffffffffffffffffffffffffffffffffffff1614611827576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181e9061510d565b60405180910390fd5b8060128190555050565b6060600061183e8361166b565b9050600081141561189b57600067ffffffffffffffff811115611864576118636145c5565b5b6040519080825280602002602001820160405280156118925781602001602082028036833780820191505090505b50915050611936565b60008167ffffffffffffffff8111156118b7576118b66145c5565b5b6040519080825280602002602001820160405280156118e55781602001602082028036833780820191505090505b50905060005b8281101561192f576118fd8582610f85565b8282815181106119105761190f614e56565b5b602002602001018181525050808061192790614fe6565b9150506118eb565b8193505050505b919050565b611943612d5d565b73ffffffffffffffffffffffffffffffffffffffff16611961611e2d565b73ffffffffffffffffffffffffffffffffffffffff16146119b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ae9061510d565b60405180910390fd5b8060118190555050565b6060600d546119d0600b613158565b10611a10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0790614ed1565b60405180910390fd5b60008211611a53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4a90614f3d565b60405180910390fd5b6000611a6b600e5484611a669190614f8c565b61275f565b905080601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401611ac991906142fe565b602060405180830381865afa158015611ae6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b0a91906151d4565b1015611b4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b429061524d565b60405180910390fd5b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330846040518463ffffffff1660e01b8152600401611baa9392919061526d565b6020604051808303816000875af1158015611bc9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bed91906152b9565b50606060005b84811015611c7f57611c05600b613166565b6000611c11600b613158565b9050611c1d338261317c565b3373ffffffffffffffffffffffffffffffffffffffff167f54855a9fb433368921efe4d763fbb5327f14a84ed1e1a450367bd6811d96636f82604051611c639190614394565b60405180910390a2508080611c7790614fe6565b915050611bf3565b508092505050919050565b6060600d54611c99600b613158565b10611cd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd090614ed1565b60405180910390fd5b60008311611d1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1390614f3d565b60405180910390fd5b611d24611e2d565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611d91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8890614d38565b60405180910390fd5b606060005b84811015611e2257611da8600b613166565b6000611db4600b613158565b9050611dc0858261317c565b8473ffffffffffffffffffffffffffffffffffffffff167f54855a9fb433368921efe4d763fbb5327f14a84ed1e1a450367bd6811d96636f82604051611e069190614394565b60405180910390a2508080611e1a90614fe6565b915050611d96565b508091505092915050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60006013543414611e9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9490614ccc565b60405180910390fd5b611ea68261102a565b9050919050565b60006011543414611ef3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eea90614ccc565b60405180910390fd5b611efc8261102a565b9050919050565b606060018054611f129061489c565b80601f0160208091040260200160405190810160405280929190818152602001828054611f3e9061489c565b8015611f8b5780601f10611f6057610100808354040283529160200191611f8b565b820191906000526020600020905b815481529060010190602001808311611f6e57829003601f168201915b5050505050905090565b611f9d612d5d565b73ffffffffffffffffffffffffffffffffffffffff16611fbb611e2d565b73ffffffffffffffffffffffffffffffffffffffff1614612011576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120089061510d565b60405180910390fd5b8060138190555050565b61202d612026612d5d565b8383613410565b5050565b612039612d5d565b73ffffffffffffffffffffffffffffffffffffffff16612057611e2d565b73ffffffffffffffffffffffffffffffffffffffff16146120ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a49061510d565b60405180910390fd5b80600f8190555050565b600f5481565b6120ce6120c8612d5d565b83612e1e565b61210d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161210490614af6565b60405180910390fd5b6121198484848461357d565b50505050565b60135481565b61212d612d5d565b73ffffffffffffffffffffffffffffffffffffffff1661214b611e2d565b73ffffffffffffffffffffffffffffffffffffffff16146121a1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121989061510d565b60405180910390fd5b80601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60125481565b60606121f682612cf1565b612235576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222c90615358565b60405180910390fd5b600061223f6135d9565b9050600081511161225f576040518060200160405280600081525061228a565b806122698461366b565b60405160200161227a9291906153b4565b6040516020818303038152906040525b915050919050565b600e5481565b60006122a6826012546122ad565b9050919050565b6000806122b93361166b565b9050600081116122fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122f590614bf4565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff1661231e856114dd565b73ffffffffffffffffffffffffffffffffffffffff1614612374576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236b90614c60565b60405180910390fd5b600061237f8461275f565b905080601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b81526004016123dd91906142fe565b602060405180830381865afa1580156123fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061241e91906151d4565b101561245f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124569061524d565b60405180910390fd5b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330846040518463ffffffff1660e01b81526004016124be9392919061526d565b6020604051808303816000875af11580156124dd573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061250191906152b9565b50849250505092915050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061259b575061256c611e2d565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6125a457600080fd5b600047111561261d576000479050600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561261a573d6000803e3d6000fd5b50505b6000601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161267a91906142fe565b602060405180830381865afa158015612697573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126bb91906151d4565b9050600081111561273657612735600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166137cc9092919063ffffffff16565b5b50565b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008073c525c83168ef7b9d75daa09581da5a8848bc3a15905060008173ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa1580156127c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127ea91906153ed565b90506000808373ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa15801561283a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061285e919061549c565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff16915060008373ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156128d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128f491906151d4565b600a6129009190615622565b8261290b9190614f8c565b905060008382678ac7230489e800006129249190614f8c565b61292e919061569c565b9050600081678ac7230489e800008a6129479190614f8c565b612951919061569c565b905080975050505050505050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000612a04826013546122ad565b9050919050565b612a13612d5d565b73ffffffffffffffffffffffffffffffffffffffff16612a31611e2d565b73ffffffffffffffffffffffffffffffffffffffff1614612a87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a7e9061510d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612af7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aee9061573f565b60405180910390fd5b612b008161334a565b50565b612b0b612d5d565b73ffffffffffffffffffffffffffffffffffffffff16612b29611e2d565b73ffffffffffffffffffffffffffffffffffffffff1614612b7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b769061510d565b60405180910390fd5b80600d8190555050565b612b91612d5d565b73ffffffffffffffffffffffffffffffffffffffff16612baf611e2d565b73ffffffffffffffffffffffffffffffffffffffff1614612c05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bfc9061510d565b60405180910390fd5b80600e8190555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612cda57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612cea5750612ce982613852565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612dd8836114dd565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612e2982612cf1565b612e68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e5f906157d1565b60405180910390fd5b6000612e73836114dd565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612ee257508373ffffffffffffffffffffffffffffffffffffffff16612eca84610d7b565b73ffffffffffffffffffffffffffffffffffffffff16145b80612ef35750612ef28185612962565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612f1c826114dd565b73ffffffffffffffffffffffffffffffffffffffff1614612f72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f6990615863565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612fe2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fd9906158f5565b60405180910390fd5b612fed8383836138bc565b612ff8600082612d65565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546130489190615915565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461309f9190615949565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600081600001549050919050565b6001816000016000828254019250508190555050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156131ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131e3906159eb565b60405180910390fd5b6131f581612cf1565b15613235576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161322c90615a57565b60405180910390fd5b613241600083836138bc565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546132919190615949565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561347f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161347690615ac3565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516135709190614184565b60405180910390a3505050565b613588848484612efc565b613594848484846139d0565b6135d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135ca90615b55565b60405180910390fd5b50505050565b6060601580546135e89061489c565b80601f01602080910402602001604051908101604052809291908181526020018280546136149061489c565b80156136615780601f1061363657610100808354040283529160200191613661565b820191906000526020600020905b81548152906001019060200180831161364457829003601f168201915b5050505050905090565b606060008214156136b3576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506137c7565b600082905060005b600082146136e55780806136ce90614fe6565b915050600a826136de919061569c565b91506136bb565b60008167ffffffffffffffff811115613701576137006145c5565b5b6040519080825280601f01601f1916602001820160405280156137335781602001600182028036833780820191505090505b5090505b600085146137c05760018261374c9190615915565b9150600a8561375b9190615b75565b60306137679190615949565b60f81b81838151811061377d5761377c614e56565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856137b9919061569c565b9450613737565b8093505050505b919050565b61384d8363a9059cbb60e01b84846040516024016137eb929190615ba6565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613b58565b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6138c7838383613c1f565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561390a5761390581613c24565b613949565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614613948576139478382613c6d565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561398c5761398781613dda565b6139cb565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146139ca576139c98282613eab565b5b5b505050565b60006139f18473ffffffffffffffffffffffffffffffffffffffff16613f2a565b15613b4b578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613a1a612d5d565b8786866040518563ffffffff1660e01b8152600401613a3c9493929190615c24565b6020604051808303816000875af1925050508015613a7857506040513d601f19601f82011682018060405250810190613a759190615c85565b60015b613afb573d8060008114613aa8576040519150601f19603f3d011682016040523d82523d6000602084013e613aad565b606091505b50600081511415613af3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613aea90615b55565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613b50565b600190505b949350505050565b6000613bba826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16613f3d9092919063ffffffff16565b9050600081511115613c1a5780806020019051810190613bda91906152b9565b613c19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c1090615d24565b60405180910390fd5b5b505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613c7a8461166b565b613c849190615915565b9050600060076000848152602001908152602001600020549050818114613d69576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050613dee9190615915565b9050600060096000848152602001908152602001600020549050600060088381548110613e1e57613e1d614e56565b5b906000526020600020015490508060088381548110613e4057613e3f614e56565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613e8f57613e8e615d44565b5b6001900381819060005260206000200160009055905550505050565b6000613eb68361166b565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b6060613f4c8484600085613f55565b90509392505050565b606082471015613f9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613f9190615de5565b60405180910390fd5b613fa385613f2a565b613fe2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613fd990615e51565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161400b9190615ead565b60006040518083038185875af1925050503d8060008114614048576040519150601f19603f3d011682016040523d82523d6000602084013e61404d565b606091505b509150915061405d828286614069565b92505050949350505050565b60608315614079578290506140c9565b60008351111561408c5782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016140c09190614238565b60405180910390fd5b9392505050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b614119816140e4565b811461412457600080fd5b50565b60008135905061413681614110565b92915050565b600060208284031215614152576141516140da565b5b600061416084828501614127565b91505092915050565b60008115159050919050565b61417e81614169565b82525050565b60006020820190506141996000830184614175565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156141d95780820151818401526020810190506141be565b838111156141e8576000848401525b50505050565b6000601f19601f8301169050919050565b600061420a8261419f565b61421481856141aa565b93506142248185602086016141bb565b61422d816141ee565b840191505092915050565b6000602082019050818103600083015261425281846141ff565b905092915050565b6000819050919050565b61426d8161425a565b811461427857600080fd5b50565b60008135905061428a81614264565b92915050565b6000602082840312156142a6576142a56140da565b5b60006142b48482850161427b565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006142e8826142bd565b9050919050565b6142f8816142dd565b82525050565b600060208201905061431360008301846142ef565b92915050565b614322816142dd565b811461432d57600080fd5b50565b60008135905061433f81614319565b92915050565b6000806040838503121561435c5761435b6140da565b5b600061436a85828601614330565b925050602061437b8582860161427b565b9150509250929050565b61438e8161425a565b82525050565b60006020820190506143a96000830184614385565b92915050565b6000806000606084860312156143c8576143c76140da565b5b60006143d686828701614330565b93505060206143e786828701614330565b92505060406143f88682870161427b565b9150509250925092565b600060208284031215614418576144176140da565b5b600061442684828501614330565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6144648161425a565b82525050565b6000614476838361445b565b60208301905092915050565b6000602082019050919050565b600061449a8261442f565b6144a4818561443a565b93506144af8361444b565b8060005b838110156144e05781516144c7888261446a565b97506144d283614482565b9250506001810190506144b3565b5085935050505092915050565b60006020820190508181036000830152614507818461448f565b905092915050565b60008060408385031215614526576145256140da565b5b60006145348582860161427b565b925050602061454585828601614330565b9150509250929050565b61455881614169565b811461456357600080fd5b50565b6000813590506145758161454f565b92915050565b60008060408385031215614592576145916140da565b5b60006145a085828601614330565b92505060206145b185828601614566565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6145fd826141ee565b810181811067ffffffffffffffff8211171561461c5761461b6145c5565b5b80604052505050565b600061462f6140d0565b905061463b82826145f4565b919050565b600067ffffffffffffffff82111561465b5761465a6145c5565b5b614664826141ee565b9050602081019050919050565b82818337600083830152505050565b600061469361468e84614640565b614625565b9050828152602081018484840111156146af576146ae6145c0565b5b6146ba848285614671565b509392505050565b600082601f8301126146d7576146d66145bb565b5b81356146e7848260208601614680565b91505092915050565b6000806000806080858703121561470a576147096140da565b5b600061471887828801614330565b945050602061472987828801614330565b935050604061473a8782880161427b565b925050606085013567ffffffffffffffff81111561475b5761475a6140df565b5b614767878288016146c2565b91505092959194509250565b6000806040838503121561478a576147896140da565b5b60006147988582860161427b565b92505060206147a98582860161427b565b9150509250929050565b6000819050919050565b60006147d86147d36147ce846142bd565b6147b3565b6142bd565b9050919050565b60006147ea826147bd565b9050919050565b60006147fc826147df565b9050919050565b61480c816147f1565b82525050565b60006020820190506148276000830184614803565b92915050565b60008060408385031215614844576148436140da565b5b600061485285828601614330565b925050602061486385828601614330565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806148b457607f821691505b602082108114156148c8576148c761486d565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b600061492a602c836141aa565b9150614935826148ce565b604082019050919050565b600060208201905081810360008301526149598161491d565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006149bc6021836141aa565b91506149c782614960565b604082019050919050565b600060208201905081810360008301526149eb816149af565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000614a4e6038836141aa565b9150614a59826149f2565b604082019050919050565b60006020820190508181036000830152614a7d81614a41565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000614ae06031836141aa565b9150614aeb82614a84565b604082019050919050565b60006020820190508181036000830152614b0f81614ad3565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000614b72602b836141aa565b9150614b7d82614b16565b604082019050919050565b60006020820190508181036000830152614ba181614b65565b9050919050565b7f4e6f204e465420666f7220746869732061646472657373000000000000000000600082015250565b6000614bde6017836141aa565b9150614be982614ba8565b602082019050919050565b60006020820190508181036000830152614c0d81614bd1565b9050919050565b7f4e6f7420746865206f776e6572206f662074686973204e465400000000000000600082015250565b6000614c4a6019836141aa565b9150614c5582614c14565b602082019050919050565b60006020820190508181036000830152614c7981614c3d565b9050919050565b7f4e46543a20496e76616c69642076616c75652e00000000000000000000000000600082015250565b6000614cb66013836141aa565b9150614cc182614c80565b602082019050919050565b60006020820190508181036000830152614ce581614ca9565b9050919050565b7f57686f2061726520796f753f0000000000000000000000000000000000000000600082015250565b6000614d22600c836141aa565b9150614d2d82614cec565b602082019050919050565b60006020820190508181036000830152614d5181614d15565b9050919050565b7f496e76616c69642077616c6c6574000000000000000000000000000000000000600082015250565b6000614d8e600e836141aa565b9150614d9982614d58565b602082019050919050565b60006020820190508181036000830152614dbd81614d81565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000614e20602c836141aa565b9150614e2b82614dc4565b604082019050919050565b60006020820190508181036000830152614e4f81614e13565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4d696e74696e6720506861736520456e64656400000000000000000000000000600082015250565b6000614ebb6013836141aa565b9150614ec682614e85565b602082019050919050565b60006020820190508181036000830152614eea81614eae565b9050919050565b7f4e46543a20496e76616c696420616d6f756e7420746f206d696e742e00000000600082015250565b6000614f27601c836141aa565b9150614f3282614ef1565b602082019050919050565b60006020820190508181036000830152614f5681614f1a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614f978261425a565b9150614fa28361425a565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614fdb57614fda614f5d565b5b828202905092915050565b6000614ff18261425a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561502457615023614f5d565b5b600182019050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b600061508b6029836141aa565b91506150968261502f565b604082019050919050565b600060208201905081810360008301526150ba8161507e565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006150f76020836141aa565b9150615102826150c1565b602082019050919050565b60006020820190508181036000830152615126816150ea565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000615189602a836141aa565b91506151948261512d565b604082019050919050565b600060208201905081810360008301526151b88161517c565b9050919050565b6000815190506151ce81614264565b92915050565b6000602082840312156151ea576151e96140da565b5b60006151f8848285016151bf565b91505092915050565b7f496e73756666696369656e7420746f6b656e2062616c616e63652e0000000000600082015250565b6000615237601b836141aa565b915061524282615201565b602082019050919050565b600060208201905081810360008301526152668161522a565b9050919050565b600060608201905061528260008301866142ef565b61528f60208301856142ef565b61529c6040830184614385565b949350505050565b6000815190506152b38161454f565b92915050565b6000602082840312156152cf576152ce6140da565b5b60006152dd848285016152a4565b91505092915050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000615342602f836141aa565b915061534d826152e6565b604082019050919050565b6000602082019050818103600083015261537181615335565b9050919050565b600081905092915050565b600061538e8261419f565b6153988185615378565b93506153a88185602086016141bb565b80840191505092915050565b60006153c08285615383565b91506153cc8284615383565b91508190509392505050565b6000815190506153e781614319565b92915050565b600060208284031215615403576154026140da565b5b6000615411848285016153d8565b91505092915050565b60006dffffffffffffffffffffffffffff82169050919050565b61543d8161541a565b811461544857600080fd5b50565b60008151905061545a81615434565b92915050565b600063ffffffff82169050919050565b61547981615460565b811461548457600080fd5b50565b60008151905061549681615470565b92915050565b6000806000606084860312156154b5576154b46140da565b5b60006154c38682870161544b565b93505060206154d48682870161544b565b92505060406154e586828701615487565b9150509250925092565b60008160011c9050919050565b6000808291508390505b60018511156155465780860481111561552257615521614f5d565b5b60018516156155315780820291505b808102905061553f856154ef565b9450615506565b94509492505050565b60008261555f576001905061561b565b8161556d576000905061561b565b8160018114615583576002811461558d576155bc565b600191505061561b565b60ff84111561559f5761559e614f5d565b5b8360020a9150848211156155b6576155b5614f5d565b5b5061561b565b5060208310610133831016604e8410600b84101617156155f15782820a9050838111156155ec576155eb614f5d565b5b61561b565b6155fe84848460016154fc565b9250905081840481111561561557615614614f5d565b5b81810290505b9392505050565b600061562d8261425a565b91506156388361425a565b92506156657fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848461554f565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006156a78261425a565b91506156b28361425a565b9250826156c2576156c161566d565b5b828204905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006157296026836141aa565b9150615734826156cd565b604082019050919050565b600060208201905081810360008301526157588161571c565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b60006157bb602c836141aa565b91506157c68261575f565b604082019050919050565b600060208201905081810360008301526157ea816157ae565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b600061584d6029836141aa565b9150615858826157f1565b604082019050919050565b6000602082019050818103600083015261587c81615840565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006158df6024836141aa565b91506158ea82615883565b604082019050919050565b6000602082019050818103600083015261590e816158d2565b9050919050565b60006159208261425a565b915061592b8361425a565b92508282101561593e5761593d614f5d565b5b828203905092915050565b60006159548261425a565b915061595f8361425a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561599457615993614f5d565b5b828201905092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b60006159d56020836141aa565b91506159e08261599f565b602082019050919050565b60006020820190508181036000830152615a04816159c8565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000615a41601c836141aa565b9150615a4c82615a0b565b602082019050919050565b60006020820190508181036000830152615a7081615a34565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000615aad6019836141aa565b9150615ab882615a77565b602082019050919050565b60006020820190508181036000830152615adc81615aa0565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000615b3f6032836141aa565b9150615b4a82615ae3565b604082019050919050565b60006020820190508181036000830152615b6e81615b32565b9050919050565b6000615b808261425a565b9150615b8b8361425a565b925082615b9b57615b9a61566d565b5b828206905092915050565b6000604082019050615bbb60008301856142ef565b615bc86020830184614385565b9392505050565b600081519050919050565b600082825260208201905092915050565b6000615bf682615bcf565b615c008185615bda565b9350615c108185602086016141bb565b615c19816141ee565b840191505092915050565b6000608082019050615c3960008301876142ef565b615c4660208301866142ef565b615c536040830185614385565b8181036060830152615c658184615beb565b905095945050505050565b600081519050615c7f81614110565b92915050565b600060208284031215615c9b57615c9a6140da565b5b6000615ca984828501615c70565b91505092915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b6000615d0e602a836141aa565b9150615d1982615cb2565b604082019050919050565b60006020820190508181036000830152615d3d81615d01565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b6000615dcf6026836141aa565b9150615dda82615d73565b604082019050919050565b60006020820190508181036000830152615dfe81615dc2565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000615e3b601d836141aa565b9150615e4682615e05565b602082019050919050565b60006020820190508181036000830152615e6a81615e2e565b9050919050565b600081905092915050565b6000615e8782615bcf565b615e918185615e71565b9350615ea18185602086016141bb565b80840191505092915050565b6000615eb98284615e7c565b91508190509291505056fea26469706673582212205f028839e793623f1d1fe62ffe7361e96b474751292bc9b53356d7c4ecd3b24864736f6c634300080a0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000bc2a91790f3f1bde4b0f8426e9a43c040126c639000000000000000000000000eef37d7bd4ae03fd8ee1c44491987e422b53ed25
-----Decoded View---------------
Arg [0] : _walletA (address): 0xbc2a91790F3f1BDe4b0F8426e9a43C040126c639
Arg [1] : _kryptoPetTokenContract (address): 0xEEf37d7bD4Ae03fD8ee1C44491987e422b53Ed25
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000bc2a91790f3f1bde4b0f8426e9a43c040126c639
Arg [1] : 000000000000000000000000eef37d7bd4ae03fd8ee1c44491987e422b53ed25
Deployed Bytecode Sourcemap
59774:8511:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35702:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22131:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23690:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23213:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36342:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24440:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36010:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64305:305;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65280:196;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24850:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66544:143;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60120:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67966:203;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36532:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60312:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60263;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62259:624;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66190:143;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21825:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66923:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66341:195;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21555:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45022:103;;;;;;;;;;;;;:::i;:::-;;67149:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60996:540;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67265:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63426:869;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61544:705;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44371:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65637:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65987:195;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22300:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67037;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23983:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66807:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60211:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25106:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60411:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67796:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60361:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22475:334;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60163:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65484:145;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64618:654;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67379:409;;;;;;;;;;;;;:::i;:::-;;60461:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62891:525;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24209:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65838:141;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45280:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68177:103;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66695:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35702:224;35804:4;35843:35;35828:50;;;:11;:50;;;;:90;;;;35882:36;35906:11;35882:23;:36::i;:::-;35828:90;35821:97;;35702:224;;;:::o;22131:100::-;22185:13;22218:5;22211:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22131:100;:::o;23690:221::-;23766:7;23794:16;23802:7;23794;:16::i;:::-;23786:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23879:15;:24;23895:7;23879:24;;;;;;;;;;;;;;;;;;;;;23872:31;;23690:221;;;:::o;23213:411::-;23294:13;23310:23;23325:7;23310:14;:23::i;:::-;23294:39;;23358:5;23352:11;;:2;:11;;;;23344:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;23452:5;23436:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;23461:37;23478:5;23485:12;:10;:12::i;:::-;23461:16;:37::i;:::-;23436:62;23414:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;23595:21;23604:2;23608:7;23595:8;:21::i;:::-;23283:341;23213:411;;:::o;36342:113::-;36403:7;36430:10;:17;;;;36423:24;;36342:113;:::o;24440:339::-;24635:41;24654:12;:10;:12::i;:::-;24668:7;24635:18;:41::i;:::-;24627:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24743:28;24753:4;24759:2;24763:7;24743:9;:28::i;:::-;24440:339;;;:::o;36010:256::-;36107:7;36143:23;36160:5;36143:16;:23::i;:::-;36135:5;:31;36127:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;36232:12;:19;36245:5;36232:19;;;;;;;;;;;;;;;:26;36252:5;36232:26;;;;;;;;;;;;36225:33;;36010:256;;;;:::o;64305:305::-;64372:7;64393:18;64414:21;64424:10;64414:9;:21::i;:::-;64393:42;;64467:1;64454:10;:14;64446:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;64534:10;64515:29;;:15;64523:6;64515:7;:15::i;:::-;:29;;;64507:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;64594:6;64587:13;;;64305:305;;;:::o;65280:196::-;65347:7;65385:14;;65373:9;:26;65365:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;65442:26;65461:6;65442:18;:26::i;:::-;65435:33;;65280:196;;;:::o;24850:185::-;24988:39;25005:4;25011:2;25015:7;24988:39;;;;;;;;;;;;:16;:39::i;:::-;24850:185;;;:::o;66544:143::-;66611:7;66637:42;66657:6;66665:13;;66637:19;:42::i;:::-;66630:49;;66544:143;;;:::o;60120:34::-;;;;:::o;67966:203::-;68045:7;;;;;;;;;;;68031:21;;:10;:21;;;68022:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;68109:3;68089:24;;:8;:24;;;;68080:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;68153:8;68143:7;;:18;;;;;;;;;;;;;;;;;;67966:203;:::o;36532:233::-;36607:7;36643:30;:28;:30::i;:::-;36635:5;:38;36627:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;36740:10;36751:5;36740:17;;;;;;;;:::i;:::-;;;;;;;;;;36733:24;;36532:233;;;:::o;60312:42::-;;;;:::o;60263:::-;;;;:::o;62259:624::-;62326:23;62393:11;;62371:19;:9;:17;:19::i;:::-;:33;62363:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;62455:1;62447:7;:9;62439:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;62527:12;;62519:7;:20;;;;:::i;:::-;62508:9;:31;62500:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;62577:29;62622:9;62617:229;62641:7;62637:1;:11;62617:229;;;62670:21;:9;:19;:21::i;:::-;62706:15;62724:19;:9;:17;:19::i;:::-;62706:37;;62758:26;62764:10;62776:7;62758:5;:26::i;:::-;62823:10;62806:28;;;62814:7;62806:28;;;;;;:::i;:::-;;;;;;;;62655:191;62650:3;;;;;:::i;:::-;;;;62617:229;;;;62863:12;62856:19;;;62259:624;;;:::o;66190:143::-;66257:7;66283:42;66303:6;66311:13;;66283:19;:42::i;:::-;66276:49;;66190:143;;;:::o;21825:239::-;21897:7;21917:13;21933:7;:16;21941:7;21933:16;;;;;;;;;;;;;;;;;;;;;21917:32;;21985:1;21968:19;;:5;:19;;;;21960:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22051:5;22044:12;;;21825:239;;;:::o;66923:106::-;44602:12;:10;:12::i;:::-;44591:23;;:7;:5;:7::i;:::-;:23;;;44583:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67012:9:::1;66997:13;:24;;;;66923:106:::0;:::o;66341:195::-;66407:7;66446:13;;66434:9;:25;66426:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;66502:26;66521:6;66502:18;:26::i;:::-;66495:33;;66341:195;;;:::o;21555:208::-;21627:7;21672:1;21655:19;;:5;:19;;;;21647:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;21739:9;:16;21749:5;21739:16;;;;;;;;;;;;;;;;21732:23;;21555:208;;;:::o;45022:103::-;44602:12;:10;:12::i;:::-;44591:23;;:7;:5;:7::i;:::-;:23;;;44583:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45087:30:::1;45114:1;45087:18;:30::i;:::-;45022:103::o:0;67149:108::-;44602:12;:10;:12::i;:::-;44591:23;;:7;:5;:7::i;:::-;:23;;;44583:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67240:9:::1;67224:14;:25;;;;67149:108:::0;:::o;60996:540::-;61057:16;61087:18;61108:17;61118:6;61108:9;:17::i;:::-;61087:38;;61154:1;61140:10;:15;61136:393;;;61231:1;61217:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61210:23;;;;;61136:393;61266:23;61306:10;61292:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61266:51;;61332:13;61360:130;61384:10;61376:5;:18;61360:130;;;61440:34;61460:6;61468:5;61440:19;:34::i;:::-;61424:6;61431:5;61424:13;;;;;;;;:::i;:::-;;;;;;;:50;;;;;61396:7;;;;;:::i;:::-;;;;61360:130;;;61511:6;61504:13;;;;;60996:540;;;;:::o;67265:106::-;44602:12;:10;:12::i;:::-;44591:23;;:7;:5;:7::i;:::-;:23;;;44583:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67354:9:::1;67339:13;:24;;;;67265:106:::0;:::o;63426:869::-;63494:23;63561:11;;63539:19;:9;:17;:19::i;:::-;:33;63531:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;63623:1;63615:7;:9;63607:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;63670:23;63695:37;63719:12;;63711:7;:20;;;;:::i;:::-;63695:15;:37::i;:::-;63670:62;;63838:15;63792:22;;;;;;;;;;;:32;;;63825:10;63792:44;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:61;;63784:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;63896:22;;;;;;;;;;;:35;;;63932:10;63952:4;63960:15;63896:80;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;63989:29;64034:9;64029:229;64053:7;64049:1;:11;64029:229;;;64082:21;:9;:19;:21::i;:::-;64118:15;64136:19;:9;:17;:19::i;:::-;64118:37;;64170:26;64176:10;64188:7;64170:5;:26::i;:::-;64235:10;64218:28;;;64226:7;64218:28;;;;;;:::i;:::-;;;;;;;;64067:191;64062:3;;;;;:::i;:::-;;;;64029:229;;;;64275:12;64268:19;;;;63426:869;;;:::o;61544:705::-;61628:23;61695:11;;61673:19;:9;:17;:19::i;:::-;:33;61665:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;61757:1;61749:7;:9;61741:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;61824:7;:5;:7::i;:::-;61810:21;;:10;:21;;;61802:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;61939:29;61984:9;61979:233;62003:7;61999:1;:11;61979:233;;;62032:21;:9;:19;:21::i;:::-;62068:15;62086:19;:9;:17;:19::i;:::-;62068:37;;62120:28;62126:12;62140:7;62120:5;:28::i;:::-;62187:12;62170:30;;;62178:7;62170:30;;;;;;:::i;:::-;;;;;;;;62017:195;62012:3;;;;;:::i;:::-;;;;61979:233;;;;62229:12;62222:19;;;61544:705;;;;:::o;44371:87::-;44417:7;44444:6;;;;;;;;;;;44437:13;;44371:87;:::o;65637:193::-;65702:7;65741:12;;65729:9;:24;65721:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;65796:26;65815:6;65796:18;:26::i;:::-;65789:33;;65637:193;;;:::o;65987:195::-;66053:7;66092:13;;66080:9;:25;66072:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;66148:26;66167:6;66148:18;:26::i;:::-;66141:33;;65987:195;;;:::o;22300:104::-;22356:13;22389:7;22382:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22300:104;:::o;67037:::-;44602:12;:10;:12::i;:::-;44591:23;;:7;:5;:7::i;:::-;:23;;;44583:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67124:9:::1;67110:12;:23;;;;67037:104:::0;:::o;23983:155::-;24078:52;24097:12;:10;:12::i;:::-;24111:8;24121;24078:18;:52::i;:::-;23983:155;;:::o;66807:108::-;44602:12;:10;:12::i;:::-;44591:23;;:7;:5;:7::i;:::-;:23;;;44583:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;66898:9:::1;66882:14;:25;;;;66807:108:::0;:::o;60211:43::-;;;;:::o;25106:328::-;25281:41;25300:12;:10;:12::i;:::-;25314:7;25281:18;:41::i;:::-;25273:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25387:39;25401:4;25407:2;25411:7;25420:5;25387:13;:39::i;:::-;25106:328;;;;:::o;60411:41::-;;;;:::o;67796:162::-;44602:12;:10;:12::i;:::-;44591:23;;:7;:5;:7::i;:::-;:23;;;44583:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67926:23:::1;67894:22;;:56;;;;;;;;;;;;;;;;;;67796:162:::0;:::o;60361:43::-;;;;:::o;22475:334::-;22548:13;22582:16;22590:7;22582;:16::i;:::-;22574:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;22663:21;22687:10;:8;:10::i;:::-;22663:34;;22739:1;22721:7;22715:21;:25;:86;;;;;;;;;;;;;;;;;22767:7;22776:18;:7;:16;:18::i;:::-;22750:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;22715:86;22708:93;;;22475:334;;;:::o;60163:41::-;;;;:::o;65484:145::-;65552:7;65578:43;65598:6;65606:14;;65578:19;:43::i;:::-;65571:50;;65484:145;;;:::o;64618:654::-;64703:7;64724:18;64745:21;64755:10;64745:9;:21::i;:::-;64724:42;;64864:1;64851:10;:14;64843:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;64931:10;64912:29;;:15;64920:6;64912:7;:15::i;:::-;:29;;;64904:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;64984:23;65009:24;65025:7;65009:15;:24::i;:::-;64984:49;;65098:15;65052:22;;;;;;;;;;;:32;;;65085:10;65052:44;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:61;;65044:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;65156:22;;;;;;;;;;;:35;;;65192:10;65212:4;65220:15;65156:80;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;65256:6;65249:13;;;;64618:654;;;;:::o;67379:409::-;59996:7;;;;;;;;;;;59982:21;;:10;:21;;;:46;;;;60021:7;:5;:7::i;:::-;60007:21;;:10;:21;;;59982:46;59974:55;;;;;;67459:1:::1;67437:21;:23;67434:148;;;67476:18;67497:21;67476:42;;67541:7;;;;;;;;;;;67533:25;;:37;67559:10;67533:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;67461:121;67434:148;67594:20;67617:22;;;;;;;;;;;:32;;;67658:4;67617:47;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;67594:70;;67692:1;67679:12;:14;67675:104;;;67709:58;67745:7;;;;;;;;;;;67754:12;67709:22;;;;;;;;;;;:35;;;;:58;;;;;:::i;:::-;67675:104;67421:367;67379:409::o:0;60461:36::-;;;;;;;;;;;;;:::o;62891:525::-;62953:7;62974:19;63011:42;62974:80;;63065:13;63088:4;:11;;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;63065:37;;63114:9;63125;63139:4;:16;;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;63113:44;;;;;;;;;63191:9;63213:6;:15;;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;63209:2;:21;;;;:::i;:::-;63203:4;:28;;;;:::i;:::-;63191:40;;63242:13;63272:4;63266;63260:5;:10;;;;:::i;:::-;63259:17;;;;:::i;:::-;63242:35;;63331:17;63370:8;63363:5;63352:10;:16;;;;:::i;:::-;63351:27;;;;:::i;:::-;63331:47;;63396:12;63389:19;;;;;;;;;62891:525;;;:::o;24209:164::-;24306:4;24330:18;:25;24349:5;24330:25;;;;;;;;;;;;;;;:35;24356:8;24330:35;;;;;;;;;;;;;;;;;;;;;;;;;24323:42;;24209:164;;;;:::o;65838:141::-;65904:7;65930:41;65950:6;65958:12;;65930:19;:41::i;:::-;65923:48;;65838:141;;;:::o;45280:201::-;44602:12;:10;:12::i;:::-;44591:23;;:7;:5;:7::i;:::-;:23;;;44583:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45389:1:::1;45369:22;;:8;:22;;;;45361:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;45445:28;45464:8;45445:18;:28::i;:::-;45280:201:::0;:::o;68177:103::-;44602:12;:10;:12::i;:::-;44591:23;;:7;:5;:7::i;:::-;:23;;;44583:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;68262:10:::1;68248:11;:24;;;;68177:103:::0;:::o;66695:104::-;44602:12;:10;:12::i;:::-;44591:23;;:7;:5;:7::i;:::-;:23;;;44583:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;66782:9:::1;66768:12;:23;;;;66695:104:::0;:::o;21186:305::-;21288:4;21340:25;21325:40;;;:11;:40;;;;:105;;;;21397:33;21382:48;;;:11;:48;;;;21325:105;:158;;;;21447:36;21471:11;21447:23;:36::i;:::-;21325:158;21305:178;;21186:305;;;:::o;26944:127::-;27009:4;27061:1;27033:30;;:7;:16;27041:7;27033:16;;;;;;;;;;;;;;;;;;;;;:30;;;;27026:37;;26944:127;;;:::o;16437:98::-;16490:7;16517:10;16510:17;;16437:98;:::o;30926:174::-;31028:2;31001:15;:24;31017:7;31001:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;31084:7;31080:2;31046:46;;31055:23;31070:7;31055:14;:23::i;:::-;31046:46;;;;;;;;;;;;30926:174;;:::o;27238:348::-;27331:4;27356:16;27364:7;27356;:16::i;:::-;27348:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27432:13;27448:23;27463:7;27448:14;:23::i;:::-;27432:39;;27501:5;27490:16;;:7;:16;;;:51;;;;27534:7;27510:31;;:20;27522:7;27510:11;:20::i;:::-;:31;;;27490:51;:87;;;;27545:32;27562:5;27569:7;27545:16;:32::i;:::-;27490:87;27482:96;;;27238:348;;;;:::o;30230:578::-;30389:4;30362:31;;:23;30377:7;30362:14;:23::i;:::-;:31;;;30354:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;30472:1;30458:16;;:2;:16;;;;30450:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;30528:39;30549:4;30555:2;30559:7;30528:20;:39::i;:::-;30632:29;30649:1;30653:7;30632:8;:29::i;:::-;30693:1;30674:9;:15;30684:4;30674:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;30722:1;30705:9;:13;30715:2;30705:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;30753:2;30734:7;:16;30742:7;30734:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;30792:7;30788:2;30773:27;;30782:4;30773:27;;;;;;;;;;;;30230:578;;;:::o;42720:114::-;42785:7;42812;:14;;;42805:21;;42720:114;;;:::o;42842:127::-;42949:1;42931:7;:14;;;:19;;;;;;;;;;;42842:127;:::o;28922:382::-;29016:1;29002:16;;:2;:16;;;;28994:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;29075:16;29083:7;29075;:16::i;:::-;29074:17;29066:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;29137:45;29166:1;29170:2;29174:7;29137:20;:45::i;:::-;29212:1;29195:9;:13;29205:2;29195:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29243:2;29224:7;:16;29232:7;29224:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29288:7;29284:2;29263:33;;29280:1;29263:33;;;;;;;;;;;;28922:382;;:::o;45641:191::-;45715:16;45734:6;;;;;;;;;;;45715:25;;45760:8;45751:6;;:17;;;;;;;;;;;;;;;;;;45815:8;45784:40;;45805:8;45784:40;;;;;;;;;;;;45704:128;45641:191;:::o;31242:315::-;31397:8;31388:17;;:5;:17;;;;31380:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;31484:8;31446:18;:25;31465:5;31446:25;;;;;;;;;;;;;;;:35;31472:8;31446:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;31530:8;31508:41;;31523:5;31508:41;;;31540:8;31508:41;;;;;;:::i;:::-;;;;;;;;31242:315;;;:::o;26316:::-;26473:28;26483:4;26489:2;26493:7;26473:9;:28::i;:::-;26520:48;26543:4;26549:2;26553:7;26562:5;26520:22;:48::i;:::-;26512:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;26316:315;;;;:::o;60874:114::-;60934:13;60967;60960:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60874:114;:::o;17014:723::-;17070:13;17300:1;17291:5;:10;17287:53;;;17318:10;;;;;;;;;;;;;;;;;;;;;17287:53;17350:12;17365:5;17350:20;;17381:14;17406:78;17421:1;17413:4;:9;17406:78;;17439:8;;;;;:::i;:::-;;;;17470:2;17462:10;;;;;:::i;:::-;;;17406:78;;;17494:19;17526:6;17516:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17494:39;;17544:154;17560:1;17551:5;:10;17544:154;;17588:1;17578:11;;;;;:::i;:::-;;;17655:2;17647:5;:10;;;;:::i;:::-;17634:2;:24;;;;:::i;:::-;17621:39;;17604:6;17611;17604:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;17684:2;17675:11;;;;;:::i;:::-;;;17544:154;;;17722:6;17708:21;;;;;17014:723;;;;:::o;56378:177::-;56461:86;56481:5;56511:23;;;56536:2;56540:5;56488:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56461:19;:86::i;:::-;56378:177;;;:::o;19634:157::-;19719:4;19758:25;19743:40;;;:11;:40;;;;19736:47;;19634:157;;;:::o;37378:589::-;37522:45;37549:4;37555:2;37559:7;37522:26;:45::i;:::-;37600:1;37584:18;;:4;:18;;;37580:187;;;37619:40;37651:7;37619:31;:40::i;:::-;37580:187;;;37689:2;37681:10;;:4;:10;;;37677:90;;37708:47;37741:4;37747:7;37708:32;:47::i;:::-;37677:90;37580:187;37795:1;37781:16;;:2;:16;;;37777:183;;;37814:45;37851:7;37814:36;:45::i;:::-;37777:183;;;37887:4;37881:10;;:2;:10;;;37877:83;;37908:40;37936:2;37940:7;37908:27;:40::i;:::-;37877:83;37777:183;37378:589;;;:::o;32122:799::-;32277:4;32298:15;:2;:13;;;:15::i;:::-;32294:620;;;32350:2;32334:36;;;32371:12;:10;:12::i;:::-;32385:4;32391:7;32400:5;32334:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;32330:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32593:1;32576:6;:13;:18;32572:272;;;32619:60;;;;;;;;;;:::i;:::-;;;;;;;;32572:272;32794:6;32788:13;32779:6;32775:2;32771:15;32764:38;32330:529;32467:41;;;32457:51;;;:6;:51;;;;32450:58;;;;;32294:620;32898:4;32891:11;;32122:799;;;;;;;:::o;58689:761::-;59113:23;59139:69;59167:4;59139:69;;;;;;;;;;;;;;;;;59147:5;59139:27;;;;:69;;;;;:::i;:::-;59113:95;;59243:1;59223:10;:17;:21;59219:224;;;59365:10;59354:30;;;;;;;;;;;;:::i;:::-;59346:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;59219:224;58759:691;58689:761;;:::o;33493:126::-;;;;:::o;38690:164::-;38794:10;:17;;;;38767:15;:24;38783:7;38767:24;;;;;;;;;;;:44;;;;38822:10;38838:7;38822:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38690:164;:::o;39481:988::-;39747:22;39797:1;39772:22;39789:4;39772:16;:22::i;:::-;:26;;;;:::i;:::-;39747:51;;39809:18;39830:17;:26;39848:7;39830:26;;;;;;;;;;;;39809:47;;39977:14;39963:10;:28;39959:328;;40008:19;40030:12;:18;40043:4;40030:18;;;;;;;;;;;;;;;:34;40049:14;40030:34;;;;;;;;;;;;40008:56;;40114:11;40081:12;:18;40094:4;40081:18;;;;;;;;;;;;;;;:30;40100:10;40081:30;;;;;;;;;;;:44;;;;40231:10;40198:17;:30;40216:11;40198:30;;;;;;;;;;;:43;;;;39993:294;39959:328;40383:17;:26;40401:7;40383:26;;;;;;;;;;;40376:33;;;40427:12;:18;40440:4;40427:18;;;;;;;;;;;;;;;:34;40446:14;40427:34;;;;;;;;;;;40420:41;;;39562:907;;39481:988;;:::o;40764:1079::-;41017:22;41062:1;41042:10;:17;;;;:21;;;;:::i;:::-;41017:46;;41074:18;41095:15;:24;41111:7;41095:24;;;;;;;;;;;;41074:45;;41446:19;41468:10;41479:14;41468:26;;;;;;;;:::i;:::-;;;;;;;;;;41446:48;;41532:11;41507:10;41518;41507:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;41643:10;41612:15;:28;41628:11;41612:28;;;;;;;;;;;:41;;;;41784:15;:24;41800:7;41784:24;;;;;;;;;;;41777:31;;;41819:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;40835:1008;;;40764:1079;:::o;38268:221::-;38353:14;38370:20;38387:2;38370:16;:20::i;:::-;38353:37;;38428:7;38401:12;:16;38414:2;38401:16;;;;;;;;;;;;;;;:24;38418:6;38401:24;;;;;;;;;;;:34;;;;38475:6;38446:17;:26;38464:7;38446:26;;;;;;;;;;;:35;;;;38342:147;38268:221;;:::o;8429:387::-;8489:4;8697:12;8764:7;8752:20;8744:28;;8807:1;8800:4;:8;8793:15;;;8429:387;;;:::o;11235:229::-;11372:12;11404:52;11426:6;11434:4;11440:1;11443:12;11404:21;:52::i;:::-;11397:59;;11235:229;;;;;:::o;12355:510::-;12525:12;12583:5;12558:21;:30;;12550:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;12650:18;12661:6;12650:10;:18::i;:::-;12642:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;12716:12;12730:23;12757:6;:11;;12776:5;12783:4;12757:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12715:73;;;;12806:51;12823:7;12832:10;12844:12;12806:16;:51::i;:::-;12799:58;;;;12355:510;;;;;;:::o;15041:712::-;15191:12;15220:7;15216:530;;;15251:10;15244:17;;;;15216:530;15385:1;15365:10;:17;:21;15361:374;;;15563:10;15557:17;15624:15;15611:10;15607:2;15603:19;15596:44;15361:374;15706:12;15699:20;;;;;;;;;;;:::i;:::-;;;;;;;;15041:712;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:619::-;5367:6;5375;5383;5432:2;5420:9;5411:7;5407:23;5403:32;5400:119;;;5438:79;;:::i;:::-;5400:119;5558:1;5583:53;5628:7;5619:6;5608:9;5604:22;5583:53;:::i;:::-;5573:63;;5529:117;5685:2;5711:53;5756:7;5747:6;5736:9;5732:22;5711:53;:::i;:::-;5701:63;;5656:118;5813:2;5839:53;5884:7;5875:6;5864:9;5860:22;5839:53;:::i;:::-;5829:63;;5784:118;5290:619;;;;;:::o;5915:329::-;5974:6;6023:2;6011:9;6002:7;5998:23;5994:32;5991:119;;;6029:79;;:::i;:::-;5991:119;6149:1;6174:53;6219:7;6210:6;6199:9;6195:22;6174:53;:::i;:::-;6164:63;;6120:117;5915:329;;;;:::o;6250:114::-;6317:6;6351:5;6345:12;6335:22;;6250:114;;;:::o;6370:184::-;6469:11;6503:6;6498:3;6491:19;6543:4;6538:3;6534:14;6519:29;;6370:184;;;;:::o;6560:132::-;6627:4;6650:3;6642:11;;6680:4;6675:3;6671:14;6663:22;;6560:132;;;:::o;6698:108::-;6775:24;6793:5;6775:24;:::i;:::-;6770:3;6763:37;6698:108;;:::o;6812:179::-;6881:10;6902:46;6944:3;6936:6;6902:46;:::i;:::-;6980:4;6975:3;6971:14;6957:28;;6812:179;;;;:::o;6997:113::-;7067:4;7099;7094:3;7090:14;7082:22;;6997:113;;;:::o;7146:732::-;7265:3;7294:54;7342:5;7294:54;:::i;:::-;7364:86;7443:6;7438:3;7364:86;:::i;:::-;7357:93;;7474:56;7524:5;7474:56;:::i;:::-;7553:7;7584:1;7569:284;7594:6;7591:1;7588:13;7569:284;;;7670:6;7664:13;7697:63;7756:3;7741:13;7697:63;:::i;:::-;7690:70;;7783:60;7836:6;7783:60;:::i;:::-;7773:70;;7629:224;7616:1;7613;7609:9;7604:14;;7569:284;;;7573:14;7869:3;7862:10;;7270:608;;;7146:732;;;;:::o;7884:373::-;8027:4;8065:2;8054:9;8050:18;8042:26;;8114:9;8108:4;8104:20;8100:1;8089:9;8085:17;8078:47;8142:108;8245:4;8236:6;8142:108;:::i;:::-;8134:116;;7884:373;;;;:::o;8263:474::-;8331:6;8339;8388:2;8376:9;8367:7;8363:23;8359:32;8356:119;;;8394:79;;:::i;:::-;8356:119;8514:1;8539:53;8584:7;8575:6;8564:9;8560:22;8539:53;:::i;:::-;8529:63;;8485:117;8641:2;8667:53;8712:7;8703:6;8692:9;8688:22;8667:53;:::i;:::-;8657:63;;8612:118;8263:474;;;;;:::o;8743:116::-;8813:21;8828:5;8813:21;:::i;:::-;8806:5;8803:32;8793:60;;8849:1;8846;8839:12;8793:60;8743:116;:::o;8865:133::-;8908:5;8946:6;8933:20;8924:29;;8962:30;8986:5;8962:30;:::i;:::-;8865:133;;;;:::o;9004:468::-;9069:6;9077;9126:2;9114:9;9105:7;9101:23;9097:32;9094:119;;;9132:79;;:::i;:::-;9094:119;9252:1;9277:53;9322:7;9313:6;9302:9;9298:22;9277:53;:::i;:::-;9267:63;;9223:117;9379:2;9405:50;9447:7;9438:6;9427:9;9423:22;9405:50;:::i;:::-;9395:60;;9350:115;9004:468;;;;;:::o;9478:117::-;9587:1;9584;9577:12;9601:117;9710:1;9707;9700:12;9724:180;9772:77;9769:1;9762:88;9869:4;9866:1;9859:15;9893:4;9890:1;9883:15;9910:281;9993:27;10015:4;9993:27;:::i;:::-;9985:6;9981:40;10123:6;10111:10;10108:22;10087:18;10075:10;10072:34;10069:62;10066:88;;;10134:18;;:::i;:::-;10066:88;10174:10;10170:2;10163:22;9953:238;9910:281;;:::o;10197:129::-;10231:6;10258:20;;:::i;:::-;10248:30;;10287:33;10315:4;10307:6;10287:33;:::i;:::-;10197:129;;;:::o;10332:307::-;10393:4;10483:18;10475:6;10472:30;10469:56;;;10505:18;;:::i;:::-;10469:56;10543:29;10565:6;10543:29;:::i;:::-;10535:37;;10627:4;10621;10617:15;10609:23;;10332:307;;;:::o;10645:154::-;10729:6;10724:3;10719;10706:30;10791:1;10782:6;10777:3;10773:16;10766:27;10645:154;;;:::o;10805:410::-;10882:5;10907:65;10923:48;10964:6;10923:48;:::i;:::-;10907:65;:::i;:::-;10898:74;;10995:6;10988:5;10981:21;11033:4;11026:5;11022:16;11071:3;11062:6;11057:3;11053:16;11050:25;11047:112;;;11078:79;;:::i;:::-;11047:112;11168:41;11202:6;11197:3;11192;11168:41;:::i;:::-;10888:327;10805:410;;;;;:::o;11234:338::-;11289:5;11338:3;11331:4;11323:6;11319:17;11315:27;11305:122;;11346:79;;:::i;:::-;11305:122;11463:6;11450:20;11488:78;11562:3;11554:6;11547:4;11539:6;11535:17;11488:78;:::i;:::-;11479:87;;11295:277;11234:338;;;;:::o;11578:943::-;11673:6;11681;11689;11697;11746:3;11734:9;11725:7;11721:23;11717:33;11714:120;;;11753:79;;:::i;:::-;11714:120;11873:1;11898:53;11943:7;11934:6;11923:9;11919:22;11898:53;:::i;:::-;11888:63;;11844:117;12000:2;12026:53;12071:7;12062:6;12051:9;12047:22;12026:53;:::i;:::-;12016:63;;11971:118;12128:2;12154:53;12199:7;12190:6;12179:9;12175:22;12154:53;:::i;:::-;12144:63;;12099:118;12284:2;12273:9;12269:18;12256:32;12315:18;12307:6;12304:30;12301:117;;;12337:79;;:::i;:::-;12301:117;12442:62;12496:7;12487:6;12476:9;12472:22;12442:62;:::i;:::-;12432:72;;12227:287;11578:943;;;;;;;:::o;12527:474::-;12595:6;12603;12652:2;12640:9;12631:7;12627:23;12623:32;12620:119;;;12658:79;;:::i;:::-;12620:119;12778:1;12803:53;12848:7;12839:6;12828:9;12824:22;12803:53;:::i;:::-;12793:63;;12749:117;12905:2;12931:53;12976:7;12967:6;12956:9;12952:22;12931:53;:::i;:::-;12921:63;;12876:118;12527:474;;;;;:::o;13007:60::-;13035:3;13056:5;13049:12;;13007:60;;;:::o;13073:142::-;13123:9;13156:53;13174:34;13183:24;13201:5;13183:24;:::i;:::-;13174:34;:::i;:::-;13156:53;:::i;:::-;13143:66;;13073:142;;;:::o;13221:126::-;13271:9;13304:37;13335:5;13304:37;:::i;:::-;13291:50;;13221:126;;;:::o;13353:141::-;13418:9;13451:37;13482:5;13451:37;:::i;:::-;13438:50;;13353:141;;;:::o;13500:161::-;13602:52;13648:5;13602:52;:::i;:::-;13597:3;13590:65;13500:161;;:::o;13667:252::-;13775:4;13813:2;13802:9;13798:18;13790:26;;13826:86;13909:1;13898:9;13894:17;13885:6;13826:86;:::i;:::-;13667:252;;;;:::o;13925:474::-;13993:6;14001;14050:2;14038:9;14029:7;14025:23;14021:32;14018:119;;;14056:79;;:::i;:::-;14018:119;14176:1;14201:53;14246:7;14237:6;14226:9;14222:22;14201:53;:::i;:::-;14191:63;;14147:117;14303:2;14329:53;14374:7;14365:6;14354:9;14350:22;14329:53;:::i;:::-;14319:63;;14274:118;13925:474;;;;;:::o;14405:180::-;14453:77;14450:1;14443:88;14550:4;14547:1;14540:15;14574:4;14571:1;14564:15;14591:320;14635:6;14672:1;14666:4;14662:12;14652:22;;14719:1;14713:4;14709:12;14740:18;14730:81;;14796:4;14788:6;14784:17;14774:27;;14730:81;14858:2;14850:6;14847:14;14827:18;14824:38;14821:84;;;14877:18;;:::i;:::-;14821:84;14642:269;14591:320;;;:::o;14917:231::-;15057:34;15053:1;15045:6;15041:14;15034:58;15126:14;15121:2;15113:6;15109:15;15102:39;14917:231;:::o;15154:366::-;15296:3;15317:67;15381:2;15376:3;15317:67;:::i;:::-;15310:74;;15393:93;15482:3;15393:93;:::i;:::-;15511:2;15506:3;15502:12;15495:19;;15154:366;;;:::o;15526:419::-;15692:4;15730:2;15719:9;15715:18;15707:26;;15779:9;15773:4;15769:20;15765:1;15754:9;15750:17;15743:47;15807:131;15933:4;15807:131;:::i;:::-;15799:139;;15526:419;;;:::o;15951:220::-;16091:34;16087:1;16079:6;16075:14;16068:58;16160:3;16155:2;16147:6;16143:15;16136:28;15951:220;:::o;16177:366::-;16319:3;16340:67;16404:2;16399:3;16340:67;:::i;:::-;16333:74;;16416:93;16505:3;16416:93;:::i;:::-;16534:2;16529:3;16525:12;16518:19;;16177:366;;;:::o;16549:419::-;16715:4;16753:2;16742:9;16738:18;16730:26;;16802:9;16796:4;16792:20;16788:1;16777:9;16773:17;16766:47;16830:131;16956:4;16830:131;:::i;:::-;16822:139;;16549:419;;;:::o;16974:243::-;17114:34;17110:1;17102:6;17098:14;17091:58;17183:26;17178:2;17170:6;17166:15;17159:51;16974:243;:::o;17223:366::-;17365:3;17386:67;17450:2;17445:3;17386:67;:::i;:::-;17379:74;;17462:93;17551:3;17462:93;:::i;:::-;17580:2;17575:3;17571:12;17564:19;;17223:366;;;:::o;17595:419::-;17761:4;17799:2;17788:9;17784:18;17776:26;;17848:9;17842:4;17838:20;17834:1;17823:9;17819:17;17812:47;17876:131;18002:4;17876:131;:::i;:::-;17868:139;;17595:419;;;:::o;18020:236::-;18160:34;18156:1;18148:6;18144:14;18137:58;18229:19;18224:2;18216:6;18212:15;18205:44;18020:236;:::o;18262:366::-;18404:3;18425:67;18489:2;18484:3;18425:67;:::i;:::-;18418:74;;18501:93;18590:3;18501:93;:::i;:::-;18619:2;18614:3;18610:12;18603:19;;18262:366;;;:::o;18634:419::-;18800:4;18838:2;18827:9;18823:18;18815:26;;18887:9;18881:4;18877:20;18873:1;18862:9;18858:17;18851:47;18915:131;19041:4;18915:131;:::i;:::-;18907:139;;18634:419;;;:::o;19059:230::-;19199:34;19195:1;19187:6;19183:14;19176:58;19268:13;19263:2;19255:6;19251:15;19244:38;19059:230;:::o;19295:366::-;19437:3;19458:67;19522:2;19517:3;19458:67;:::i;:::-;19451:74;;19534:93;19623:3;19534:93;:::i;:::-;19652:2;19647:3;19643:12;19636:19;;19295:366;;;:::o;19667:419::-;19833:4;19871:2;19860:9;19856:18;19848:26;;19920:9;19914:4;19910:20;19906:1;19895:9;19891:17;19884:47;19948:131;20074:4;19948:131;:::i;:::-;19940:139;;19667:419;;;:::o;20092:173::-;20232:25;20228:1;20220:6;20216:14;20209:49;20092:173;:::o;20271:366::-;20413:3;20434:67;20498:2;20493:3;20434:67;:::i;:::-;20427:74;;20510:93;20599:3;20510:93;:::i;:::-;20628:2;20623:3;20619:12;20612:19;;20271:366;;;:::o;20643:419::-;20809:4;20847:2;20836:9;20832:18;20824:26;;20896:9;20890:4;20886:20;20882:1;20871:9;20867:17;20860:47;20924:131;21050:4;20924:131;:::i;:::-;20916:139;;20643:419;;;:::o;21068:175::-;21208:27;21204:1;21196:6;21192:14;21185:51;21068:175;:::o;21249:366::-;21391:3;21412:67;21476:2;21471:3;21412:67;:::i;:::-;21405:74;;21488:93;21577:3;21488:93;:::i;:::-;21606:2;21601:3;21597:12;21590:19;;21249:366;;;:::o;21621:419::-;21787:4;21825:2;21814:9;21810:18;21802:26;;21874:9;21868:4;21864:20;21860:1;21849:9;21845:17;21838:47;21902:131;22028:4;21902:131;:::i;:::-;21894:139;;21621:419;;;:::o;22046:169::-;22186:21;22182:1;22174:6;22170:14;22163:45;22046:169;:::o;22221:366::-;22363:3;22384:67;22448:2;22443:3;22384:67;:::i;:::-;22377:74;;22460:93;22549:3;22460:93;:::i;:::-;22578:2;22573:3;22569:12;22562:19;;22221:366;;;:::o;22593:419::-;22759:4;22797:2;22786:9;22782:18;22774:26;;22846:9;22840:4;22836:20;22832:1;22821:9;22817:17;22810:47;22874:131;23000:4;22874:131;:::i;:::-;22866:139;;22593:419;;;:::o;23018:162::-;23158:14;23154:1;23146:6;23142:14;23135:38;23018:162;:::o;23186:366::-;23328:3;23349:67;23413:2;23408:3;23349:67;:::i;:::-;23342:74;;23425:93;23514:3;23425:93;:::i;:::-;23543:2;23538:3;23534:12;23527:19;;23186:366;;;:::o;23558:419::-;23724:4;23762:2;23751:9;23747:18;23739:26;;23811:9;23805:4;23801:20;23797:1;23786:9;23782:17;23775:47;23839:131;23965:4;23839:131;:::i;:::-;23831:139;;23558:419;;;:::o;23983:164::-;24123:16;24119:1;24111:6;24107:14;24100:40;23983:164;:::o;24153:366::-;24295:3;24316:67;24380:2;24375:3;24316:67;:::i;:::-;24309:74;;24392:93;24481:3;24392:93;:::i;:::-;24510:2;24505:3;24501:12;24494:19;;24153:366;;;:::o;24525:419::-;24691:4;24729:2;24718:9;24714:18;24706:26;;24778:9;24772:4;24768:20;24764:1;24753:9;24749:17;24742:47;24806:131;24932:4;24806:131;:::i;:::-;24798:139;;24525:419;;;:::o;24950:231::-;25090:34;25086:1;25078:6;25074:14;25067:58;25159:14;25154:2;25146:6;25142:15;25135:39;24950:231;:::o;25187:366::-;25329:3;25350:67;25414:2;25409:3;25350:67;:::i;:::-;25343:74;;25426:93;25515:3;25426:93;:::i;:::-;25544:2;25539:3;25535:12;25528:19;;25187:366;;;:::o;25559:419::-;25725:4;25763:2;25752:9;25748:18;25740:26;;25812:9;25806:4;25802:20;25798:1;25787:9;25783:17;25776:47;25840:131;25966:4;25840:131;:::i;:::-;25832:139;;25559:419;;;:::o;25984:180::-;26032:77;26029:1;26022:88;26129:4;26126:1;26119:15;26153:4;26150:1;26143:15;26170:169;26310:21;26306:1;26298:6;26294:14;26287:45;26170:169;:::o;26345:366::-;26487:3;26508:67;26572:2;26567:3;26508:67;:::i;:::-;26501:74;;26584:93;26673:3;26584:93;:::i;:::-;26702:2;26697:3;26693:12;26686:19;;26345:366;;;:::o;26717:419::-;26883:4;26921:2;26910:9;26906:18;26898:26;;26970:9;26964:4;26960:20;26956:1;26945:9;26941:17;26934:47;26998:131;27124:4;26998:131;:::i;:::-;26990:139;;26717:419;;;:::o;27142:178::-;27282:30;27278:1;27270:6;27266:14;27259:54;27142:178;:::o;27326:366::-;27468:3;27489:67;27553:2;27548:3;27489:67;:::i;:::-;27482:74;;27565:93;27654:3;27565:93;:::i;:::-;27683:2;27678:3;27674:12;27667:19;;27326:366;;;:::o;27698:419::-;27864:4;27902:2;27891:9;27887:18;27879:26;;27951:9;27945:4;27941:20;27937:1;27926:9;27922:17;27915:47;27979:131;28105:4;27979:131;:::i;:::-;27971:139;;27698:419;;;:::o;28123:180::-;28171:77;28168:1;28161:88;28268:4;28265:1;28258:15;28292:4;28289:1;28282:15;28309:348;28349:7;28372:20;28390:1;28372:20;:::i;:::-;28367:25;;28406:20;28424:1;28406:20;:::i;:::-;28401:25;;28594:1;28526:66;28522:74;28519:1;28516:81;28511:1;28504:9;28497:17;28493:105;28490:131;;;28601:18;;:::i;:::-;28490:131;28649:1;28646;28642:9;28631:20;;28309:348;;;;:::o;28663:233::-;28702:3;28725:24;28743:5;28725:24;:::i;:::-;28716:33;;28771:66;28764:5;28761:77;28758:103;;;28841:18;;:::i;:::-;28758:103;28888:1;28881:5;28877:13;28870:20;;28663:233;;;:::o;28902:228::-;29042:34;29038:1;29030:6;29026:14;29019:58;29111:11;29106:2;29098:6;29094:15;29087:36;28902:228;:::o;29136:366::-;29278:3;29299:67;29363:2;29358:3;29299:67;:::i;:::-;29292:74;;29375:93;29464:3;29375:93;:::i;:::-;29493:2;29488:3;29484:12;29477:19;;29136:366;;;:::o;29508:419::-;29674:4;29712:2;29701:9;29697:18;29689:26;;29761:9;29755:4;29751:20;29747:1;29736:9;29732:17;29725:47;29789:131;29915:4;29789:131;:::i;:::-;29781:139;;29508:419;;;:::o;29933:182::-;30073:34;30069:1;30061:6;30057:14;30050:58;29933:182;:::o;30121:366::-;30263:3;30284:67;30348:2;30343:3;30284:67;:::i;:::-;30277:74;;30360:93;30449:3;30360:93;:::i;:::-;30478:2;30473:3;30469:12;30462:19;;30121:366;;;:::o;30493:419::-;30659:4;30697:2;30686:9;30682:18;30674:26;;30746:9;30740:4;30736:20;30732:1;30721:9;30717:17;30710:47;30774:131;30900:4;30774:131;:::i;:::-;30766:139;;30493:419;;;:::o;30918:229::-;31058:34;31054:1;31046:6;31042:14;31035:58;31127:12;31122:2;31114:6;31110:15;31103:37;30918:229;:::o;31153:366::-;31295:3;31316:67;31380:2;31375:3;31316:67;:::i;:::-;31309:74;;31392:93;31481:3;31392:93;:::i;:::-;31510:2;31505:3;31501:12;31494:19;;31153:366;;;:::o;31525:419::-;31691:4;31729:2;31718:9;31714:18;31706:26;;31778:9;31772:4;31768:20;31764:1;31753:9;31749:17;31742:47;31806:131;31932:4;31806:131;:::i;:::-;31798:139;;31525:419;;;:::o;31950:143::-;32007:5;32038:6;32032:13;32023:22;;32054:33;32081:5;32054:33;:::i;:::-;31950:143;;;;:::o;32099:351::-;32169:6;32218:2;32206:9;32197:7;32193:23;32189:32;32186:119;;;32224:79;;:::i;:::-;32186:119;32344:1;32369:64;32425:7;32416:6;32405:9;32401:22;32369:64;:::i;:::-;32359:74;;32315:128;32099:351;;;;:::o;32456:177::-;32596:29;32592:1;32584:6;32580:14;32573:53;32456:177;:::o;32639:366::-;32781:3;32802:67;32866:2;32861:3;32802:67;:::i;:::-;32795:74;;32878:93;32967:3;32878:93;:::i;:::-;32996:2;32991:3;32987:12;32980:19;;32639:366;;;:::o;33011:419::-;33177:4;33215:2;33204:9;33200:18;33192:26;;33264:9;33258:4;33254:20;33250:1;33239:9;33235:17;33228:47;33292:131;33418:4;33292:131;:::i;:::-;33284:139;;33011:419;;;:::o;33436:442::-;33585:4;33623:2;33612:9;33608:18;33600:26;;33636:71;33704:1;33693:9;33689:17;33680:6;33636:71;:::i;:::-;33717:72;33785:2;33774:9;33770:18;33761:6;33717:72;:::i;:::-;33799;33867:2;33856:9;33852:18;33843:6;33799:72;:::i;:::-;33436:442;;;;;;:::o;33884:137::-;33938:5;33969:6;33963:13;33954:22;;33985:30;34009:5;33985:30;:::i;:::-;33884:137;;;;:::o;34027:345::-;34094:6;34143:2;34131:9;34122:7;34118:23;34114:32;34111:119;;;34149:79;;:::i;:::-;34111:119;34269:1;34294:61;34347:7;34338:6;34327:9;34323:22;34294:61;:::i;:::-;34284:71;;34240:125;34027:345;;;;:::o;34378:234::-;34518:34;34514:1;34506:6;34502:14;34495:58;34587:17;34582:2;34574:6;34570:15;34563:42;34378:234;:::o;34618:366::-;34760:3;34781:67;34845:2;34840:3;34781:67;:::i;:::-;34774:74;;34857:93;34946:3;34857:93;:::i;:::-;34975:2;34970:3;34966:12;34959:19;;34618:366;;;:::o;34990:419::-;35156:4;35194:2;35183:9;35179:18;35171:26;;35243:9;35237:4;35233:20;35229:1;35218:9;35214:17;35207:47;35271:131;35397:4;35271:131;:::i;:::-;35263:139;;34990:419;;;:::o;35415:148::-;35517:11;35554:3;35539:18;;35415:148;;;;:::o;35569:377::-;35675:3;35703:39;35736:5;35703:39;:::i;:::-;35758:89;35840:6;35835:3;35758:89;:::i;:::-;35751:96;;35856:52;35901:6;35896:3;35889:4;35882:5;35878:16;35856:52;:::i;:::-;35933:6;35928:3;35924:16;35917:23;;35679:267;35569:377;;;;:::o;35952:435::-;36132:3;36154:95;36245:3;36236:6;36154:95;:::i;:::-;36147:102;;36266:95;36357:3;36348:6;36266:95;:::i;:::-;36259:102;;36378:3;36371:10;;35952:435;;;;;:::o;36393:143::-;36450:5;36481:6;36475:13;36466:22;;36497:33;36524:5;36497:33;:::i;:::-;36393:143;;;;:::o;36542:351::-;36612:6;36661:2;36649:9;36640:7;36636:23;36632:32;36629:119;;;36667:79;;:::i;:::-;36629:119;36787:1;36812:64;36868:7;36859:6;36848:9;36844:22;36812:64;:::i;:::-;36802:74;;36758:128;36542:351;;;;:::o;36899:114::-;36936:7;36976:30;36969:5;36965:42;36954:53;;36899:114;;;:::o;37019:122::-;37092:24;37110:5;37092:24;:::i;:::-;37085:5;37082:35;37072:63;;37131:1;37128;37121:12;37072:63;37019:122;:::o;37147:143::-;37204:5;37235:6;37229:13;37220:22;;37251:33;37278:5;37251:33;:::i;:::-;37147:143;;;;:::o;37296:93::-;37332:7;37372:10;37365:5;37361:22;37350:33;;37296:93;;;:::o;37395:120::-;37467:23;37484:5;37467:23;:::i;:::-;37460:5;37457:34;37447:62;;37505:1;37502;37495:12;37447:62;37395:120;:::o;37521:141::-;37577:5;37608:6;37602:13;37593:22;;37624:32;37650:5;37624:32;:::i;:::-;37521:141;;;;:::o;37668:661::-;37755:6;37763;37771;37820:2;37808:9;37799:7;37795:23;37791:32;37788:119;;;37826:79;;:::i;:::-;37788:119;37946:1;37971:64;38027:7;38018:6;38007:9;38003:22;37971:64;:::i;:::-;37961:74;;37917:128;38084:2;38110:64;38166:7;38157:6;38146:9;38142:22;38110:64;:::i;:::-;38100:74;;38055:129;38223:2;38249:63;38304:7;38295:6;38284:9;38280:22;38249:63;:::i;:::-;38239:73;;38194:128;37668:661;;;;;:::o;38335:102::-;38377:8;38424:5;38421:1;38417:13;38396:34;;38335:102;;;:::o;38443:848::-;38504:5;38511:4;38535:6;38526:15;;38559:5;38550:14;;38573:712;38594:1;38584:8;38581:15;38573:712;;;38689:4;38684:3;38680:14;38674:4;38671:24;38668:50;;;38698:18;;:::i;:::-;38668:50;38748:1;38738:8;38734:16;38731:451;;;39163:4;39156:5;39152:16;39143:25;;38731:451;39213:4;39207;39203:15;39195:23;;39243:32;39266:8;39243:32;:::i;:::-;39231:44;;38573:712;;;38443:848;;;;;;;:::o;39297:1073::-;39351:5;39542:8;39532:40;;39563:1;39554:10;;39565:5;;39532:40;39591:4;39581:36;;39608:1;39599:10;;39610:5;;39581:36;39677:4;39725:1;39720:27;;;;39761:1;39756:191;;;;39670:277;;39720:27;39738:1;39729:10;;39740:5;;;39756:191;39801:3;39791:8;39788:17;39785:43;;;39808:18;;:::i;:::-;39785:43;39857:8;39854:1;39850:16;39841:25;;39892:3;39885:5;39882:14;39879:40;;;39899:18;;:::i;:::-;39879:40;39932:5;;;39670:277;;40056:2;40046:8;40043:16;40037:3;40031:4;40028:13;40024:36;40006:2;39996:8;39993:16;39988:2;39982:4;39979:12;39975:35;39959:111;39956:246;;;40112:8;40106:4;40102:19;40093:28;;40147:3;40140:5;40137:14;40134:40;;;40154:18;;:::i;:::-;40134:40;40187:5;;39956:246;40227:42;40265:3;40255:8;40249:4;40246:1;40227:42;:::i;:::-;40212:57;;;;40301:4;40296:3;40292:14;40285:5;40282:25;40279:51;;;40310:18;;:::i;:::-;40279:51;40359:4;40352:5;40348:16;40339:25;;39297:1073;;;;;;:::o;40376:285::-;40436:5;40460:23;40478:4;40460:23;:::i;:::-;40452:31;;40504:27;40522:8;40504:27;:::i;:::-;40492:39;;40550:104;40587:66;40577:8;40571:4;40550:104;:::i;:::-;40541:113;;40376:285;;;;:::o;40667:180::-;40715:77;40712:1;40705:88;40812:4;40809:1;40802:15;40836:4;40833:1;40826:15;40853:185;40893:1;40910:20;40928:1;40910:20;:::i;:::-;40905:25;;40944:20;40962:1;40944:20;:::i;:::-;40939:25;;40983:1;40973:35;;40988:18;;:::i;:::-;40973:35;41030:1;41027;41023:9;41018:14;;40853:185;;;;:::o;41044:225::-;41184:34;41180:1;41172:6;41168:14;41161:58;41253:8;41248:2;41240:6;41236:15;41229:33;41044:225;:::o;41275:366::-;41417:3;41438:67;41502:2;41497:3;41438:67;:::i;:::-;41431:74;;41514:93;41603:3;41514:93;:::i;:::-;41632:2;41627:3;41623:12;41616:19;;41275:366;;;:::o;41647:419::-;41813:4;41851:2;41840:9;41836:18;41828:26;;41900:9;41894:4;41890:20;41886:1;41875:9;41871:17;41864:47;41928:131;42054:4;41928:131;:::i;:::-;41920:139;;41647:419;;;:::o;42072:231::-;42212:34;42208:1;42200:6;42196:14;42189:58;42281:14;42276:2;42268:6;42264:15;42257:39;42072:231;:::o;42309:366::-;42451:3;42472:67;42536:2;42531:3;42472:67;:::i;:::-;42465:74;;42548:93;42637:3;42548:93;:::i;:::-;42666:2;42661:3;42657:12;42650:19;;42309:366;;;:::o;42681:419::-;42847:4;42885:2;42874:9;42870:18;42862:26;;42934:9;42928:4;42924:20;42920:1;42909:9;42905:17;42898:47;42962:131;43088:4;42962:131;:::i;:::-;42954:139;;42681:419;;;:::o;43106:228::-;43246:34;43242:1;43234:6;43230:14;43223:58;43315:11;43310:2;43302:6;43298:15;43291:36;43106:228;:::o;43340:366::-;43482:3;43503:67;43567:2;43562:3;43503:67;:::i;:::-;43496:74;;43579:93;43668:3;43579:93;:::i;:::-;43697:2;43692:3;43688:12;43681:19;;43340:366;;;:::o;43712:419::-;43878:4;43916:2;43905:9;43901:18;43893:26;;43965:9;43959:4;43955:20;43951:1;43940:9;43936:17;43929:47;43993:131;44119:4;43993:131;:::i;:::-;43985:139;;43712:419;;;:::o;44137:223::-;44277:34;44273:1;44265:6;44261:14;44254:58;44346:6;44341:2;44333:6;44329:15;44322:31;44137:223;:::o;44366:366::-;44508:3;44529:67;44593:2;44588:3;44529:67;:::i;:::-;44522:74;;44605:93;44694:3;44605:93;:::i;:::-;44723:2;44718:3;44714:12;44707:19;;44366:366;;;:::o;44738:419::-;44904:4;44942:2;44931:9;44927:18;44919:26;;44991:9;44985:4;44981:20;44977:1;44966:9;44962:17;44955:47;45019:131;45145:4;45019:131;:::i;:::-;45011:139;;44738:419;;;:::o;45163:191::-;45203:4;45223:20;45241:1;45223:20;:::i;:::-;45218:25;;45257:20;45275:1;45257:20;:::i;:::-;45252:25;;45296:1;45293;45290:8;45287:34;;;45301:18;;:::i;:::-;45287:34;45346:1;45343;45339:9;45331:17;;45163:191;;;;:::o;45360:305::-;45400:3;45419:20;45437:1;45419:20;:::i;:::-;45414:25;;45453:20;45471:1;45453:20;:::i;:::-;45448:25;;45607:1;45539:66;45535:74;45532:1;45529:81;45526:107;;;45613:18;;:::i;:::-;45526:107;45657:1;45654;45650:9;45643:16;;45360:305;;;;:::o;45671:182::-;45811:34;45807:1;45799:6;45795:14;45788:58;45671:182;:::o;45859:366::-;46001:3;46022:67;46086:2;46081:3;46022:67;:::i;:::-;46015:74;;46098:93;46187:3;46098:93;:::i;:::-;46216:2;46211:3;46207:12;46200:19;;45859:366;;;:::o;46231:419::-;46397:4;46435:2;46424:9;46420:18;46412:26;;46484:9;46478:4;46474:20;46470:1;46459:9;46455:17;46448:47;46512:131;46638:4;46512:131;:::i;:::-;46504:139;;46231:419;;;:::o;46656:178::-;46796:30;46792:1;46784:6;46780:14;46773:54;46656:178;:::o;46840:366::-;46982:3;47003:67;47067:2;47062:3;47003:67;:::i;:::-;46996:74;;47079:93;47168:3;47079:93;:::i;:::-;47197:2;47192:3;47188:12;47181:19;;46840:366;;;:::o;47212:419::-;47378:4;47416:2;47405:9;47401:18;47393:26;;47465:9;47459:4;47455:20;47451:1;47440:9;47436:17;47429:47;47493:131;47619:4;47493:131;:::i;:::-;47485:139;;47212:419;;;:::o;47637:175::-;47777:27;47773:1;47765:6;47761:14;47754:51;47637:175;:::o;47818:366::-;47960:3;47981:67;48045:2;48040:3;47981:67;:::i;:::-;47974:74;;48057:93;48146:3;48057:93;:::i;:::-;48175:2;48170:3;48166:12;48159:19;;47818:366;;;:::o;48190:419::-;48356:4;48394:2;48383:9;48379:18;48371:26;;48443:9;48437:4;48433:20;48429:1;48418:9;48414:17;48407:47;48471:131;48597:4;48471:131;:::i;:::-;48463:139;;48190:419;;;:::o;48615:237::-;48755:34;48751:1;48743:6;48739:14;48732:58;48824:20;48819:2;48811:6;48807:15;48800:45;48615:237;:::o;48858:366::-;49000:3;49021:67;49085:2;49080:3;49021:67;:::i;:::-;49014:74;;49097:93;49186:3;49097:93;:::i;:::-;49215:2;49210:3;49206:12;49199:19;;48858:366;;;:::o;49230:419::-;49396:4;49434:2;49423:9;49419:18;49411:26;;49483:9;49477:4;49473:20;49469:1;49458:9;49454:17;49447:47;49511:131;49637:4;49511:131;:::i;:::-;49503:139;;49230:419;;;:::o;49655:176::-;49687:1;49704:20;49722:1;49704:20;:::i;:::-;49699:25;;49738:20;49756:1;49738:20;:::i;:::-;49733:25;;49777:1;49767:35;;49782:18;;:::i;:::-;49767:35;49823:1;49820;49816:9;49811:14;;49655:176;;;;:::o;49837:332::-;49958:4;49996:2;49985:9;49981:18;49973:26;;50009:71;50077:1;50066:9;50062:17;50053:6;50009:71;:::i;:::-;50090:72;50158:2;50147:9;50143:18;50134:6;50090:72;:::i;:::-;49837:332;;;;;:::o;50175:98::-;50226:6;50260:5;50254:12;50244:22;;50175:98;;;:::o;50279:168::-;50362:11;50396:6;50391:3;50384:19;50436:4;50431:3;50427:14;50412:29;;50279:168;;;;:::o;50453:360::-;50539:3;50567:38;50599:5;50567:38;:::i;:::-;50621:70;50684:6;50679:3;50621:70;:::i;:::-;50614:77;;50700:52;50745:6;50740:3;50733:4;50726:5;50722:16;50700:52;:::i;:::-;50777:29;50799:6;50777:29;:::i;:::-;50772:3;50768:39;50761:46;;50543:270;50453:360;;;;:::o;50819:640::-;51014:4;51052:3;51041:9;51037:19;51029:27;;51066:71;51134:1;51123:9;51119:17;51110:6;51066:71;:::i;:::-;51147:72;51215:2;51204:9;51200:18;51191:6;51147:72;:::i;:::-;51229;51297:2;51286:9;51282:18;51273:6;51229:72;:::i;:::-;51348:9;51342:4;51338:20;51333:2;51322:9;51318:18;51311:48;51376:76;51447:4;51438:6;51376:76;:::i;:::-;51368:84;;50819:640;;;;;;;:::o;51465:141::-;51521:5;51552:6;51546:13;51537:22;;51568:32;51594:5;51568:32;:::i;:::-;51465:141;;;;:::o;51612:349::-;51681:6;51730:2;51718:9;51709:7;51705:23;51701:32;51698:119;;;51736:79;;:::i;:::-;51698:119;51856:1;51881:63;51936:7;51927:6;51916:9;51912:22;51881:63;:::i;:::-;51871:73;;51827:127;51612:349;;;;:::o;51967:229::-;52107:34;52103:1;52095:6;52091:14;52084:58;52176:12;52171:2;52163:6;52159:15;52152:37;51967:229;:::o;52202:366::-;52344:3;52365:67;52429:2;52424:3;52365:67;:::i;:::-;52358:74;;52441:93;52530:3;52441:93;:::i;:::-;52559:2;52554:3;52550:12;52543:19;;52202:366;;;:::o;52574:419::-;52740:4;52778:2;52767:9;52763:18;52755:26;;52827:9;52821:4;52817:20;52813:1;52802:9;52798:17;52791:47;52855:131;52981:4;52855:131;:::i;:::-;52847:139;;52574:419;;;:::o;52999:180::-;53047:77;53044:1;53037:88;53144:4;53141:1;53134:15;53168:4;53165:1;53158:15;53185:225;53325:34;53321:1;53313:6;53309:14;53302:58;53394:8;53389:2;53381:6;53377:15;53370:33;53185:225;:::o;53416:366::-;53558:3;53579:67;53643:2;53638:3;53579:67;:::i;:::-;53572:74;;53655:93;53744:3;53655:93;:::i;:::-;53773:2;53768:3;53764:12;53757:19;;53416:366;;;:::o;53788:419::-;53954:4;53992:2;53981:9;53977:18;53969:26;;54041:9;54035:4;54031:20;54027:1;54016:9;54012:17;54005:47;54069:131;54195:4;54069:131;:::i;:::-;54061:139;;53788:419;;;:::o;54213:179::-;54353:31;54349:1;54341:6;54337:14;54330:55;54213:179;:::o;54398:366::-;54540:3;54561:67;54625:2;54620:3;54561:67;:::i;:::-;54554:74;;54637:93;54726:3;54637:93;:::i;:::-;54755:2;54750:3;54746:12;54739:19;;54398:366;;;:::o;54770:419::-;54936:4;54974:2;54963:9;54959:18;54951:26;;55023:9;55017:4;55013:20;55009:1;54998:9;54994:17;54987:47;55051:131;55177:4;55051:131;:::i;:::-;55043:139;;54770:419;;;:::o;55195:147::-;55296:11;55333:3;55318:18;;55195:147;;;;:::o;55348:373::-;55452:3;55480:38;55512:5;55480:38;:::i;:::-;55534:88;55615:6;55610:3;55534:88;:::i;:::-;55527:95;;55631:52;55676:6;55671:3;55664:4;55657:5;55653:16;55631:52;:::i;:::-;55708:6;55703:3;55699:16;55692:23;;55456:265;55348:373;;;;:::o;55727:271::-;55857:3;55879:93;55968:3;55959:6;55879:93;:::i;:::-;55872:100;;55989:3;55982:10;;55727:271;;;;:::o
Swarm Source
ipfs://5f028839e793623f1d1fe62ffe7361e96b474751292bc9b53356d7c4ecd3b248
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.