Feature Tip: Add private address tag to any address under My Name Tag !
Rebrand announcement. MetaMilfs was rebranded and is now known as Virago.
ERC-721
NFT
Overview
Max Total Supply
2,146 METAMILFS
Holders
474
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
4 METAMILFSLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
MetaMilf
Compiler Version
v0.8.12+commit.f00d7308
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-03-19 */ // 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/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: 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); _afterTokenTransfer(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); _afterTokenTransfer(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 from incorrect owner"); 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); _afterTokenTransfer(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 {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // 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: contracts/2_Owner.sol //Contract based on [https://docs.openzeppelin.com/contracts/3.x/erc721](https://docs.openzeppelin.com/contracts/3.x/erc721) pragma solidity 0.8.12; contract MetaMilf is ERC721, ERC721Enumerable, Ownable { uint public constant MAX_TOKENS = 7769; uint public constant MAX_TOKENS_VIP = 8; uint private _currentToken = 0; uint public CURR_MINT_COST = 0.1 ether; //---- Round based supplies string private CURR_ROUND_NAME = "Presale"; uint private CURR_ROUND_SUPPLY = 2000; uint private CURR_ROUND_TIME = 0; uint private maxMintAmount = 2; uint private nftPerAddressLimit = 2; bytes32 private verificationHash = 0x3b25f67d4e97f5c0030ea90ca2882dbcefa05d1ef454bb67a77533172f4c6f38; uint private currentVIPs = 0; bool public hasSaleStarted = false; bool public onlyWhitelisted = true; string public baseURI; uint256 private remaining = MAX_TOKENS; mapping(uint256 => uint256) private cache; constructor() ERC721("MetaMilfs", "METAMILFS") { setBaseURI("http://api.metamilfs.io/metamilf/"); } function totalSupply() public view override returns(uint) { return _currentToken; } function _baseURI() internal view virtual override returns (string memory) { return baseURI; } function supportsInterface(bytes4 interfaceId) public view override(ERC721, ERC721Enumerable) returns (bool) { return super.supportsInterface(interfaceId); } function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal override(ERC721, ERC721Enumerable) { super._beforeTokenTransfer(from, to, tokenId); } function walletOfOwner(address _owner) public view returns (uint256[] memory) { uint256 ownerTokenCount = balanceOf(_owner); uint256[] memory tokenIds = new uint256[](ownerTokenCount); for (uint256 i; i < ownerTokenCount; i++) { tokenIds[i] = tokenOfOwnerByIndex(_owner, i); } return tokenIds; } function drawIndex() private returns (uint256) { uint256 i = uint(keccak256(abi.encodePacked(block.timestamp, msg.sender, remaining))) % remaining; uint index = cache[i] == 0 ? i : cache[i]; index = index == 0 ? MAX_TOKENS : index; cache[i] = cache[remaining - 1] == 0 ? remaining - 1 : cache[remaining - 1]; remaining = remaining - 1; return index; } function mintNFT(uint _mintAmount, bytes32[] memory proof) external payable { require(msg.value >= CURR_MINT_COST * _mintAmount, "Insufficient funds"); require(hasSaleStarted == true, "Sale hasn't started"); require(_mintAmount > 0, "Need to mint at least 1 NFT"); require(_mintAmount <= maxMintAmount, "Max mint amount per transaction exceeded"); require(_mintAmount <= CURR_ROUND_SUPPLY, "We're at max supply!"); require((_mintAmount + balanceOf(msg.sender)) <= nftPerAddressLimit, "Max NFT per address exceeded"); if(onlyWhitelisted == true) { bytes32 user = keccak256(abi.encodePacked(msg.sender)); require(verify(user,proof), "User is not whitelisted"); } for (uint256 i = 1; i <= _mintAmount; i++) { _currentToken++; CURR_ROUND_SUPPLY--; uint theToken = drawIndex(); _safeMint(msg.sender, theToken); } } function getInformations() external view returns (string memory, uint, uint, uint, uint,uint,uint, bool,bool) { return (CURR_ROUND_NAME,CURR_ROUND_SUPPLY,CURR_ROUND_TIME,CURR_MINT_COST,maxMintAmount,nftPerAddressLimit, _currentToken, hasSaleStarted, onlyWhitelisted); } function verify(bytes32 user, bytes32[] memory proof) internal view returns (bool) { bytes32 computedHash = user; for (uint256 i = 0; i < proof.length; i++) { bytes32 proofElement = proof[i]; if (computedHash <= proofElement) { computedHash = keccak256(abi.encodePacked(computedHash, proofElement)); } else { computedHash = keccak256(abi.encodePacked(proofElement, computedHash)); } } return computedHash == verificationHash; } //only owner functions function setNewRound(uint _supply, uint cost, string memory name, uint perTransactionLimit, uint perAddressLimit, uint theTime, bool isOnlyWhitelisted, bool saleState) external onlyOwner { require(_supply <= (MAX_TOKENS - _currentToken), "Exceeded supply"); CURR_ROUND_SUPPLY = _supply; CURR_MINT_COST = cost; CURR_ROUND_NAME = name; maxMintAmount = perTransactionLimit; nftPerAddressLimit = perAddressLimit; CURR_ROUND_TIME = theTime; hasSaleStarted = saleState; onlyWhitelisted = isOnlyWhitelisted; } function setVerificationHash(bytes32 hash) external onlyOwner { verificationHash = hash; } function setOnlyWhitelisted(bool _state) external onlyOwner { onlyWhitelisted = _state; } function setBaseURI(string memory _newBaseURI) public onlyOwner { baseURI = _newBaseURI; } function reserveVIP(uint numTokens, address recipient) external onlyOwner { require((currentVIPs + numTokens) <= MAX_TOKENS_VIP, "Exceeded VIP supply"); uint index; for(index = 1; index <= numTokens; index++) { _currentToken++; currentVIPs = currentVIPs + 1; uint theToken = currentVIPs + MAX_TOKENS; _safeMint(recipient, theToken); } } function Giveaways(uint numTokens, address recipient) external onlyOwner { require((_currentToken + numTokens) <= MAX_TOKENS, "Exceeded supply"); uint index; for(index = 1; index <= numTokens; index++) { _currentToken++; uint theToken = drawIndex(); _safeMint(recipient, theToken); } } function withdraw(uint amount) external onlyOwner { require(payable(msg.sender).send(amount)); } function setSaleStarted(bool _state) external onlyOwner { hasSaleStarted = _state; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"CURR_MINT_COST","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numTokens","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"}],"name":"Giveaways","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"MAX_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_TOKENS_VIP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getInformations","outputs":[{"internalType":"string","name":"","type":"string"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bool","name":"","type":"bool"},{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hasSaleStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"mintNFT","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"onlyWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numTokens","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"}],"name":"reserveVIP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_supply","type":"uint256"},{"internalType":"uint256","name":"cost","type":"uint256"},{"internalType":"string","name":"name","type":"string"},{"internalType":"uint256","name":"perTransactionLimit","type":"uint256"},{"internalType":"uint256","name":"perAddressLimit","type":"uint256"},{"internalType":"uint256","name":"theTime","type":"uint256"},{"internalType":"bool","name":"isOnlyWhitelisted","type":"bool"},{"internalType":"bool","name":"saleState","type":"bool"}],"name":"setNewRound","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setOnlyWhitelisted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setSaleStarted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"hash","type":"bytes32"}],"name":"setVerificationHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526000600b5567016345785d8a0000600c556040518060400160405280600781526020017f50726573616c6500000000000000000000000000000000000000000000000000815250600d90805190602001906200006292919062000381565b506107d0600e556000600f55600260105560026011557f3b25f67d4e97f5c0030ea90ca2882dbcefa05d1ef454bb67a77533172f4c6f3860001b60125560006013556000601460006101000a81548160ff0219169083151502179055506001601460016101000a81548160ff021916908315150217905550611e59601655348015620000ed57600080fd5b506040518060400160405280600981526020017f4d6574614d696c667300000000000000000000000000000000000000000000008152506040518060400160405280600981526020017f4d4554414d494c4653000000000000000000000000000000000000000000000081525081600090805190602001906200017292919062000381565b5080600190805190602001906200018b92919062000381565b505050620001ae620001a2620001de60201b60201c565b620001e660201b60201c565b620001d86040518060600160405280602181526020016200562160219139620002ac60201b60201c565b62000519565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002bc620001de60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620002e26200035760201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200033b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003329062000492565b60405180910390fd5b80601590805190602001906200035392919062000381565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b8280546200038f90620004e3565b90600052602060002090601f016020900481019282620003b35760008555620003ff565b82601f10620003ce57805160ff1916838001178555620003ff565b82800160010185558215620003ff579182015b82811115620003fe578251825591602001919060010190620003e1565b5b5090506200040e919062000412565b5090565b5b808211156200042d57600081600090555060010162000413565b5090565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006200047a60208362000431565b9150620004878262000442565b602082019050919050565b60006020820190508181036000830152620004ad816200046b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620004fc57607f821691505b60208210811415620005135762000512620004b4565b5b50919050565b6150f880620005296000396000f3fe60806040526004361061020f5760003560e01c806370a0823111610118578063bff84fc5116100a0578063d62fd2961161006f578063d62fd296146107b3578063e985e9c5146107cf578063f2fde38b1461080c578063f47c84c514610835578063f79e66ba146108605761020f565b8063bff84fc5146106f9578063c342784414610722578063c87b56dd1461074d578063cc0b8d151461078a5761020f565b80639c70b512116100e75780639c70b5121461062a578063a22cb46514610655578063a854ffba1461067e578063aefbbc9d146106a7578063b88d4fde146106d05761020f565b806370a0823114610580578063715018a6146105bd5780638da5cb5b146105d457806395d89b41146105ff5761020f565b80633c5e310b1161019b5780634f6ccce71161016a5780634f6ccce71461048957806355f804b3146104c65780636352211e146104ef57806366e7ca181461052c5780636c0360eb146105555761020f565b80633c5e310b146103c75780633c952764146103fa57806342842e0e14610423578063438b63001461044c5761020f565b806318160ddd116101e257806318160ddd146102e25780631c8b232d1461030d57806323b872dd146103385780632e1a7d4d146103615780632f745c591461038a5761020f565b806301ffc9a71461021457806306fdde0314610251578063081812fc1461027c578063095ea7b3146102b9575b600080fd5b34801561022057600080fd5b5061023b60048036038101906102369190613382565b61088b565b60405161024891906133ca565b60405180910390f35b34801561025d57600080fd5b5061026661089d565b604051610273919061347e565b60405180910390f35b34801561028857600080fd5b506102a3600480360381019061029e91906134d6565b61092f565b6040516102b09190613544565b60405180910390f35b3480156102c557600080fd5b506102e060048036038101906102db919061358b565b6109b4565b005b3480156102ee57600080fd5b506102f7610acc565b60405161030491906135da565b60405180910390f35b34801561031957600080fd5b50610322610ad6565b60405161032f91906133ca565b60405180910390f35b34801561034457600080fd5b5061035f600480360381019061035a91906135f5565b610ae9565b005b34801561036d57600080fd5b50610388600480360381019061038391906134d6565b610b49565b005b34801561039657600080fd5b506103b160048036038101906103ac919061358b565b610c06565b6040516103be91906135da565b60405180910390f35b3480156103d357600080fd5b506103dc610cab565b6040516103f199989796959493929190613648565b60405180910390f35b34801561040657600080fd5b50610421600480360381019061041c9190613708565b610d96565b005b34801561042f57600080fd5b5061044a600480360381019061044591906135f5565b610e2f565b005b34801561045857600080fd5b50610473600480360381019061046e9190613735565b610e4f565b6040516104809190613820565b60405180910390f35b34801561049557600080fd5b506104b060048036038101906104ab91906134d6565b610efd565b6040516104bd91906135da565b60405180910390f35b3480156104d257600080fd5b506104ed60048036038101906104e89190613977565b610f6e565b005b3480156104fb57600080fd5b50610516600480360381019061051191906134d6565b611004565b6040516105239190613544565b60405180910390f35b34801561053857600080fd5b50610553600480360381019061054e91906139f6565b6110b6565b005b34801561056157600080fd5b5061056a61113c565b604051610577919061347e565b60405180910390f35b34801561058c57600080fd5b506105a760048036038101906105a29190613735565b6111ca565b6040516105b491906135da565b60405180910390f35b3480156105c957600080fd5b506105d2611282565b005b3480156105e057600080fd5b506105e961130a565b6040516105f69190613544565b60405180910390f35b34801561060b57600080fd5b50610614611334565b604051610621919061347e565b60405180910390f35b34801561063657600080fd5b5061063f6113c6565b60405161064c91906133ca565b60405180910390f35b34801561066157600080fd5b5061067c60048036038101906106779190613a23565b6113d9565b005b34801561068a57600080fd5b506106a560048036038101906106a09190613708565b6113ef565b005b3480156106b357600080fd5b506106ce60048036038101906106c99190613a63565b611488565b005b3480156106dc57600080fd5b506106f760048036038101906106f29190613bd6565b6115ce565b005b34801561070557600080fd5b50610720600480360381019061071b9190613c59565b611630565b005b34801561072e57600080fd5b5061073761176f565b60405161074491906135da565b60405180910390f35b34801561075957600080fd5b50610774600480360381019061076f91906134d6565b611775565b604051610781919061347e565b60405180910390f35b34801561079657600080fd5b506107b160048036038101906107ac9190613c59565b61181c565b005b6107cd60048036038101906107c89190613d61565b61193f565b005b3480156107db57600080fd5b506107f660048036038101906107f19190613dbd565b611c09565b60405161080391906133ca565b60405180910390f35b34801561081857600080fd5b50610833600480360381019061082e9190613735565b611c9d565b005b34801561084157600080fd5b5061084a611d95565b60405161085791906135da565b60405180910390f35b34801561086c57600080fd5b50610875611d9b565b60405161088291906135da565b60405180910390f35b600061089682611da0565b9050919050565b6060600080546108ac90613e2c565b80601f01602080910402602001604051908101604052809291908181526020018280546108d890613e2c565b80156109255780601f106108fa57610100808354040283529160200191610925565b820191906000526020600020905b81548152906001019060200180831161090857829003601f168201915b5050505050905090565b600061093a82611e1a565b610979576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097090613ed0565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109bf82611004565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2790613f62565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a4f611e86565b73ffffffffffffffffffffffffffffffffffffffff161480610a7e5750610a7d81610a78611e86565b611c09565b5b610abd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab490613ff4565b60405180910390fd5b610ac78383611e8e565b505050565b6000600b54905090565b601460009054906101000a900460ff1681565b610afa610af4611e86565b82611f47565b610b39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3090614086565b60405180910390fd5b610b44838383612025565b505050565b610b51611e86565b73ffffffffffffffffffffffffffffffffffffffff16610b6f61130a565b73ffffffffffffffffffffffffffffffffffffffff1614610bc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bbc906140f2565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050610c0357600080fd5b50565b6000610c11836111ca565b8210610c52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4990614184565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6060600080600080600080600080600d600e54600f54600c54601054601154600b54601460009054906101000a900460ff16601460019054906101000a900460ff16888054610cf990613e2c565b80601f0160208091040260200160405190810160405280929190818152602001828054610d2590613e2c565b8015610d725780601f10610d4757610100808354040283529160200191610d72565b820191906000526020600020905b815481529060010190602001808311610d5557829003601f168201915b50505050509850985098509850985098509850985098509850909192939495969798565b610d9e611e86565b73ffffffffffffffffffffffffffffffffffffffff16610dbc61130a565b73ffffffffffffffffffffffffffffffffffffffff1614610e12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e09906140f2565b60405180910390fd5b80601460016101000a81548160ff02191690831515021790555050565b610e4a838383604051806020016040528060008152506115ce565b505050565b60606000610e5c836111ca565b905060008167ffffffffffffffff811115610e7a57610e7961384c565b5b604051908082528060200260200182016040528015610ea85781602001602082028036833780820191505090505b50905060005b82811015610ef257610ec08582610c06565b828281518110610ed357610ed26141a4565b5b6020026020010181815250508080610eea90614202565b915050610eae565b508092505050919050565b6000610f0761228c565b8210610f48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3f906142bd565b60405180910390fd5b60088281548110610f5c57610f5b6141a4565b5b90600052602060002001549050919050565b610f76611e86565b73ffffffffffffffffffffffffffffffffffffffff16610f9461130a565b73ffffffffffffffffffffffffffffffffffffffff1614610fea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe1906140f2565b60405180910390fd5b8060159080519060200190611000929190613273565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156110ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a49061434f565b60405180910390fd5b80915050919050565b6110be611e86565b73ffffffffffffffffffffffffffffffffffffffff166110dc61130a565b73ffffffffffffffffffffffffffffffffffffffff1614611132576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611129906140f2565b60405180910390fd5b8060128190555050565b6015805461114990613e2c565b80601f016020809104026020016040519081016040528092919081815260200182805461117590613e2c565b80156111c25780601f10611197576101008083540402835291602001916111c2565b820191906000526020600020905b8154815290600101906020018083116111a557829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561123b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611232906143e1565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61128a611e86565b73ffffffffffffffffffffffffffffffffffffffff166112a861130a565b73ffffffffffffffffffffffffffffffffffffffff16146112fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f5906140f2565b60405180910390fd5b6113086000612299565b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461134390613e2c565b80601f016020809104026020016040519081016040528092919081815260200182805461136f90613e2c565b80156113bc5780601f10611391576101008083540402835291602001916113bc565b820191906000526020600020905b81548152906001019060200180831161139f57829003601f168201915b5050505050905090565b601460019054906101000a900460ff1681565b6113eb6113e4611e86565b838361235f565b5050565b6113f7611e86565b73ffffffffffffffffffffffffffffffffffffffff1661141561130a565b73ffffffffffffffffffffffffffffffffffffffff161461146b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611462906140f2565b60405180910390fd5b80601460006101000a81548160ff02191690831515021790555050565b611490611e86565b73ffffffffffffffffffffffffffffffffffffffff166114ae61130a565b73ffffffffffffffffffffffffffffffffffffffff1614611504576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114fb906140f2565b60405180910390fd5b600b54611e596115149190614401565b881115611556576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154d90614481565b60405180910390fd5b87600e8190555086600c8190555085600d908051906020019061157a929190613273565b50846010819055508360118190555082600f8190555080601460006101000a81548160ff02191690831515021790555081601460016101000a81548160ff0219169083151502179055505050505050505050565b6115df6115d9611e86565b83611f47565b61161e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161590614086565b60405180910390fd5b61162a848484846124cc565b50505050565b611638611e86565b73ffffffffffffffffffffffffffffffffffffffff1661165661130a565b73ffffffffffffffffffffffffffffffffffffffff16146116ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a3906140f2565b60405180910390fd5b6008826013546116bc91906144a1565b11156116fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f490614543565b60405180910390fd5b6000600190505b82811161176a57600b600081548092919061171e90614202565b9190505550600160135461173291906144a1565b6013819055506000611e5960135461174a91906144a1565b90506117568382612528565b50808061176290614202565b915050611704565b505050565b600c5481565b606061178082611e1a565b6117bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b6906145d5565b60405180910390fd5b60006117c9612546565b905060008151116117e95760405180602001604052806000815250611814565b806117f3846125d8565b604051602001611804929190614631565b6040516020818303038152906040525b915050919050565b611824611e86565b73ffffffffffffffffffffffffffffffffffffffff1661184261130a565b73ffffffffffffffffffffffffffffffffffffffff1614611898576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188f906140f2565b60405180910390fd5b611e5982600b546118a991906144a1565b11156118ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e190614481565b60405180910390fd5b6000600190505b82811161193a57600b600081548092919061190b90614202565b9190505550600061191a612739565b90506119268382612528565b50808061193290614202565b9150506118f1565b505050565b81600c5461194d9190614655565b34101561198f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611986906146fb565b60405180910390fd5b60011515601460009054906101000a900460ff161515146119e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119dc90614767565b60405180910390fd5b60008211611a28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1f906147d3565b60405180910390fd5b601054821115611a6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6490614865565b60405180910390fd5b600e54821115611ab2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa9906148d1565b60405180910390fd5b601154611abe336111ca565b83611ac991906144a1565b1115611b0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b019061493d565b60405180910390fd5b60011515601460019054906101000a900460ff1615151415611b9c57600033604051602001611b3991906149a5565b604051602081830303815290604052805190602001209050611b5b818361285c565b611b9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9190614a0c565b60405180910390fd5b505b6000600190505b828111611c0457600b6000815480929190611bbd90614202565b9190505550600e6000815480929190611bd590614a2c565b91905055506000611be4612739565b9050611bf03382612528565b508080611bfc90614202565b915050611ba3565b505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611ca5611e86565b73ffffffffffffffffffffffffffffffffffffffff16611cc361130a565b73ffffffffffffffffffffffffffffffffffffffff1614611d19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d10906140f2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611d89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8090614ac8565b60405180910390fd5b611d9281612299565b50565b611e5981565b600881565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611e135750611e1282612913565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611f0183611004565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611f5282611e1a565b611f91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8890614b5a565b60405180910390fd5b6000611f9c83611004565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061200b57508373ffffffffffffffffffffffffffffffffffffffff16611ff38461092f565b73ffffffffffffffffffffffffffffffffffffffff16145b8061201c575061201b8185611c09565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661204582611004565b73ffffffffffffffffffffffffffffffffffffffff161461209b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209290614bec565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561210b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161210290614c7e565b60405180910390fd5b6121168383836129f5565b612121600082611e8e565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121719190614401565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121c891906144a1565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612287838383612a05565b505050565b6000600880549050905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156123ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123c590614cea565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516124bf91906133ca565b60405180910390a3505050565b6124d7848484612025565b6124e384848484612a0a565b612522576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161251990614d7c565b60405180910390fd5b50505050565b612542828260405180602001604052806000815250612b92565b5050565b60606015805461255590613e2c565b80601f016020809104026020016040519081016040528092919081815260200182805461258190613e2c565b80156125ce5780601f106125a3576101008083540402835291602001916125ce565b820191906000526020600020905b8154815290600101906020018083116125b157829003601f168201915b5050505050905090565b60606000821415612620576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612734565b600082905060005b6000821461265257808061263b90614202565b915050600a8261264b9190614dcb565b9150612628565b60008167ffffffffffffffff81111561266e5761266d61384c565b5b6040519080825280601f01601f1916602001820160405280156126a05781602001600182028036833780820191505090505b5090505b6000851461272d576001826126b99190614401565b9150600a856126c89190614dfc565b60306126d491906144a1565b60f81b8183815181106126ea576126e96141a4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856127269190614dcb565b94506126a4565b8093505050505b919050565b600080601654423360165460405160200161275693929190614e4e565b6040516020818303038152906040528051906020012060001c6127799190614dfc565b90506000806017600084815260200190815260200160002054146127b05760176000838152602001908152602001600020546127b2565b815b9050600081146127c257806127c6565b611e595b905060006017600060016016546127dd9190614401565b81526020019081526020016000205414612818576017600060016016546128049190614401565b815260200190815260200160002054612828565b60016016546128279190614401565b5b6017600084815260200190815260200160002081905550600160165461284e9190614401565b601681905550809250505090565b60008083905060005b8351811015612904576000848281518110612883576128826141a4565b5b602002602001015190508083116128c45782816040516020016128a7929190614eac565b6040516020818303038152906040528051906020012092506128f0565b80836040516020016128d7929190614eac565b6040516020818303038152906040528051906020012092505b5080806128fc90614202565b915050612865565b50601254811491505092915050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806129de57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806129ee57506129ed82612bed565b5b9050919050565b612a00838383612c57565b505050565b505050565b6000612a2b8473ffffffffffffffffffffffffffffffffffffffff16612d6b565b15612b85578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612a54611e86565b8786866040518563ffffffff1660e01b8152600401612a769493929190614f2d565b6020604051808303816000875af1925050508015612ab257506040513d601f19601f82011682018060405250810190612aaf9190614f8e565b60015b612b35573d8060008114612ae2576040519150601f19603f3d011682016040523d82523d6000602084013e612ae7565b606091505b50600081511415612b2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b2490614d7c565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612b8a565b600190505b949350505050565b612b9c8383612d8e565b612ba96000848484612a0a565b612be8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bdf90614d7c565b60405180910390fd5b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612c62838383612f68565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612ca557612ca081612f6d565b612ce4565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612ce357612ce28382612fb6565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612d2757612d2281613123565b612d66565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612d6557612d6482826131f4565b5b5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612dfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612df590615007565b60405180910390fd5b612e0781611e1a565b15612e47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e3e90615073565b60405180910390fd5b612e53600083836129f5565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ea391906144a1565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612f6460008383612a05565b5050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612fc3846111ca565b612fcd9190614401565b90506000600760008481526020019081526020016000205490508181146130b2576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506131379190614401565b9050600060096000848152602001908152602001600020549050600060088381548110613167576131666141a4565b5b906000526020600020015490508060088381548110613189576131886141a4565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806131d8576131d7615093565b5b6001900381819060005260206000200160009055905550505050565b60006131ff836111ca565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b82805461327f90613e2c565b90600052602060002090601f0160209004810192826132a157600085556132e8565b82601f106132ba57805160ff19168380011785556132e8565b828001600101855582156132e8579182015b828111156132e75782518255916020019190600101906132cc565b5b5090506132f591906132f9565b5090565b5b808211156133125760008160009055506001016132fa565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61335f8161332a565b811461336a57600080fd5b50565b60008135905061337c81613356565b92915050565b60006020828403121561339857613397613320565b5b60006133a68482850161336d565b91505092915050565b60008115159050919050565b6133c4816133af565b82525050565b60006020820190506133df60008301846133bb565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561341f578082015181840152602081019050613404565b8381111561342e576000848401525b50505050565b6000601f19601f8301169050919050565b6000613450826133e5565b61345a81856133f0565b935061346a818560208601613401565b61347381613434565b840191505092915050565b600060208201905081810360008301526134988184613445565b905092915050565b6000819050919050565b6134b3816134a0565b81146134be57600080fd5b50565b6000813590506134d0816134aa565b92915050565b6000602082840312156134ec576134eb613320565b5b60006134fa848285016134c1565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061352e82613503565b9050919050565b61353e81613523565b82525050565b60006020820190506135596000830184613535565b92915050565b61356881613523565b811461357357600080fd5b50565b6000813590506135858161355f565b92915050565b600080604083850312156135a2576135a1613320565b5b60006135b085828601613576565b92505060206135c1858286016134c1565b9150509250929050565b6135d4816134a0565b82525050565b60006020820190506135ef60008301846135cb565b92915050565b60008060006060848603121561360e5761360d613320565b5b600061361c86828701613576565b935050602061362d86828701613576565b925050604061363e868287016134c1565b9150509250925092565b6000610120820190508181036000830152613663818c613445565b9050613672602083018b6135cb565b61367f604083018a6135cb565b61368c60608301896135cb565b61369960808301886135cb565b6136a660a08301876135cb565b6136b360c08301866135cb565b6136c060e08301856133bb565b6136ce6101008301846133bb565b9a9950505050505050505050565b6136e5816133af565b81146136f057600080fd5b50565b600081359050613702816136dc565b92915050565b60006020828403121561371e5761371d613320565b5b600061372c848285016136f3565b91505092915050565b60006020828403121561374b5761374a613320565b5b600061375984828501613576565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613797816134a0565b82525050565b60006137a9838361378e565b60208301905092915050565b6000602082019050919050565b60006137cd82613762565b6137d7818561376d565b93506137e28361377e565b8060005b838110156138135781516137fa888261379d565b9750613805836137b5565b9250506001810190506137e6565b5085935050505092915050565b6000602082019050818103600083015261383a81846137c2565b905092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61388482613434565b810181811067ffffffffffffffff821117156138a3576138a261384c565b5b80604052505050565b60006138b6613316565b90506138c2828261387b565b919050565b600067ffffffffffffffff8211156138e2576138e161384c565b5b6138eb82613434565b9050602081019050919050565b82818337600083830152505050565b600061391a613915846138c7565b6138ac565b90508281526020810184848401111561393657613935613847565b5b6139418482856138f8565b509392505050565b600082601f83011261395e5761395d613842565b5b813561396e848260208601613907565b91505092915050565b60006020828403121561398d5761398c613320565b5b600082013567ffffffffffffffff8111156139ab576139aa613325565b5b6139b784828501613949565b91505092915050565b6000819050919050565b6139d3816139c0565b81146139de57600080fd5b50565b6000813590506139f0816139ca565b92915050565b600060208284031215613a0c57613a0b613320565b5b6000613a1a848285016139e1565b91505092915050565b60008060408385031215613a3a57613a39613320565b5b6000613a4885828601613576565b9250506020613a59858286016136f3565b9150509250929050565b600080600080600080600080610100898b031215613a8457613a83613320565b5b6000613a928b828c016134c1565b9850506020613aa38b828c016134c1565b975050604089013567ffffffffffffffff811115613ac457613ac3613325565b5b613ad08b828c01613949565b9650506060613ae18b828c016134c1565b9550506080613af28b828c016134c1565b94505060a0613b038b828c016134c1565b93505060c0613b148b828c016136f3565b92505060e0613b258b828c016136f3565b9150509295985092959890939650565b600067ffffffffffffffff821115613b5057613b4f61384c565b5b613b5982613434565b9050602081019050919050565b6000613b79613b7484613b35565b6138ac565b905082815260208101848484011115613b9557613b94613847565b5b613ba08482856138f8565b509392505050565b600082601f830112613bbd57613bbc613842565b5b8135613bcd848260208601613b66565b91505092915050565b60008060008060808587031215613bf057613bef613320565b5b6000613bfe87828801613576565b9450506020613c0f87828801613576565b9350506040613c20878288016134c1565b925050606085013567ffffffffffffffff811115613c4157613c40613325565b5b613c4d87828801613ba8565b91505092959194509250565b60008060408385031215613c7057613c6f613320565b5b6000613c7e858286016134c1565b9250506020613c8f85828601613576565b9150509250929050565b600067ffffffffffffffff821115613cb457613cb361384c565b5b602082029050602081019050919050565b600080fd5b6000613cdd613cd884613c99565b6138ac565b90508083825260208201905060208402830185811115613d0057613cff613cc5565b5b835b81811015613d295780613d1588826139e1565b845260208401935050602081019050613d02565b5050509392505050565b600082601f830112613d4857613d47613842565b5b8135613d58848260208601613cca565b91505092915050565b60008060408385031215613d7857613d77613320565b5b6000613d86858286016134c1565b925050602083013567ffffffffffffffff811115613da757613da6613325565b5b613db385828601613d33565b9150509250929050565b60008060408385031215613dd457613dd3613320565b5b6000613de285828601613576565b9250506020613df385828601613576565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613e4457607f821691505b60208210811415613e5857613e57613dfd565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613eba602c836133f0565b9150613ec582613e5e565b604082019050919050565b60006020820190508181036000830152613ee981613ead565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613f4c6021836133f0565b9150613f5782613ef0565b604082019050919050565b60006020820190508181036000830152613f7b81613f3f565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000613fde6038836133f0565b9150613fe982613f82565b604082019050919050565b6000602082019050818103600083015261400d81613fd1565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b60006140706031836133f0565b915061407b82614014565b604082019050919050565b6000602082019050818103600083015261409f81614063565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006140dc6020836133f0565b91506140e7826140a6565b602082019050919050565b6000602082019050818103600083015261410b816140cf565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b600061416e602b836133f0565b915061417982614112565b604082019050919050565b6000602082019050818103600083015261419d81614161565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061420d826134a0565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156142405761423f6141d3565b5b600182019050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b60006142a7602c836133f0565b91506142b28261424b565b604082019050919050565b600060208201905081810360008301526142d68161429a565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b60006143396029836133f0565b9150614344826142dd565b604082019050919050565b600060208201905081810360008301526143688161432c565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b60006143cb602a836133f0565b91506143d68261436f565b604082019050919050565b600060208201905081810360008301526143fa816143be565b9050919050565b600061440c826134a0565b9150614417836134a0565b92508282101561442a576144296141d3565b5b828203905092915050565b7f457863656564656420737570706c790000000000000000000000000000000000600082015250565b600061446b600f836133f0565b915061447682614435565b602082019050919050565b6000602082019050818103600083015261449a8161445e565b9050919050565b60006144ac826134a0565b91506144b7836134a0565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156144ec576144eb6141d3565b5b828201905092915050565b7f45786365656465642056495020737570706c7900000000000000000000000000600082015250565b600061452d6013836133f0565b9150614538826144f7565b602082019050919050565b6000602082019050818103600083015261455c81614520565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006145bf602f836133f0565b91506145ca82614563565b604082019050919050565b600060208201905081810360008301526145ee816145b2565b9050919050565b600081905092915050565b600061460b826133e5565b61461581856145f5565b9350614625818560208601613401565b80840191505092915050565b600061463d8285614600565b91506146498284614600565b91508190509392505050565b6000614660826134a0565b915061466b836134a0565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156146a4576146a36141d3565b5b828202905092915050565b7f496e73756666696369656e742066756e64730000000000000000000000000000600082015250565b60006146e56012836133f0565b91506146f0826146af565b602082019050919050565b60006020820190508181036000830152614714816146d8565b9050919050565b7f53616c65206861736e2774207374617274656400000000000000000000000000600082015250565b60006147516013836133f0565b915061475c8261471b565b602082019050919050565b6000602082019050818103600083015261478081614744565b9050919050565b7f4e65656420746f206d696e74206174206c656173742031204e46540000000000600082015250565b60006147bd601b836133f0565b91506147c882614787565b602082019050919050565b600060208201905081810360008301526147ec816147b0565b9050919050565b7f4d6178206d696e7420616d6f756e7420706572207472616e73616374696f6e2060008201527f6578636565646564000000000000000000000000000000000000000000000000602082015250565b600061484f6028836133f0565b915061485a826147f3565b604082019050919050565b6000602082019050818103600083015261487e81614842565b9050919050565b7f5765277265206174206d617820737570706c7921000000000000000000000000600082015250565b60006148bb6014836133f0565b91506148c682614885565b602082019050919050565b600060208201905081810360008301526148ea816148ae565b9050919050565b7f4d6178204e465420706572206164647265737320657863656564656400000000600082015250565b6000614927601c836133f0565b9150614932826148f1565b602082019050919050565b600060208201905081810360008301526149568161491a565b9050919050565b60008160601b9050919050565b60006149758261495d565b9050919050565b60006149878261496a565b9050919050565b61499f61499a82613523565b61497c565b82525050565b60006149b1828461498e565b60148201915081905092915050565b7f55736572206973206e6f742077686974656c6973746564000000000000000000600082015250565b60006149f66017836133f0565b9150614a01826149c0565b602082019050919050565b60006020820190508181036000830152614a25816149e9565b9050919050565b6000614a37826134a0565b91506000821415614a4b57614a4a6141d3565b5b600182039050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614ab26026836133f0565b9150614abd82614a56565b604082019050919050565b60006020820190508181036000830152614ae181614aa5565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614b44602c836133f0565b9150614b4f82614ae8565b604082019050919050565b60006020820190508181036000830152614b7381614b37565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000614bd66025836133f0565b9150614be182614b7a565b604082019050919050565b60006020820190508181036000830152614c0581614bc9565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614c686024836133f0565b9150614c7382614c0c565b604082019050919050565b60006020820190508181036000830152614c9781614c5b565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614cd46019836133f0565b9150614cdf82614c9e565b602082019050919050565b60006020820190508181036000830152614d0381614cc7565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614d666032836133f0565b9150614d7182614d0a565b604082019050919050565b60006020820190508181036000830152614d9581614d59565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614dd6826134a0565b9150614de1836134a0565b925082614df157614df0614d9c565b5b828204905092915050565b6000614e07826134a0565b9150614e12836134a0565b925082614e2257614e21614d9c565b5b828206905092915050565b6000819050919050565b614e48614e43826134a0565b614e2d565b82525050565b6000614e5a8286614e37565b602082019150614e6a828561498e565b601482019150614e7a8284614e37565b602082019150819050949350505050565b6000819050919050565b614ea6614ea1826139c0565b614e8b565b82525050565b6000614eb88285614e95565b602082019150614ec88284614e95565b6020820191508190509392505050565b600081519050919050565b600082825260208201905092915050565b6000614eff82614ed8565b614f098185614ee3565b9350614f19818560208601613401565b614f2281613434565b840191505092915050565b6000608082019050614f426000830187613535565b614f4f6020830186613535565b614f5c60408301856135cb565b8181036060830152614f6e8184614ef4565b905095945050505050565b600081519050614f8881613356565b92915050565b600060208284031215614fa457614fa3613320565b5b6000614fb284828501614f79565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614ff16020836133f0565b9150614ffc82614fbb565b602082019050919050565b6000602082019050818103600083015261502081614fe4565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b600061505d601c836133f0565b915061506882615027565b602082019050919050565b6000602082019050818103600083015261508c81615050565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea26469706673582212204f169083d34de54cd35621dabd53cc2b444ad2763f7fc8e8ca0b19223e7ab70864736f6c634300080c0033687474703a2f2f6170692e6d6574616d696c66732e696f2f6d6574616d696c662f
Deployed Bytecode
0x60806040526004361061020f5760003560e01c806370a0823111610118578063bff84fc5116100a0578063d62fd2961161006f578063d62fd296146107b3578063e985e9c5146107cf578063f2fde38b1461080c578063f47c84c514610835578063f79e66ba146108605761020f565b8063bff84fc5146106f9578063c342784414610722578063c87b56dd1461074d578063cc0b8d151461078a5761020f565b80639c70b512116100e75780639c70b5121461062a578063a22cb46514610655578063a854ffba1461067e578063aefbbc9d146106a7578063b88d4fde146106d05761020f565b806370a0823114610580578063715018a6146105bd5780638da5cb5b146105d457806395d89b41146105ff5761020f565b80633c5e310b1161019b5780634f6ccce71161016a5780634f6ccce71461048957806355f804b3146104c65780636352211e146104ef57806366e7ca181461052c5780636c0360eb146105555761020f565b80633c5e310b146103c75780633c952764146103fa57806342842e0e14610423578063438b63001461044c5761020f565b806318160ddd116101e257806318160ddd146102e25780631c8b232d1461030d57806323b872dd146103385780632e1a7d4d146103615780632f745c591461038a5761020f565b806301ffc9a71461021457806306fdde0314610251578063081812fc1461027c578063095ea7b3146102b9575b600080fd5b34801561022057600080fd5b5061023b60048036038101906102369190613382565b61088b565b60405161024891906133ca565b60405180910390f35b34801561025d57600080fd5b5061026661089d565b604051610273919061347e565b60405180910390f35b34801561028857600080fd5b506102a3600480360381019061029e91906134d6565b61092f565b6040516102b09190613544565b60405180910390f35b3480156102c557600080fd5b506102e060048036038101906102db919061358b565b6109b4565b005b3480156102ee57600080fd5b506102f7610acc565b60405161030491906135da565b60405180910390f35b34801561031957600080fd5b50610322610ad6565b60405161032f91906133ca565b60405180910390f35b34801561034457600080fd5b5061035f600480360381019061035a91906135f5565b610ae9565b005b34801561036d57600080fd5b50610388600480360381019061038391906134d6565b610b49565b005b34801561039657600080fd5b506103b160048036038101906103ac919061358b565b610c06565b6040516103be91906135da565b60405180910390f35b3480156103d357600080fd5b506103dc610cab565b6040516103f199989796959493929190613648565b60405180910390f35b34801561040657600080fd5b50610421600480360381019061041c9190613708565b610d96565b005b34801561042f57600080fd5b5061044a600480360381019061044591906135f5565b610e2f565b005b34801561045857600080fd5b50610473600480360381019061046e9190613735565b610e4f565b6040516104809190613820565b60405180910390f35b34801561049557600080fd5b506104b060048036038101906104ab91906134d6565b610efd565b6040516104bd91906135da565b60405180910390f35b3480156104d257600080fd5b506104ed60048036038101906104e89190613977565b610f6e565b005b3480156104fb57600080fd5b50610516600480360381019061051191906134d6565b611004565b6040516105239190613544565b60405180910390f35b34801561053857600080fd5b50610553600480360381019061054e91906139f6565b6110b6565b005b34801561056157600080fd5b5061056a61113c565b604051610577919061347e565b60405180910390f35b34801561058c57600080fd5b506105a760048036038101906105a29190613735565b6111ca565b6040516105b491906135da565b60405180910390f35b3480156105c957600080fd5b506105d2611282565b005b3480156105e057600080fd5b506105e961130a565b6040516105f69190613544565b60405180910390f35b34801561060b57600080fd5b50610614611334565b604051610621919061347e565b60405180910390f35b34801561063657600080fd5b5061063f6113c6565b60405161064c91906133ca565b60405180910390f35b34801561066157600080fd5b5061067c60048036038101906106779190613a23565b6113d9565b005b34801561068a57600080fd5b506106a560048036038101906106a09190613708565b6113ef565b005b3480156106b357600080fd5b506106ce60048036038101906106c99190613a63565b611488565b005b3480156106dc57600080fd5b506106f760048036038101906106f29190613bd6565b6115ce565b005b34801561070557600080fd5b50610720600480360381019061071b9190613c59565b611630565b005b34801561072e57600080fd5b5061073761176f565b60405161074491906135da565b60405180910390f35b34801561075957600080fd5b50610774600480360381019061076f91906134d6565b611775565b604051610781919061347e565b60405180910390f35b34801561079657600080fd5b506107b160048036038101906107ac9190613c59565b61181c565b005b6107cd60048036038101906107c89190613d61565b61193f565b005b3480156107db57600080fd5b506107f660048036038101906107f19190613dbd565b611c09565b60405161080391906133ca565b60405180910390f35b34801561081857600080fd5b50610833600480360381019061082e9190613735565b611c9d565b005b34801561084157600080fd5b5061084a611d95565b60405161085791906135da565b60405180910390f35b34801561086c57600080fd5b50610875611d9b565b60405161088291906135da565b60405180910390f35b600061089682611da0565b9050919050565b6060600080546108ac90613e2c565b80601f01602080910402602001604051908101604052809291908181526020018280546108d890613e2c565b80156109255780601f106108fa57610100808354040283529160200191610925565b820191906000526020600020905b81548152906001019060200180831161090857829003601f168201915b5050505050905090565b600061093a82611e1a565b610979576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097090613ed0565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109bf82611004565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2790613f62565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a4f611e86565b73ffffffffffffffffffffffffffffffffffffffff161480610a7e5750610a7d81610a78611e86565b611c09565b5b610abd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab490613ff4565b60405180910390fd5b610ac78383611e8e565b505050565b6000600b54905090565b601460009054906101000a900460ff1681565b610afa610af4611e86565b82611f47565b610b39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3090614086565b60405180910390fd5b610b44838383612025565b505050565b610b51611e86565b73ffffffffffffffffffffffffffffffffffffffff16610b6f61130a565b73ffffffffffffffffffffffffffffffffffffffff1614610bc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bbc906140f2565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050610c0357600080fd5b50565b6000610c11836111ca565b8210610c52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4990614184565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6060600080600080600080600080600d600e54600f54600c54601054601154600b54601460009054906101000a900460ff16601460019054906101000a900460ff16888054610cf990613e2c565b80601f0160208091040260200160405190810160405280929190818152602001828054610d2590613e2c565b8015610d725780601f10610d4757610100808354040283529160200191610d72565b820191906000526020600020905b815481529060010190602001808311610d5557829003601f168201915b50505050509850985098509850985098509850985098509850909192939495969798565b610d9e611e86565b73ffffffffffffffffffffffffffffffffffffffff16610dbc61130a565b73ffffffffffffffffffffffffffffffffffffffff1614610e12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e09906140f2565b60405180910390fd5b80601460016101000a81548160ff02191690831515021790555050565b610e4a838383604051806020016040528060008152506115ce565b505050565b60606000610e5c836111ca565b905060008167ffffffffffffffff811115610e7a57610e7961384c565b5b604051908082528060200260200182016040528015610ea85781602001602082028036833780820191505090505b50905060005b82811015610ef257610ec08582610c06565b828281518110610ed357610ed26141a4565b5b6020026020010181815250508080610eea90614202565b915050610eae565b508092505050919050565b6000610f0761228c565b8210610f48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3f906142bd565b60405180910390fd5b60088281548110610f5c57610f5b6141a4565b5b90600052602060002001549050919050565b610f76611e86565b73ffffffffffffffffffffffffffffffffffffffff16610f9461130a565b73ffffffffffffffffffffffffffffffffffffffff1614610fea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe1906140f2565b60405180910390fd5b8060159080519060200190611000929190613273565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156110ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a49061434f565b60405180910390fd5b80915050919050565b6110be611e86565b73ffffffffffffffffffffffffffffffffffffffff166110dc61130a565b73ffffffffffffffffffffffffffffffffffffffff1614611132576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611129906140f2565b60405180910390fd5b8060128190555050565b6015805461114990613e2c565b80601f016020809104026020016040519081016040528092919081815260200182805461117590613e2c565b80156111c25780601f10611197576101008083540402835291602001916111c2565b820191906000526020600020905b8154815290600101906020018083116111a557829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561123b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611232906143e1565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61128a611e86565b73ffffffffffffffffffffffffffffffffffffffff166112a861130a565b73ffffffffffffffffffffffffffffffffffffffff16146112fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f5906140f2565b60405180910390fd5b6113086000612299565b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461134390613e2c565b80601f016020809104026020016040519081016040528092919081815260200182805461136f90613e2c565b80156113bc5780601f10611391576101008083540402835291602001916113bc565b820191906000526020600020905b81548152906001019060200180831161139f57829003601f168201915b5050505050905090565b601460019054906101000a900460ff1681565b6113eb6113e4611e86565b838361235f565b5050565b6113f7611e86565b73ffffffffffffffffffffffffffffffffffffffff1661141561130a565b73ffffffffffffffffffffffffffffffffffffffff161461146b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611462906140f2565b60405180910390fd5b80601460006101000a81548160ff02191690831515021790555050565b611490611e86565b73ffffffffffffffffffffffffffffffffffffffff166114ae61130a565b73ffffffffffffffffffffffffffffffffffffffff1614611504576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114fb906140f2565b60405180910390fd5b600b54611e596115149190614401565b881115611556576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154d90614481565b60405180910390fd5b87600e8190555086600c8190555085600d908051906020019061157a929190613273565b50846010819055508360118190555082600f8190555080601460006101000a81548160ff02191690831515021790555081601460016101000a81548160ff0219169083151502179055505050505050505050565b6115df6115d9611e86565b83611f47565b61161e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161590614086565b60405180910390fd5b61162a848484846124cc565b50505050565b611638611e86565b73ffffffffffffffffffffffffffffffffffffffff1661165661130a565b73ffffffffffffffffffffffffffffffffffffffff16146116ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a3906140f2565b60405180910390fd5b6008826013546116bc91906144a1565b11156116fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f490614543565b60405180910390fd5b6000600190505b82811161176a57600b600081548092919061171e90614202565b9190505550600160135461173291906144a1565b6013819055506000611e5960135461174a91906144a1565b90506117568382612528565b50808061176290614202565b915050611704565b505050565b600c5481565b606061178082611e1a565b6117bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b6906145d5565b60405180910390fd5b60006117c9612546565b905060008151116117e95760405180602001604052806000815250611814565b806117f3846125d8565b604051602001611804929190614631565b6040516020818303038152906040525b915050919050565b611824611e86565b73ffffffffffffffffffffffffffffffffffffffff1661184261130a565b73ffffffffffffffffffffffffffffffffffffffff1614611898576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188f906140f2565b60405180910390fd5b611e5982600b546118a991906144a1565b11156118ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e190614481565b60405180910390fd5b6000600190505b82811161193a57600b600081548092919061190b90614202565b9190505550600061191a612739565b90506119268382612528565b50808061193290614202565b9150506118f1565b505050565b81600c5461194d9190614655565b34101561198f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611986906146fb565b60405180910390fd5b60011515601460009054906101000a900460ff161515146119e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119dc90614767565b60405180910390fd5b60008211611a28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1f906147d3565b60405180910390fd5b601054821115611a6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6490614865565b60405180910390fd5b600e54821115611ab2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa9906148d1565b60405180910390fd5b601154611abe336111ca565b83611ac991906144a1565b1115611b0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b019061493d565b60405180910390fd5b60011515601460019054906101000a900460ff1615151415611b9c57600033604051602001611b3991906149a5565b604051602081830303815290604052805190602001209050611b5b818361285c565b611b9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9190614a0c565b60405180910390fd5b505b6000600190505b828111611c0457600b6000815480929190611bbd90614202565b9190505550600e6000815480929190611bd590614a2c565b91905055506000611be4612739565b9050611bf03382612528565b508080611bfc90614202565b915050611ba3565b505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611ca5611e86565b73ffffffffffffffffffffffffffffffffffffffff16611cc361130a565b73ffffffffffffffffffffffffffffffffffffffff1614611d19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d10906140f2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611d89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8090614ac8565b60405180910390fd5b611d9281612299565b50565b611e5981565b600881565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611e135750611e1282612913565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611f0183611004565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611f5282611e1a565b611f91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8890614b5a565b60405180910390fd5b6000611f9c83611004565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061200b57508373ffffffffffffffffffffffffffffffffffffffff16611ff38461092f565b73ffffffffffffffffffffffffffffffffffffffff16145b8061201c575061201b8185611c09565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661204582611004565b73ffffffffffffffffffffffffffffffffffffffff161461209b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209290614bec565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561210b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161210290614c7e565b60405180910390fd5b6121168383836129f5565b612121600082611e8e565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121719190614401565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121c891906144a1565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612287838383612a05565b505050565b6000600880549050905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156123ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123c590614cea565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516124bf91906133ca565b60405180910390a3505050565b6124d7848484612025565b6124e384848484612a0a565b612522576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161251990614d7c565b60405180910390fd5b50505050565b612542828260405180602001604052806000815250612b92565b5050565b60606015805461255590613e2c565b80601f016020809104026020016040519081016040528092919081815260200182805461258190613e2c565b80156125ce5780601f106125a3576101008083540402835291602001916125ce565b820191906000526020600020905b8154815290600101906020018083116125b157829003601f168201915b5050505050905090565b60606000821415612620576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612734565b600082905060005b6000821461265257808061263b90614202565b915050600a8261264b9190614dcb565b9150612628565b60008167ffffffffffffffff81111561266e5761266d61384c565b5b6040519080825280601f01601f1916602001820160405280156126a05781602001600182028036833780820191505090505b5090505b6000851461272d576001826126b99190614401565b9150600a856126c89190614dfc565b60306126d491906144a1565b60f81b8183815181106126ea576126e96141a4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856127269190614dcb565b94506126a4565b8093505050505b919050565b600080601654423360165460405160200161275693929190614e4e565b6040516020818303038152906040528051906020012060001c6127799190614dfc565b90506000806017600084815260200190815260200160002054146127b05760176000838152602001908152602001600020546127b2565b815b9050600081146127c257806127c6565b611e595b905060006017600060016016546127dd9190614401565b81526020019081526020016000205414612818576017600060016016546128049190614401565b815260200190815260200160002054612828565b60016016546128279190614401565b5b6017600084815260200190815260200160002081905550600160165461284e9190614401565b601681905550809250505090565b60008083905060005b8351811015612904576000848281518110612883576128826141a4565b5b602002602001015190508083116128c45782816040516020016128a7929190614eac565b6040516020818303038152906040528051906020012092506128f0565b80836040516020016128d7929190614eac565b6040516020818303038152906040528051906020012092505b5080806128fc90614202565b915050612865565b50601254811491505092915050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806129de57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806129ee57506129ed82612bed565b5b9050919050565b612a00838383612c57565b505050565b505050565b6000612a2b8473ffffffffffffffffffffffffffffffffffffffff16612d6b565b15612b85578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612a54611e86565b8786866040518563ffffffff1660e01b8152600401612a769493929190614f2d565b6020604051808303816000875af1925050508015612ab257506040513d601f19601f82011682018060405250810190612aaf9190614f8e565b60015b612b35573d8060008114612ae2576040519150601f19603f3d011682016040523d82523d6000602084013e612ae7565b606091505b50600081511415612b2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b2490614d7c565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612b8a565b600190505b949350505050565b612b9c8383612d8e565b612ba96000848484612a0a565b612be8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bdf90614d7c565b60405180910390fd5b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612c62838383612f68565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612ca557612ca081612f6d565b612ce4565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612ce357612ce28382612fb6565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612d2757612d2281613123565b612d66565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612d6557612d6482826131f4565b5b5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612dfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612df590615007565b60405180910390fd5b612e0781611e1a565b15612e47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e3e90615073565b60405180910390fd5b612e53600083836129f5565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ea391906144a1565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612f6460008383612a05565b5050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612fc3846111ca565b612fcd9190614401565b90506000600760008481526020019081526020016000205490508181146130b2576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506131379190614401565b9050600060096000848152602001908152602001600020549050600060088381548110613167576131666141a4565b5b906000526020600020015490508060088381548110613189576131886141a4565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806131d8576131d7615093565b5b6001900381819060005260206000200160009055905550505050565b60006131ff836111ca565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b82805461327f90613e2c565b90600052602060002090601f0160209004810192826132a157600085556132e8565b82601f106132ba57805160ff19168380011785556132e8565b828001600101855582156132e8579182015b828111156132e75782518255916020019190600101906132cc565b5b5090506132f591906132f9565b5090565b5b808211156133125760008160009055506001016132fa565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61335f8161332a565b811461336a57600080fd5b50565b60008135905061337c81613356565b92915050565b60006020828403121561339857613397613320565b5b60006133a68482850161336d565b91505092915050565b60008115159050919050565b6133c4816133af565b82525050565b60006020820190506133df60008301846133bb565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561341f578082015181840152602081019050613404565b8381111561342e576000848401525b50505050565b6000601f19601f8301169050919050565b6000613450826133e5565b61345a81856133f0565b935061346a818560208601613401565b61347381613434565b840191505092915050565b600060208201905081810360008301526134988184613445565b905092915050565b6000819050919050565b6134b3816134a0565b81146134be57600080fd5b50565b6000813590506134d0816134aa565b92915050565b6000602082840312156134ec576134eb613320565b5b60006134fa848285016134c1565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061352e82613503565b9050919050565b61353e81613523565b82525050565b60006020820190506135596000830184613535565b92915050565b61356881613523565b811461357357600080fd5b50565b6000813590506135858161355f565b92915050565b600080604083850312156135a2576135a1613320565b5b60006135b085828601613576565b92505060206135c1858286016134c1565b9150509250929050565b6135d4816134a0565b82525050565b60006020820190506135ef60008301846135cb565b92915050565b60008060006060848603121561360e5761360d613320565b5b600061361c86828701613576565b935050602061362d86828701613576565b925050604061363e868287016134c1565b9150509250925092565b6000610120820190508181036000830152613663818c613445565b9050613672602083018b6135cb565b61367f604083018a6135cb565b61368c60608301896135cb565b61369960808301886135cb565b6136a660a08301876135cb565b6136b360c08301866135cb565b6136c060e08301856133bb565b6136ce6101008301846133bb565b9a9950505050505050505050565b6136e5816133af565b81146136f057600080fd5b50565b600081359050613702816136dc565b92915050565b60006020828403121561371e5761371d613320565b5b600061372c848285016136f3565b91505092915050565b60006020828403121561374b5761374a613320565b5b600061375984828501613576565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613797816134a0565b82525050565b60006137a9838361378e565b60208301905092915050565b6000602082019050919050565b60006137cd82613762565b6137d7818561376d565b93506137e28361377e565b8060005b838110156138135781516137fa888261379d565b9750613805836137b5565b9250506001810190506137e6565b5085935050505092915050565b6000602082019050818103600083015261383a81846137c2565b905092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61388482613434565b810181811067ffffffffffffffff821117156138a3576138a261384c565b5b80604052505050565b60006138b6613316565b90506138c2828261387b565b919050565b600067ffffffffffffffff8211156138e2576138e161384c565b5b6138eb82613434565b9050602081019050919050565b82818337600083830152505050565b600061391a613915846138c7565b6138ac565b90508281526020810184848401111561393657613935613847565b5b6139418482856138f8565b509392505050565b600082601f83011261395e5761395d613842565b5b813561396e848260208601613907565b91505092915050565b60006020828403121561398d5761398c613320565b5b600082013567ffffffffffffffff8111156139ab576139aa613325565b5b6139b784828501613949565b91505092915050565b6000819050919050565b6139d3816139c0565b81146139de57600080fd5b50565b6000813590506139f0816139ca565b92915050565b600060208284031215613a0c57613a0b613320565b5b6000613a1a848285016139e1565b91505092915050565b60008060408385031215613a3a57613a39613320565b5b6000613a4885828601613576565b9250506020613a59858286016136f3565b9150509250929050565b600080600080600080600080610100898b031215613a8457613a83613320565b5b6000613a928b828c016134c1565b9850506020613aa38b828c016134c1565b975050604089013567ffffffffffffffff811115613ac457613ac3613325565b5b613ad08b828c01613949565b9650506060613ae18b828c016134c1565b9550506080613af28b828c016134c1565b94505060a0613b038b828c016134c1565b93505060c0613b148b828c016136f3565b92505060e0613b258b828c016136f3565b9150509295985092959890939650565b600067ffffffffffffffff821115613b5057613b4f61384c565b5b613b5982613434565b9050602081019050919050565b6000613b79613b7484613b35565b6138ac565b905082815260208101848484011115613b9557613b94613847565b5b613ba08482856138f8565b509392505050565b600082601f830112613bbd57613bbc613842565b5b8135613bcd848260208601613b66565b91505092915050565b60008060008060808587031215613bf057613bef613320565b5b6000613bfe87828801613576565b9450506020613c0f87828801613576565b9350506040613c20878288016134c1565b925050606085013567ffffffffffffffff811115613c4157613c40613325565b5b613c4d87828801613ba8565b91505092959194509250565b60008060408385031215613c7057613c6f613320565b5b6000613c7e858286016134c1565b9250506020613c8f85828601613576565b9150509250929050565b600067ffffffffffffffff821115613cb457613cb361384c565b5b602082029050602081019050919050565b600080fd5b6000613cdd613cd884613c99565b6138ac565b90508083825260208201905060208402830185811115613d0057613cff613cc5565b5b835b81811015613d295780613d1588826139e1565b845260208401935050602081019050613d02565b5050509392505050565b600082601f830112613d4857613d47613842565b5b8135613d58848260208601613cca565b91505092915050565b60008060408385031215613d7857613d77613320565b5b6000613d86858286016134c1565b925050602083013567ffffffffffffffff811115613da757613da6613325565b5b613db385828601613d33565b9150509250929050565b60008060408385031215613dd457613dd3613320565b5b6000613de285828601613576565b9250506020613df385828601613576565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613e4457607f821691505b60208210811415613e5857613e57613dfd565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613eba602c836133f0565b9150613ec582613e5e565b604082019050919050565b60006020820190508181036000830152613ee981613ead565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613f4c6021836133f0565b9150613f5782613ef0565b604082019050919050565b60006020820190508181036000830152613f7b81613f3f565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000613fde6038836133f0565b9150613fe982613f82565b604082019050919050565b6000602082019050818103600083015261400d81613fd1565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b60006140706031836133f0565b915061407b82614014565b604082019050919050565b6000602082019050818103600083015261409f81614063565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006140dc6020836133f0565b91506140e7826140a6565b602082019050919050565b6000602082019050818103600083015261410b816140cf565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b600061416e602b836133f0565b915061417982614112565b604082019050919050565b6000602082019050818103600083015261419d81614161565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061420d826134a0565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156142405761423f6141d3565b5b600182019050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b60006142a7602c836133f0565b91506142b28261424b565b604082019050919050565b600060208201905081810360008301526142d68161429a565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b60006143396029836133f0565b9150614344826142dd565b604082019050919050565b600060208201905081810360008301526143688161432c565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b60006143cb602a836133f0565b91506143d68261436f565b604082019050919050565b600060208201905081810360008301526143fa816143be565b9050919050565b600061440c826134a0565b9150614417836134a0565b92508282101561442a576144296141d3565b5b828203905092915050565b7f457863656564656420737570706c790000000000000000000000000000000000600082015250565b600061446b600f836133f0565b915061447682614435565b602082019050919050565b6000602082019050818103600083015261449a8161445e565b9050919050565b60006144ac826134a0565b91506144b7836134a0565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156144ec576144eb6141d3565b5b828201905092915050565b7f45786365656465642056495020737570706c7900000000000000000000000000600082015250565b600061452d6013836133f0565b9150614538826144f7565b602082019050919050565b6000602082019050818103600083015261455c81614520565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006145bf602f836133f0565b91506145ca82614563565b604082019050919050565b600060208201905081810360008301526145ee816145b2565b9050919050565b600081905092915050565b600061460b826133e5565b61461581856145f5565b9350614625818560208601613401565b80840191505092915050565b600061463d8285614600565b91506146498284614600565b91508190509392505050565b6000614660826134a0565b915061466b836134a0565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156146a4576146a36141d3565b5b828202905092915050565b7f496e73756666696369656e742066756e64730000000000000000000000000000600082015250565b60006146e56012836133f0565b91506146f0826146af565b602082019050919050565b60006020820190508181036000830152614714816146d8565b9050919050565b7f53616c65206861736e2774207374617274656400000000000000000000000000600082015250565b60006147516013836133f0565b915061475c8261471b565b602082019050919050565b6000602082019050818103600083015261478081614744565b9050919050565b7f4e65656420746f206d696e74206174206c656173742031204e46540000000000600082015250565b60006147bd601b836133f0565b91506147c882614787565b602082019050919050565b600060208201905081810360008301526147ec816147b0565b9050919050565b7f4d6178206d696e7420616d6f756e7420706572207472616e73616374696f6e2060008201527f6578636565646564000000000000000000000000000000000000000000000000602082015250565b600061484f6028836133f0565b915061485a826147f3565b604082019050919050565b6000602082019050818103600083015261487e81614842565b9050919050565b7f5765277265206174206d617820737570706c7921000000000000000000000000600082015250565b60006148bb6014836133f0565b91506148c682614885565b602082019050919050565b600060208201905081810360008301526148ea816148ae565b9050919050565b7f4d6178204e465420706572206164647265737320657863656564656400000000600082015250565b6000614927601c836133f0565b9150614932826148f1565b602082019050919050565b600060208201905081810360008301526149568161491a565b9050919050565b60008160601b9050919050565b60006149758261495d565b9050919050565b60006149878261496a565b9050919050565b61499f61499a82613523565b61497c565b82525050565b60006149b1828461498e565b60148201915081905092915050565b7f55736572206973206e6f742077686974656c6973746564000000000000000000600082015250565b60006149f66017836133f0565b9150614a01826149c0565b602082019050919050565b60006020820190508181036000830152614a25816149e9565b9050919050565b6000614a37826134a0565b91506000821415614a4b57614a4a6141d3565b5b600182039050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614ab26026836133f0565b9150614abd82614a56565b604082019050919050565b60006020820190508181036000830152614ae181614aa5565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614b44602c836133f0565b9150614b4f82614ae8565b604082019050919050565b60006020820190508181036000830152614b7381614b37565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000614bd66025836133f0565b9150614be182614b7a565b604082019050919050565b60006020820190508181036000830152614c0581614bc9565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614c686024836133f0565b9150614c7382614c0c565b604082019050919050565b60006020820190508181036000830152614c9781614c5b565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614cd46019836133f0565b9150614cdf82614c9e565b602082019050919050565b60006020820190508181036000830152614d0381614cc7565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614d666032836133f0565b9150614d7182614d0a565b604082019050919050565b60006020820190508181036000830152614d9581614d59565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614dd6826134a0565b9150614de1836134a0565b925082614df157614df0614d9c565b5b828204905092915050565b6000614e07826134a0565b9150614e12836134a0565b925082614e2257614e21614d9c565b5b828206905092915050565b6000819050919050565b614e48614e43826134a0565b614e2d565b82525050565b6000614e5a8286614e37565b602082019150614e6a828561498e565b601482019150614e7a8284614e37565b602082019150819050949350505050565b6000819050919050565b614ea6614ea1826139c0565b614e8b565b82525050565b6000614eb88285614e95565b602082019150614ec88284614e95565b6020820191508190509392505050565b600081519050919050565b600082825260208201905092915050565b6000614eff82614ed8565b614f098185614ee3565b9350614f19818560208601613401565b614f2281613434565b840191505092915050565b6000608082019050614f426000830187613535565b614f4f6020830186613535565b614f5c60408301856135cb565b8181036060830152614f6e8184614ef4565b905095945050505050565b600081519050614f8881613356565b92915050565b600060208284031215614fa457614fa3613320565b5b6000614fb284828501614f79565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614ff16020836133f0565b9150614ffc82614fbb565b602082019050919050565b6000602082019050818103600083015261502081614fe4565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b600061505d601c836133f0565b915061506882615027565b602082019050919050565b6000602082019050818103600083015261508c81615050565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea26469706673582212204f169083d34de54cd35621dabd53cc2b444ad2763f7fc8e8ca0b19223e7ab70864736f6c634300080c0033
Deployed Bytecode Sourcemap
45657:5641:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46771:176;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26134:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27693:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27216:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46571:88;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46259:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28443:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51096:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39622:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48778:280;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;50210:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28853:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47142:318;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40144:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50309:95;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25828:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50106:97;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46338:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25558:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4730:103;;;;;;;;;;;;;:::i;:::-;;4079:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26303:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46297:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27986:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51206:89;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49570:531;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29109:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50409:366;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45846:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26478:334;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50780:311;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47885:882;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28212:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4988:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45721:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45763:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46771:176;46874:4;46903:36;46927:11;46903:23;:36::i;:::-;46896:43;;46771:176;;;:::o;26134:100::-;26188:13;26221:5;26214:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26134:100;:::o;27693:221::-;27769:7;27797:16;27805:7;27797;:16::i;:::-;27789:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27882:15;:24;27898:7;27882:24;;;;;;;;;;;;;;;;;;;;;27875:31;;27693:221;;;:::o;27216:411::-;27297:13;27313:23;27328:7;27313:14;:23::i;:::-;27297:39;;27361:5;27355:11;;:2;:11;;;;27347:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;27455:5;27439:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;27464:37;27481:5;27488:12;:10;:12::i;:::-;27464:16;:37::i;:::-;27439:62;27417:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;27598:21;27607:2;27611:7;27598:8;:21::i;:::-;27286:341;27216:411;;:::o;46571:88::-;46623:4;46641:13;;46634:20;;46571:88;:::o;46259:34::-;;;;;;;;;;;;;:::o;28443:339::-;28638:41;28657:12;:10;:12::i;:::-;28671:7;28638:18;:41::i;:::-;28630:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;28746:28;28756:4;28762:2;28766:7;28746:9;:28::i;:::-;28443:339;;;:::o;51096:101::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51167:10:::1;51159:24;;:32;51184:6;51159:32;;;;;;;;;;;;;;;;;;;;;;;51151:41;;;::::0;::::1;;51096:101:::0;:::o;39622:256::-;39719:7;39755:23;39772:5;39755:16;:23::i;:::-;39747:5;:31;39739:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;39844:12;:19;39857:5;39844:19;;;;;;;;;;;;;;;:26;39864:5;39844:26;;;;;;;;;;;;39837:33;;39622:256;;;;:::o;48778:280::-;48828:13;48843:4;48849;48855;48861;48866;48871;48877;48882;48905:15;48921:17;;48939:15;;48955:14;;48970:13;;48984:18;;49004:13;;49019:14;;;;;;;;;;;49035:15;;;;;;;;;;;48897:154;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48778:280;;;;;;;;;:::o;50210:94::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50293:6:::1;50275:15;;:24;;;;;;;;;;;;;;;;;;50210:94:::0;:::o;28853:185::-;28991:39;29008:4;29014:2;29018:7;28991:39;;;;;;;;;;;;:16;:39::i;:::-;28853:185;;;:::o;47142:318::-;47202:16;47227:23;47253:17;47263:6;47253:9;:17::i;:::-;47227:43;;47275:25;47317:15;47303:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47275:58;;47343:9;47338:98;47358:15;47354:1;:19;47338:98;;;47400:30;47420:6;47428:1;47400:19;:30::i;:::-;47386:8;47395:1;47386:11;;;;;;;;:::i;:::-;;;;;;;:44;;;;;47375:3;;;;;:::i;:::-;;;;47338:98;;;;47447:8;47440:15;;;;47142:318;;;:::o;40144:233::-;40219:7;40255:30;:28;:30::i;:::-;40247:5;:38;40239:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;40352:10;40363:5;40352:17;;;;;;;;:::i;:::-;;;;;;;;;;40345:24;;40144:233;;;:::o;50309:95::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50388:11:::1;50378:7;:21;;;;;;;;;;;;:::i;:::-;;50309:95:::0;:::o;25828:239::-;25900:7;25920:13;25936:7;:16;25944:7;25936:16;;;;;;;;;;;;;;;;;;;;;25920:32;;25988:1;25971:19;;:5;:19;;;;25963:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26054:5;26047:12;;;25828:239;;;:::o;50106:97::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50194:4:::1;50175:16;:23;;;;50106:97:::0;:::o;46338:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;25558:208::-;25630:7;25675:1;25658:19;;:5;:19;;;;25650:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;25742:9;:16;25752:5;25742:16;;;;;;;;;;;;;;;;25735:23;;25558:208;;;:::o;4730:103::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4795:30:::1;4822:1;4795:18;:30::i;:::-;4730:103::o:0;4079:87::-;4125:7;4152:6;;;;;;;;;;;4145:13;;4079:87;:::o;26303:104::-;26359:13;26392:7;26385:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26303:104;:::o;46297:34::-;;;;;;;;;;;;;:::o;27986:155::-;28081:52;28100:12;:10;:12::i;:::-;28114:8;28124;28081:18;:52::i;:::-;27986:155;;:::o;51206:89::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51284:6:::1;51267:14;;:23;;;;;;;;;;;;;;;;;;51206:89:::0;:::o;49570:531::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49795:13:::1;;45755:4;49782:26;;;;:::i;:::-;49770:7;:39;;49762:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;49854:7;49834:17;:27;;;;49883:4;49866:14;:21;;;;49910:4;49892:15;:22;;;;;;;;;;;;:::i;:::-;;49935:19;49919:13;:35;;;;49980:15;49959:18;:36;;;;50018:7;50000:15;:25;;;;50047:9;50030:14;;:26;;;;;;;;;;;;;;;;;;50079:17;50061:15;;:35;;;;;;;;;;;;;;;;;;49570:531:::0;;;;;;;;:::o;29109:328::-;29284:41;29303:12;:10;:12::i;:::-;29317:7;29284:18;:41::i;:::-;29276:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;29390:39;29404:4;29410:2;29414:7;29423:5;29390:13;:39::i;:::-;29109:328;;;;:::o;50409:366::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45801:1:::1;50511:9;50497:11;;:23;;;;:::i;:::-;50496:43;;50488:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;50568:10;50595:1;50587:9;;50583:188;50607:9;50598:5;:18;50583:188;;50633:13;;:15;;;;;;;;;:::i;:::-;;;;;;50682:1;50668:11;;:15;;;;:::i;:::-;50654:11;:29;;;;50689:13;45755:4;50705:11;;:24;;;;:::i;:::-;50689:40;;50735:30;50745:9;50756:8;50735:9;:30::i;:::-;50627:144;50618:7;;;;;:::i;:::-;;;;50583:188;;;50483:292;50409:366:::0;;:::o;45846:38::-;;;;:::o;26478:334::-;26551:13;26585:16;26593:7;26585;:16::i;:::-;26577:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;26666:21;26690:10;:8;:10::i;:::-;26666:34;;26742:1;26724:7;26718:21;:25;:86;;;;;;;;;;;;;;;;;26770:7;26779:18;:7;:16;:18::i;:::-;26753:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;26718:86;26711:93;;;26478:334;;;:::o;50780:311::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45755:4:::1;50883:9;50867:13;;:25;;;;:::i;:::-;50866:41;;50858:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;50932:10;50959:1;50951:9;;50947:140;50971:9;50962:5;:18;50947:140;;50997:13;;:15;;;;;;;;;:::i;:::-;;;;;;51018:13;51034:11;:9;:11::i;:::-;51018:27;;51051:30;51061:9;51072:8;51051:9;:30::i;:::-;50991:96;50982:7;;;;;:::i;:::-;;;;50947:140;;;50853:238;50780:311:::0;;:::o;47885:882::-;48004:11;47987:14;;:28;;;;:::i;:::-;47974:9;:41;;47966:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;48069:4;48051:22;;:14;;;;;;;;;;;:22;;;48043:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;48124:1;48110:11;:15;48102:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;48185:13;;48170:11;:28;;48162:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;48271:17;;48256:11;:32;;48248:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;48368:18;;48342:21;48352:10;48342:9;:21::i;:::-;48327:11;:36;;;;:::i;:::-;48326:60;;48318:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;48454:4;48435:23;;:15;;;;;;;;;;;:23;;;48432:160;;;48466:12;48508:10;48491:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;48481:39;;;;;;48466:54;;48534:18;48541:4;48546:5;48534:6;:18::i;:::-;48526:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;48460:132;48432:160;48603:9;48615:1;48603:13;;48598:165;48623:11;48618:1;:16;48598:165;;48647:13;;:15;;;;;;;;;:::i;:::-;;;;;;48668:17;;:19;;;;;;;;;:::i;:::-;;;;;;48693:13;48709:11;:9;:11::i;:::-;48693:27;;48726:31;48736:10;48748:8;48726:9;:31::i;:::-;48641:122;48636:3;;;;;:::i;:::-;;;;48598:165;;;;47885:882;;:::o;28212:164::-;28309:4;28333:18;:25;28352:5;28333:25;;;;;;;;;;;;;;;:35;28359:8;28333:35;;;;;;;;;;;;;;;;;;;;;;;;;28326:42;;28212:164;;;;:::o;4988:201::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5097:1:::1;5077:22;;:8;:22;;;;5069:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;5153:28;5172:8;5153:18;:28::i;:::-;4988:201:::0;:::o;45721:38::-;45755:4;45721:38;:::o;45763:39::-;45801:1;45763:39;:::o;39314:224::-;39416:4;39455:35;39440:50;;;:11;:50;;;;:90;;;;39494:36;39518:11;39494:23;:36::i;:::-;39440:90;39433:97;;39314:224;;;:::o;30947:127::-;31012:4;31064:1;31036:30;;:7;:16;31044:7;31036:16;;;;;;;;;;;;;;;;;;;;;:30;;;;31029:37;;30947:127;;;:::o;2803:98::-;2856:7;2883:10;2876:17;;2803:98;:::o;35093:174::-;35195:2;35168:15;:24;35184:7;35168:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;35251:7;35247:2;35213:46;;35222:23;35237:7;35222:14;:23::i;:::-;35213:46;;;;;;;;;;;;35093:174;;:::o;31241:348::-;31334:4;31359:16;31367:7;31359;:16::i;:::-;31351:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;31435:13;31451:23;31466:7;31451:14;:23::i;:::-;31435:39;;31504:5;31493:16;;:7;:16;;;:51;;;;31537:7;31513:31;;:20;31525:7;31513:11;:20::i;:::-;:31;;;31493:51;:87;;;;31548:32;31565:5;31572:7;31548:16;:32::i;:::-;31493:87;31485:96;;;31241:348;;;;:::o;34350:625::-;34509:4;34482:31;;:23;34497:7;34482:14;:23::i;:::-;:31;;;34474:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;34588:1;34574:16;;:2;:16;;;;34566:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;34644:39;34665:4;34671:2;34675:7;34644:20;:39::i;:::-;34748:29;34765:1;34769:7;34748:8;:29::i;:::-;34809:1;34790:9;:15;34800:4;34790:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;34838:1;34821:9;:13;34831:2;34821:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;34869:2;34850:7;:16;34858:7;34850:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;34908:7;34904:2;34889:27;;34898:4;34889:27;;;;;;;;;;;;34929:38;34949:4;34955:2;34959:7;34929:19;:38::i;:::-;34350:625;;;:::o;39954:113::-;40015:7;40042:10;:17;;;;40035:24;;39954:113;:::o;5349:191::-;5423:16;5442:6;;;;;;;;;;;5423:25;;5468:8;5459:6;;:17;;;;;;;;;;;;;;;;;;5523:8;5492:40;;5513:8;5492:40;;;;;;;;;;;;5412:128;5349:191;:::o;35409:315::-;35564:8;35555:17;;:5;:17;;;;35547:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;35651:8;35613:18;:25;35632:5;35613:25;;;;;;;;;;;;;;;:35;35639:8;35613:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;35697:8;35675:41;;35690:5;35675:41;;;35707:8;35675:41;;;;;;:::i;:::-;;;;;;;;35409:315;;;:::o;30319:::-;30476:28;30486:4;30492:2;30496:7;30476:9;:28::i;:::-;30523:48;30546:4;30552:2;30556:7;30565:5;30523:22;:48::i;:::-;30515:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;30319:315;;;;:::o;31931:110::-;32007:26;32017:2;32021:7;32007:26;;;;;;;;;;;;:9;:26::i;:::-;31931:110;;:::o;46664:99::-;46724:13;46751:7;46744:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46664:99;:::o;365:723::-;421:13;651:1;642:5;:10;638:53;;;669:10;;;;;;;;;;;;;;;;;;;;;638:53;701:12;716:5;701:20;;732:14;757:78;772:1;764:4;:9;757:78;;790:8;;;;;:::i;:::-;;;;821:2;813:10;;;;;:::i;:::-;;;757:78;;;845:19;877:6;867:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;845:39;;895:154;911:1;902:5;:10;895:154;;939:1;929:11;;;;;:::i;:::-;;;1006:2;998:5;:10;;;;:::i;:::-;985:2;:24;;;;:::i;:::-;972:39;;955:6;962;955:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1035:2;1026:11;;;;;:::i;:::-;;;895:154;;;1073:6;1059:21;;;;;365:723;;;;:::o;47472:408::-;47510:7;47530:9;47618;;47574:15;47591:10;47603:9;;47557:56;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;47547:67;;;;;;47542:73;;:85;;;;:::i;:::-;47530:97;;47640:10;47665:1;47653:5;:8;47659:1;47653:8;;;;;;;;;;;;:13;:28;;47673:5;:8;47679:1;47673:8;;;;;;;;;;;;47653:28;;;47669:1;47653:28;47640:41;;47703:1;47694:5;:10;:31;;47720:5;47694:31;;;45755:4;47694:31;47686:39;;47775:1;47751:5;:20;47769:1;47757:9;;:13;;;;:::i;:::-;47751:20;;;;;;;;;;;;:25;:64;;47795:5;:20;47813:1;47801:9;;:13;;;;:::i;:::-;47795:20;;;;;;;;;;;;47751:64;;;47791:1;47779:9;;:13;;;;:::i;:::-;47751:64;47740:5;:8;47746:1;47740:8;;;;;;;;;;;:75;;;;47850:1;47838:9;;:13;;;;:::i;:::-;47826:9;:25;;;;47867:5;47860:12;;;;47472:408;:::o;49064:473::-;49141:4;49154:20;49177:4;49154:27;;49193:9;49188:301;49212:5;:12;49208:1;:16;49188:301;;;49237:20;49260:5;49266:1;49260:8;;;;;;;;:::i;:::-;;;;;;;;49237:31;;49296:12;49280;:28;49276:208;;49359:12;49373;49342:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;49332:55;;;;;;49317:70;;49276:208;;;49449:12;49463;49432:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;49422:55;;;;;;49407:70;;49276:208;49231:258;49226:3;;;;;:::i;:::-;;;;49188:301;;;;49516:16;;49500:12;:32;49493:39;;;49064:473;;;;:::o;25189:305::-;25291:4;25343:25;25328:40;;;:11;:40;;;;:105;;;;25400:33;25385:48;;;:11;:48;;;;25328:105;:158;;;;25450:36;25474:11;25450:23;:36::i;:::-;25328:158;25308:178;;25189:305;;;:::o;46955:181::-;47083:45;47110:4;47116:2;47120:7;47083:26;:45::i;:::-;46955:181;;;:::o;38171:125::-;;;;:::o;36289:799::-;36444:4;36465:15;:2;:13;;;:15::i;:::-;36461:620;;;36517:2;36501:36;;;36538:12;:10;:12::i;:::-;36552:4;36558:7;36567:5;36501:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;36497:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36760:1;36743:6;:13;:18;36739:272;;;36786:60;;;;;;;;;;:::i;:::-;;;;;;;;36739:272;36961:6;36955:13;36946:6;36942:2;36938:15;36931:38;36497:529;36634:41;;;36624:51;;;:6;:51;;;;36617:58;;;;;36461:620;37065:4;37058:11;;36289:799;;;;;;;:::o;32268:321::-;32398:18;32404:2;32408:7;32398:5;:18::i;:::-;32449:54;32480:1;32484:2;32488:7;32497:5;32449:22;:54::i;:::-;32427:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;32268:321;;;:::o;16863:157::-;16948:4;16987:25;16972:40;;;:11;:40;;;;16965:47;;16863:157;;;:::o;40990:589::-;41134:45;41161:4;41167:2;41171:7;41134:26;:45::i;:::-;41212:1;41196:18;;:4;:18;;;41192:187;;;41231:40;41263:7;41231:31;:40::i;:::-;41192:187;;;41301:2;41293:10;;:4;:10;;;41289:90;;41320:47;41353:4;41359:7;41320:32;:47::i;:::-;41289:90;41192:187;41407:1;41393:16;;:2;:16;;;41389:183;;;41426:45;41463:7;41426:36;:45::i;:::-;41389:183;;;41499:4;41493:10;;:2;:10;;;41489:83;;41520:40;41548:2;41552:7;41520:27;:40::i;:::-;41489:83;41389:183;40990:589;;;:::o;6780:326::-;6840:4;7097:1;7075:7;:19;;;:23;7068:30;;6780:326;;;:::o;32925:439::-;33019:1;33005:16;;:2;:16;;;;32997:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;33078:16;33086:7;33078;:16::i;:::-;33077:17;33069:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;33140:45;33169:1;33173:2;33177:7;33140:20;:45::i;:::-;33215:1;33198:9;:13;33208:2;33198:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;33246:2;33227:7;:16;33235:7;33227:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;33291:7;33287:2;33266:33;;33283:1;33266:33;;;;;;;;;;;;33312:44;33340:1;33344:2;33348:7;33312:19;:44::i;:::-;32925:439;;:::o;37660:126::-;;;;:::o;42302:164::-;42406:10;:17;;;;42379:15;:24;42395:7;42379:24;;;;;;;;;;;:44;;;;42434:10;42450:7;42434:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42302:164;:::o;43093:988::-;43359:22;43409:1;43384:22;43401:4;43384:16;:22::i;:::-;:26;;;;:::i;:::-;43359:51;;43421:18;43442:17;:26;43460:7;43442:26;;;;;;;;;;;;43421:47;;43589:14;43575:10;:28;43571:328;;43620:19;43642:12;:18;43655:4;43642:18;;;;;;;;;;;;;;;:34;43661:14;43642:34;;;;;;;;;;;;43620:56;;43726:11;43693:12;:18;43706:4;43693:18;;;;;;;;;;;;;;;:30;43712:10;43693:30;;;;;;;;;;;:44;;;;43843:10;43810:17;:30;43828:11;43810:30;;;;;;;;;;;:43;;;;43605:294;43571:328;43995:17;:26;44013:7;43995:26;;;;;;;;;;;43988:33;;;44039:12;:18;44052:4;44039:18;;;;;;;;;;;;;;;:34;44058:14;44039:34;;;;;;;;;;;44032:41;;;43174:907;;43093:988;;:::o;44376:1079::-;44629:22;44674:1;44654:10;:17;;;;:21;;;;:::i;:::-;44629:46;;44686:18;44707:15;:24;44723:7;44707:24;;;;;;;;;;;;44686:45;;45058:19;45080:10;45091:14;45080:26;;;;;;;;:::i;:::-;;;;;;;;;;45058:48;;45144:11;45119:10;45130;45119:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;45255:10;45224:15;:28;45240:11;45224:28;;;;;;;;;;;:41;;;;45396:15;:24;45412:7;45396:24;;;;;;;;;;;45389:31;;;45431:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;44447:1008;;;44376:1079;:::o;41880:221::-;41965:14;41982:20;41999:2;41982:16;:20::i;:::-;41965:37;;42040:7;42013:12;:16;42026:2;42013:16;;;;;;;;;;;;;;;:24;42030:6;42013:24;;;;;;;;;;;:34;;;;42087:6;42058:17;:26;42076:7;42058:26;;;;;;;;;;;:35;;;;41954:147;41880:221;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:619::-;5367:6;5375;5383;5432:2;5420:9;5411:7;5407:23;5403:32;5400:119;;;5438:79;;:::i;:::-;5400:119;5558:1;5583:53;5628:7;5619:6;5608:9;5604:22;5583:53;:::i;:::-;5573:63;;5529:117;5685:2;5711:53;5756:7;5747:6;5736:9;5732:22;5711:53;:::i;:::-;5701:63;;5656:118;5813:2;5839:53;5884:7;5875:6;5864:9;5860:22;5839:53;:::i;:::-;5829:63;;5784:118;5290:619;;;;;:::o;5915:1175::-;6240:4;6278:3;6267:9;6263:19;6255:27;;6328:9;6322:4;6318:20;6314:1;6303:9;6299:17;6292:47;6356:78;6429:4;6420:6;6356:78;:::i;:::-;6348:86;;6444:72;6512:2;6501:9;6497:18;6488:6;6444:72;:::i;:::-;6526;6594:2;6583:9;6579:18;6570:6;6526:72;:::i;:::-;6608;6676:2;6665:9;6661:18;6652:6;6608:72;:::i;:::-;6690:73;6758:3;6747:9;6743:19;6734:6;6690:73;:::i;:::-;6773;6841:3;6830:9;6826:19;6817:6;6773:73;:::i;:::-;6856;6924:3;6913:9;6909:19;6900:6;6856:73;:::i;:::-;6939:67;7001:3;6990:9;6986:19;6977:6;6939:67;:::i;:::-;7016;7078:3;7067:9;7063:19;7054:6;7016:67;:::i;:::-;5915:1175;;;;;;;;;;;;:::o;7096:116::-;7166:21;7181:5;7166:21;:::i;:::-;7159:5;7156:32;7146:60;;7202:1;7199;7192:12;7146:60;7096:116;:::o;7218:133::-;7261:5;7299:6;7286:20;7277:29;;7315:30;7339:5;7315:30;:::i;:::-;7218:133;;;;:::o;7357:323::-;7413:6;7462:2;7450:9;7441:7;7437:23;7433:32;7430:119;;;7468:79;;:::i;:::-;7430:119;7588:1;7613:50;7655:7;7646:6;7635:9;7631:22;7613:50;:::i;:::-;7603:60;;7559:114;7357:323;;;;:::o;7686:329::-;7745:6;7794:2;7782:9;7773:7;7769:23;7765:32;7762:119;;;7800:79;;:::i;:::-;7762:119;7920:1;7945:53;7990:7;7981:6;7970:9;7966:22;7945:53;:::i;:::-;7935:63;;7891:117;7686:329;;;;:::o;8021:114::-;8088:6;8122:5;8116:12;8106:22;;8021:114;;;:::o;8141:184::-;8240:11;8274:6;8269:3;8262:19;8314:4;8309:3;8305:14;8290:29;;8141:184;;;;:::o;8331:132::-;8398:4;8421:3;8413:11;;8451:4;8446:3;8442:14;8434:22;;8331:132;;;:::o;8469:108::-;8546:24;8564:5;8546:24;:::i;:::-;8541:3;8534:37;8469:108;;:::o;8583:179::-;8652:10;8673:46;8715:3;8707:6;8673:46;:::i;:::-;8751:4;8746:3;8742:14;8728:28;;8583:179;;;;:::o;8768:113::-;8838:4;8870;8865:3;8861:14;8853:22;;8768:113;;;:::o;8917:732::-;9036:3;9065:54;9113:5;9065:54;:::i;:::-;9135:86;9214:6;9209:3;9135:86;:::i;:::-;9128:93;;9245:56;9295:5;9245:56;:::i;:::-;9324:7;9355:1;9340:284;9365:6;9362:1;9359:13;9340:284;;;9441:6;9435:13;9468:63;9527:3;9512:13;9468:63;:::i;:::-;9461:70;;9554:60;9607:6;9554:60;:::i;:::-;9544:70;;9400:224;9387:1;9384;9380:9;9375:14;;9340:284;;;9344:14;9640:3;9633:10;;9041:608;;;8917:732;;;;:::o;9655:373::-;9798:4;9836:2;9825:9;9821:18;9813:26;;9885:9;9879:4;9875:20;9871:1;9860:9;9856:17;9849:47;9913:108;10016:4;10007:6;9913:108;:::i;:::-;9905:116;;9655:373;;;;:::o;10034:117::-;10143:1;10140;10133:12;10157:117;10266:1;10263;10256:12;10280:180;10328:77;10325:1;10318:88;10425:4;10422:1;10415:15;10449:4;10446:1;10439:15;10466:281;10549:27;10571:4;10549:27;:::i;:::-;10541:6;10537:40;10679:6;10667:10;10664:22;10643:18;10631:10;10628:34;10625:62;10622:88;;;10690:18;;:::i;:::-;10622:88;10730:10;10726:2;10719:22;10509:238;10466:281;;:::o;10753:129::-;10787:6;10814:20;;:::i;:::-;10804:30;;10843:33;10871:4;10863:6;10843:33;:::i;:::-;10753:129;;;:::o;10888:308::-;10950:4;11040:18;11032:6;11029:30;11026:56;;;11062:18;;:::i;:::-;11026:56;11100:29;11122:6;11100:29;:::i;:::-;11092:37;;11184:4;11178;11174:15;11166:23;;10888:308;;;:::o;11202:154::-;11286:6;11281:3;11276;11263:30;11348:1;11339:6;11334:3;11330:16;11323:27;11202:154;;;:::o;11362:412::-;11440:5;11465:66;11481:49;11523:6;11481:49;:::i;:::-;11465:66;:::i;:::-;11456:75;;11554:6;11547:5;11540:21;11592:4;11585:5;11581:16;11630:3;11621:6;11616:3;11612:16;11609:25;11606:112;;;11637:79;;:::i;:::-;11606:112;11727:41;11761:6;11756:3;11751;11727:41;:::i;:::-;11446:328;11362:412;;;;;:::o;11794:340::-;11850:5;11899:3;11892:4;11884:6;11880:17;11876:27;11866:122;;11907:79;;:::i;:::-;11866:122;12024:6;12011:20;12049:79;12124:3;12116:6;12109:4;12101:6;12097:17;12049:79;:::i;:::-;12040:88;;11856:278;11794:340;;;;:::o;12140:509::-;12209:6;12258:2;12246:9;12237:7;12233:23;12229:32;12226:119;;;12264:79;;:::i;:::-;12226:119;12412:1;12401:9;12397:17;12384:31;12442:18;12434:6;12431:30;12428:117;;;12464:79;;:::i;:::-;12428:117;12569:63;12624:7;12615:6;12604:9;12600:22;12569:63;:::i;:::-;12559:73;;12355:287;12140:509;;;;:::o;12655:77::-;12692:7;12721:5;12710:16;;12655:77;;;:::o;12738:122::-;12811:24;12829:5;12811:24;:::i;:::-;12804:5;12801:35;12791:63;;12850:1;12847;12840:12;12791:63;12738:122;:::o;12866:139::-;12912:5;12950:6;12937:20;12928:29;;12966:33;12993:5;12966:33;:::i;:::-;12866:139;;;;:::o;13011:329::-;13070:6;13119:2;13107:9;13098:7;13094:23;13090:32;13087:119;;;13125:79;;:::i;:::-;13087:119;13245:1;13270:53;13315:7;13306:6;13295:9;13291:22;13270:53;:::i;:::-;13260:63;;13216:117;13011:329;;;;:::o;13346:468::-;13411:6;13419;13468:2;13456:9;13447:7;13443:23;13439:32;13436:119;;;13474:79;;:::i;:::-;13436:119;13594:1;13619:53;13664:7;13655:6;13644:9;13640:22;13619:53;:::i;:::-;13609:63;;13565:117;13721:2;13747:50;13789:7;13780:6;13769:9;13765:22;13747:50;:::i;:::-;13737:60;;13692:115;13346:468;;;;;:::o;13820:1517::-;13946:6;13954;13962;13970;13978;13986;13994;14002;14051:3;14039:9;14030:7;14026:23;14022:33;14019:120;;;14058:79;;:::i;:::-;14019:120;14178:1;14203:53;14248:7;14239:6;14228:9;14224:22;14203:53;:::i;:::-;14193:63;;14149:117;14305:2;14331:53;14376:7;14367:6;14356:9;14352:22;14331:53;:::i;:::-;14321:63;;14276:118;14461:2;14450:9;14446:18;14433:32;14492:18;14484:6;14481:30;14478:117;;;14514:79;;:::i;:::-;14478:117;14619:63;14674:7;14665:6;14654:9;14650:22;14619:63;:::i;:::-;14609:73;;14404:288;14731:2;14757:53;14802:7;14793:6;14782:9;14778:22;14757:53;:::i;:::-;14747:63;;14702:118;14859:3;14886:53;14931:7;14922:6;14911:9;14907:22;14886:53;:::i;:::-;14876:63;;14830:119;14988:3;15015:53;15060:7;15051:6;15040:9;15036:22;15015:53;:::i;:::-;15005:63;;14959:119;15117:3;15144:50;15186:7;15177:6;15166:9;15162:22;15144:50;:::i;:::-;15134:60;;15088:116;15243:3;15270:50;15312:7;15303:6;15292:9;15288:22;15270:50;:::i;:::-;15260:60;;15214:116;13820:1517;;;;;;;;;;;:::o;15343:307::-;15404:4;15494:18;15486:6;15483:30;15480:56;;;15516:18;;:::i;:::-;15480:56;15554:29;15576:6;15554:29;:::i;:::-;15546:37;;15638:4;15632;15628:15;15620:23;;15343:307;;;:::o;15656:410::-;15733:5;15758:65;15774:48;15815:6;15774:48;:::i;:::-;15758:65;:::i;:::-;15749:74;;15846:6;15839:5;15832:21;15884:4;15877:5;15873:16;15922:3;15913:6;15908:3;15904:16;15901:25;15898:112;;;15929:79;;:::i;:::-;15898:112;16019:41;16053:6;16048:3;16043;16019:41;:::i;:::-;15739:327;15656:410;;;;;:::o;16085:338::-;16140:5;16189:3;16182:4;16174:6;16170:17;16166:27;16156:122;;16197:79;;:::i;:::-;16156:122;16314:6;16301:20;16339:78;16413:3;16405:6;16398:4;16390:6;16386:17;16339:78;:::i;:::-;16330:87;;16146:277;16085:338;;;;:::o;16429:943::-;16524:6;16532;16540;16548;16597:3;16585:9;16576:7;16572:23;16568:33;16565:120;;;16604:79;;:::i;:::-;16565:120;16724:1;16749:53;16794:7;16785:6;16774:9;16770:22;16749:53;:::i;:::-;16739:63;;16695:117;16851:2;16877:53;16922:7;16913:6;16902:9;16898:22;16877:53;:::i;:::-;16867:63;;16822:118;16979:2;17005:53;17050:7;17041:6;17030:9;17026:22;17005:53;:::i;:::-;16995:63;;16950:118;17135:2;17124:9;17120:18;17107:32;17166:18;17158:6;17155:30;17152:117;;;17188:79;;:::i;:::-;17152:117;17293:62;17347:7;17338:6;17327:9;17323:22;17293:62;:::i;:::-;17283:72;;17078:287;16429:943;;;;;;;:::o;17378:474::-;17446:6;17454;17503:2;17491:9;17482:7;17478:23;17474:32;17471:119;;;17509:79;;:::i;:::-;17471:119;17629:1;17654:53;17699:7;17690:6;17679:9;17675:22;17654:53;:::i;:::-;17644:63;;17600:117;17756:2;17782:53;17827:7;17818:6;17807:9;17803:22;17782:53;:::i;:::-;17772:63;;17727:118;17378:474;;;;;:::o;17858:311::-;17935:4;18025:18;18017:6;18014:30;18011:56;;;18047:18;;:::i;:::-;18011:56;18097:4;18089:6;18085:17;18077:25;;18157:4;18151;18147:15;18139:23;;17858:311;;;:::o;18175:117::-;18284:1;18281;18274:12;18315:710;18411:5;18436:81;18452:64;18509:6;18452:64;:::i;:::-;18436:81;:::i;:::-;18427:90;;18537:5;18566:6;18559:5;18552:21;18600:4;18593:5;18589:16;18582:23;;18653:4;18645:6;18641:17;18633:6;18629:30;18682:3;18674:6;18671:15;18668:122;;;18701:79;;:::i;:::-;18668:122;18816:6;18799:220;18833:6;18828:3;18825:15;18799:220;;;18908:3;18937:37;18970:3;18958:10;18937:37;:::i;:::-;18932:3;18925:50;19004:4;18999:3;18995:14;18988:21;;18875:144;18859:4;18854:3;18850:14;18843:21;;18799:220;;;18803:21;18417:608;;18315:710;;;;;:::o;19048:370::-;19119:5;19168:3;19161:4;19153:6;19149:17;19145:27;19135:122;;19176:79;;:::i;:::-;19135:122;19293:6;19280:20;19318:94;19408:3;19400:6;19393:4;19385:6;19381:17;19318:94;:::i;:::-;19309:103;;19125:293;19048:370;;;;:::o;19424:684::-;19517:6;19525;19574:2;19562:9;19553:7;19549:23;19545:32;19542:119;;;19580:79;;:::i;:::-;19542:119;19700:1;19725:53;19770:7;19761:6;19750:9;19746:22;19725:53;:::i;:::-;19715:63;;19671:117;19855:2;19844:9;19840:18;19827:32;19886:18;19878:6;19875:30;19872:117;;;19908:79;;:::i;:::-;19872:117;20013:78;20083:7;20074:6;20063:9;20059:22;20013:78;:::i;:::-;20003:88;;19798:303;19424:684;;;;;:::o;20114:474::-;20182:6;20190;20239:2;20227:9;20218:7;20214:23;20210:32;20207:119;;;20245:79;;:::i;:::-;20207:119;20365:1;20390:53;20435:7;20426:6;20415:9;20411:22;20390:53;:::i;:::-;20380:63;;20336:117;20492:2;20518:53;20563:7;20554:6;20543:9;20539:22;20518:53;:::i;:::-;20508:63;;20463:118;20114:474;;;;;:::o;20594:180::-;20642:77;20639:1;20632:88;20739:4;20736:1;20729:15;20763:4;20760:1;20753:15;20780:320;20824:6;20861:1;20855:4;20851:12;20841:22;;20908:1;20902:4;20898:12;20929:18;20919:81;;20985:4;20977:6;20973:17;20963:27;;20919:81;21047:2;21039:6;21036:14;21016:18;21013:38;21010:84;;;21066:18;;:::i;:::-;21010:84;20831:269;20780:320;;;:::o;21106:231::-;21246:34;21242:1;21234:6;21230:14;21223:58;21315:14;21310:2;21302:6;21298:15;21291:39;21106:231;:::o;21343:366::-;21485:3;21506:67;21570:2;21565:3;21506:67;:::i;:::-;21499:74;;21582:93;21671:3;21582:93;:::i;:::-;21700:2;21695:3;21691:12;21684:19;;21343:366;;;:::o;21715:419::-;21881:4;21919:2;21908:9;21904:18;21896:26;;21968:9;21962:4;21958:20;21954:1;21943:9;21939:17;21932:47;21996:131;22122:4;21996:131;:::i;:::-;21988:139;;21715:419;;;:::o;22140:220::-;22280:34;22276:1;22268:6;22264:14;22257:58;22349:3;22344:2;22336:6;22332:15;22325:28;22140:220;:::o;22366:366::-;22508:3;22529:67;22593:2;22588:3;22529:67;:::i;:::-;22522:74;;22605:93;22694:3;22605:93;:::i;:::-;22723:2;22718:3;22714:12;22707:19;;22366:366;;;:::o;22738:419::-;22904:4;22942:2;22931:9;22927:18;22919:26;;22991:9;22985:4;22981:20;22977:1;22966:9;22962:17;22955:47;23019:131;23145:4;23019:131;:::i;:::-;23011:139;;22738:419;;;:::o;23163:243::-;23303:34;23299:1;23291:6;23287:14;23280:58;23372:26;23367:2;23359:6;23355:15;23348:51;23163:243;:::o;23412:366::-;23554:3;23575:67;23639:2;23634:3;23575:67;:::i;:::-;23568:74;;23651:93;23740:3;23651:93;:::i;:::-;23769:2;23764:3;23760:12;23753:19;;23412:366;;;:::o;23784:419::-;23950:4;23988:2;23977:9;23973:18;23965:26;;24037:9;24031:4;24027:20;24023:1;24012:9;24008:17;24001:47;24065:131;24191:4;24065:131;:::i;:::-;24057:139;;23784:419;;;:::o;24209:236::-;24349:34;24345:1;24337:6;24333:14;24326:58;24418:19;24413:2;24405:6;24401:15;24394:44;24209:236;:::o;24451:366::-;24593:3;24614:67;24678:2;24673:3;24614:67;:::i;:::-;24607:74;;24690:93;24779:3;24690:93;:::i;:::-;24808:2;24803:3;24799:12;24792:19;;24451:366;;;:::o;24823:419::-;24989:4;25027:2;25016:9;25012:18;25004:26;;25076:9;25070:4;25066:20;25062:1;25051:9;25047:17;25040:47;25104:131;25230:4;25104:131;:::i;:::-;25096:139;;24823:419;;;:::o;25248:182::-;25388:34;25384:1;25376:6;25372:14;25365:58;25248:182;:::o;25436:366::-;25578:3;25599:67;25663:2;25658:3;25599:67;:::i;:::-;25592:74;;25675:93;25764:3;25675:93;:::i;:::-;25793:2;25788:3;25784:12;25777:19;;25436:366;;;:::o;25808:419::-;25974:4;26012:2;26001:9;25997:18;25989:26;;26061:9;26055:4;26051:20;26047:1;26036:9;26032:17;26025:47;26089:131;26215:4;26089:131;:::i;:::-;26081:139;;25808:419;;;:::o;26233:230::-;26373:34;26369:1;26361:6;26357:14;26350:58;26442:13;26437:2;26429:6;26425:15;26418:38;26233:230;:::o;26469:366::-;26611:3;26632:67;26696:2;26691:3;26632:67;:::i;:::-;26625:74;;26708:93;26797:3;26708:93;:::i;:::-;26826:2;26821:3;26817:12;26810:19;;26469:366;;;:::o;26841:419::-;27007:4;27045:2;27034:9;27030:18;27022:26;;27094:9;27088:4;27084:20;27080:1;27069:9;27065:17;27058:47;27122:131;27248:4;27122:131;:::i;:::-;27114:139;;26841:419;;;:::o;27266:180::-;27314:77;27311:1;27304:88;27411:4;27408:1;27401:15;27435:4;27432:1;27425:15;27452:180;27500:77;27497:1;27490:88;27597:4;27594:1;27587:15;27621:4;27618:1;27611:15;27638:233;27677:3;27700:24;27718:5;27700:24;:::i;:::-;27691:33;;27746:66;27739:5;27736:77;27733:103;;;27816:18;;:::i;:::-;27733:103;27863:1;27856:5;27852:13;27845:20;;27638:233;;;:::o;27877:231::-;28017:34;28013:1;28005:6;28001:14;27994:58;28086:14;28081:2;28073:6;28069:15;28062:39;27877:231;:::o;28114:366::-;28256:3;28277:67;28341:2;28336:3;28277:67;:::i;:::-;28270:74;;28353:93;28442:3;28353:93;:::i;:::-;28471:2;28466:3;28462:12;28455:19;;28114:366;;;:::o;28486:419::-;28652:4;28690:2;28679:9;28675:18;28667:26;;28739:9;28733:4;28729:20;28725:1;28714:9;28710:17;28703:47;28767:131;28893:4;28767:131;:::i;:::-;28759:139;;28486:419;;;:::o;28911:228::-;29051:34;29047:1;29039:6;29035:14;29028:58;29120:11;29115:2;29107:6;29103:15;29096:36;28911:228;:::o;29145:366::-;29287:3;29308:67;29372:2;29367:3;29308:67;:::i;:::-;29301:74;;29384:93;29473:3;29384:93;:::i;:::-;29502:2;29497:3;29493:12;29486:19;;29145:366;;;:::o;29517:419::-;29683:4;29721:2;29710:9;29706:18;29698:26;;29770:9;29764:4;29760:20;29756:1;29745:9;29741:17;29734:47;29798:131;29924:4;29798:131;:::i;:::-;29790:139;;29517:419;;;:::o;29942:229::-;30082:34;30078:1;30070:6;30066:14;30059:58;30151:12;30146:2;30138:6;30134:15;30127:37;29942:229;:::o;30177:366::-;30319:3;30340:67;30404:2;30399:3;30340:67;:::i;:::-;30333:74;;30416:93;30505:3;30416:93;:::i;:::-;30534:2;30529:3;30525:12;30518:19;;30177:366;;;:::o;30549:419::-;30715:4;30753:2;30742:9;30738:18;30730:26;;30802:9;30796:4;30792:20;30788:1;30777:9;30773:17;30766:47;30830:131;30956:4;30830:131;:::i;:::-;30822:139;;30549:419;;;:::o;30974:191::-;31014:4;31034:20;31052:1;31034:20;:::i;:::-;31029:25;;31068:20;31086:1;31068:20;:::i;:::-;31063:25;;31107:1;31104;31101:8;31098:34;;;31112:18;;:::i;:::-;31098:34;31157:1;31154;31150:9;31142:17;;30974:191;;;;:::o;31171:165::-;31311:17;31307:1;31299:6;31295:14;31288:41;31171:165;:::o;31342:366::-;31484:3;31505:67;31569:2;31564:3;31505:67;:::i;:::-;31498:74;;31581:93;31670:3;31581:93;:::i;:::-;31699:2;31694:3;31690:12;31683:19;;31342:366;;;:::o;31714:419::-;31880:4;31918:2;31907:9;31903:18;31895:26;;31967:9;31961:4;31957:20;31953:1;31942:9;31938:17;31931:47;31995:131;32121:4;31995:131;:::i;:::-;31987:139;;31714:419;;;:::o;32139:305::-;32179:3;32198:20;32216:1;32198:20;:::i;:::-;32193:25;;32232:20;32250:1;32232:20;:::i;:::-;32227:25;;32386:1;32318:66;32314:74;32311:1;32308:81;32305:107;;;32392:18;;:::i;:::-;32305:107;32436:1;32433;32429:9;32422:16;;32139:305;;;;:::o;32450:169::-;32590:21;32586:1;32578:6;32574:14;32567:45;32450:169;:::o;32625:366::-;32767:3;32788:67;32852:2;32847:3;32788:67;:::i;:::-;32781:74;;32864:93;32953:3;32864:93;:::i;:::-;32982:2;32977:3;32973:12;32966:19;;32625:366;;;:::o;32997:419::-;33163:4;33201:2;33190:9;33186:18;33178:26;;33250:9;33244:4;33240:20;33236:1;33225:9;33221:17;33214:47;33278:131;33404:4;33278:131;:::i;:::-;33270:139;;32997:419;;;:::o;33422:234::-;33562:34;33558:1;33550:6;33546:14;33539:58;33631:17;33626:2;33618:6;33614:15;33607:42;33422:234;:::o;33662:366::-;33804:3;33825:67;33889:2;33884:3;33825:67;:::i;:::-;33818:74;;33901:93;33990:3;33901:93;:::i;:::-;34019:2;34014:3;34010:12;34003:19;;33662:366;;;:::o;34034:419::-;34200:4;34238:2;34227:9;34223:18;34215:26;;34287:9;34281:4;34277:20;34273:1;34262:9;34258:17;34251:47;34315:131;34441:4;34315:131;:::i;:::-;34307:139;;34034:419;;;:::o;34459:148::-;34561:11;34598:3;34583:18;;34459:148;;;;:::o;34613:377::-;34719:3;34747:39;34780:5;34747:39;:::i;:::-;34802:89;34884:6;34879:3;34802:89;:::i;:::-;34795:96;;34900:52;34945:6;34940:3;34933:4;34926:5;34922:16;34900:52;:::i;:::-;34977:6;34972:3;34968:16;34961:23;;34723:267;34613:377;;;;:::o;34996:435::-;35176:3;35198:95;35289:3;35280:6;35198:95;:::i;:::-;35191:102;;35310:95;35401:3;35392:6;35310:95;:::i;:::-;35303:102;;35422:3;35415:10;;34996:435;;;;;:::o;35437:348::-;35477:7;35500:20;35518:1;35500:20;:::i;:::-;35495:25;;35534:20;35552:1;35534:20;:::i;:::-;35529:25;;35722:1;35654:66;35650:74;35647:1;35644:81;35639:1;35632:9;35625:17;35621:105;35618:131;;;35729:18;;:::i;:::-;35618:131;35777:1;35774;35770:9;35759:20;;35437:348;;;;:::o;35791:168::-;35931:20;35927:1;35919:6;35915:14;35908:44;35791:168;:::o;35965:366::-;36107:3;36128:67;36192:2;36187:3;36128:67;:::i;:::-;36121:74;;36204:93;36293:3;36204:93;:::i;:::-;36322:2;36317:3;36313:12;36306:19;;35965:366;;;:::o;36337:419::-;36503:4;36541:2;36530:9;36526:18;36518:26;;36590:9;36584:4;36580:20;36576:1;36565:9;36561:17;36554:47;36618:131;36744:4;36618:131;:::i;:::-;36610:139;;36337:419;;;:::o;36762:169::-;36902:21;36898:1;36890:6;36886:14;36879:45;36762:169;:::o;36937:366::-;37079:3;37100:67;37164:2;37159:3;37100:67;:::i;:::-;37093:74;;37176:93;37265:3;37176:93;:::i;:::-;37294:2;37289:3;37285:12;37278:19;;36937:366;;;:::o;37309:419::-;37475:4;37513:2;37502:9;37498:18;37490:26;;37562:9;37556:4;37552:20;37548:1;37537:9;37533:17;37526:47;37590:131;37716:4;37590:131;:::i;:::-;37582:139;;37309:419;;;:::o;37734:177::-;37874:29;37870:1;37862:6;37858:14;37851:53;37734:177;:::o;37917:366::-;38059:3;38080:67;38144:2;38139:3;38080:67;:::i;:::-;38073:74;;38156:93;38245:3;38156:93;:::i;:::-;38274:2;38269:3;38265:12;38258:19;;37917:366;;;:::o;38289:419::-;38455:4;38493:2;38482:9;38478:18;38470:26;;38542:9;38536:4;38532:20;38528:1;38517:9;38513:17;38506:47;38570:131;38696:4;38570:131;:::i;:::-;38562:139;;38289:419;;;:::o;38714:227::-;38854:34;38850:1;38842:6;38838:14;38831:58;38923:10;38918:2;38910:6;38906:15;38899:35;38714:227;:::o;38947:366::-;39089:3;39110:67;39174:2;39169:3;39110:67;:::i;:::-;39103:74;;39186:93;39275:3;39186:93;:::i;:::-;39304:2;39299:3;39295:12;39288:19;;38947:366;;;:::o;39319:419::-;39485:4;39523:2;39512:9;39508:18;39500:26;;39572:9;39566:4;39562:20;39558:1;39547:9;39543:17;39536:47;39600:131;39726:4;39600:131;:::i;:::-;39592:139;;39319:419;;;:::o;39744:170::-;39884:22;39880:1;39872:6;39868:14;39861:46;39744:170;:::o;39920:366::-;40062:3;40083:67;40147:2;40142:3;40083:67;:::i;:::-;40076:74;;40159:93;40248:3;40159:93;:::i;:::-;40277:2;40272:3;40268:12;40261:19;;39920:366;;;:::o;40292:419::-;40458:4;40496:2;40485:9;40481:18;40473:26;;40545:9;40539:4;40535:20;40531:1;40520:9;40516:17;40509:47;40573:131;40699:4;40573:131;:::i;:::-;40565:139;;40292:419;;;:::o;40717:178::-;40857:30;40853:1;40845:6;40841:14;40834:54;40717:178;:::o;40901:366::-;41043:3;41064:67;41128:2;41123:3;41064:67;:::i;:::-;41057:74;;41140:93;41229:3;41140:93;:::i;:::-;41258:2;41253:3;41249:12;41242:19;;40901:366;;;:::o;41273:419::-;41439:4;41477:2;41466:9;41462:18;41454:26;;41526:9;41520:4;41516:20;41512:1;41501:9;41497:17;41490:47;41554:131;41680:4;41554:131;:::i;:::-;41546:139;;41273:419;;;:::o;41698:94::-;41731:8;41779:5;41775:2;41771:14;41750:35;;41698:94;;;:::o;41798:::-;41837:7;41866:20;41880:5;41866:20;:::i;:::-;41855:31;;41798:94;;;:::o;41898:100::-;41937:7;41966:26;41986:5;41966:26;:::i;:::-;41955:37;;41898:100;;;:::o;42004:157::-;42109:45;42129:24;42147:5;42129:24;:::i;:::-;42109:45;:::i;:::-;42104:3;42097:58;42004:157;;:::o;42167:256::-;42279:3;42294:75;42365:3;42356:6;42294:75;:::i;:::-;42394:2;42389:3;42385:12;42378:19;;42414:3;42407:10;;42167:256;;;;:::o;42429:173::-;42569:25;42565:1;42557:6;42553:14;42546:49;42429:173;:::o;42608:366::-;42750:3;42771:67;42835:2;42830:3;42771:67;:::i;:::-;42764:74;;42847:93;42936:3;42847:93;:::i;:::-;42965:2;42960:3;42956:12;42949:19;;42608:366;;;:::o;42980:419::-;43146:4;43184:2;43173:9;43169:18;43161:26;;43233:9;43227:4;43223:20;43219:1;43208:9;43204:17;43197:47;43261:131;43387:4;43261:131;:::i;:::-;43253:139;;42980:419;;;:::o;43405:171::-;43444:3;43467:24;43485:5;43467:24;:::i;:::-;43458:33;;43513:4;43506:5;43503:15;43500:41;;;43521:18;;:::i;:::-;43500:41;43568:1;43561:5;43557:13;43550:20;;43405:171;;;:::o;43582:225::-;43722:34;43718:1;43710:6;43706:14;43699:58;43791:8;43786:2;43778:6;43774:15;43767:33;43582:225;:::o;43813:366::-;43955:3;43976:67;44040:2;44035:3;43976:67;:::i;:::-;43969:74;;44052:93;44141:3;44052:93;:::i;:::-;44170:2;44165:3;44161:12;44154:19;;43813:366;;;:::o;44185:419::-;44351:4;44389:2;44378:9;44374:18;44366:26;;44438:9;44432:4;44428:20;44424:1;44413:9;44409:17;44402:47;44466:131;44592:4;44466:131;:::i;:::-;44458:139;;44185:419;;;:::o;44610:231::-;44750:34;44746:1;44738:6;44734:14;44727:58;44819:14;44814:2;44806:6;44802:15;44795:39;44610:231;:::o;44847:366::-;44989:3;45010:67;45074:2;45069:3;45010:67;:::i;:::-;45003:74;;45086:93;45175:3;45086:93;:::i;:::-;45204:2;45199:3;45195:12;45188:19;;44847:366;;;:::o;45219:419::-;45385:4;45423:2;45412:9;45408:18;45400:26;;45472:9;45466:4;45462:20;45458:1;45447:9;45443:17;45436:47;45500:131;45626:4;45500:131;:::i;:::-;45492:139;;45219:419;;;:::o;45644:224::-;45784:34;45780:1;45772:6;45768:14;45761:58;45853:7;45848:2;45840:6;45836:15;45829:32;45644:224;:::o;45874:366::-;46016:3;46037:67;46101:2;46096:3;46037:67;:::i;:::-;46030:74;;46113:93;46202:3;46113:93;:::i;:::-;46231:2;46226:3;46222:12;46215:19;;45874:366;;;:::o;46246:419::-;46412:4;46450:2;46439:9;46435:18;46427:26;;46499:9;46493:4;46489:20;46485:1;46474:9;46470:17;46463:47;46527:131;46653:4;46527:131;:::i;:::-;46519:139;;46246:419;;;:::o;46671:223::-;46811:34;46807:1;46799:6;46795:14;46788:58;46880:6;46875:2;46867:6;46863:15;46856:31;46671:223;:::o;46900:366::-;47042:3;47063:67;47127:2;47122:3;47063:67;:::i;:::-;47056:74;;47139:93;47228:3;47139:93;:::i;:::-;47257:2;47252:3;47248:12;47241:19;;46900:366;;;:::o;47272:419::-;47438:4;47476:2;47465:9;47461:18;47453:26;;47525:9;47519:4;47515:20;47511:1;47500:9;47496:17;47489:47;47553:131;47679:4;47553:131;:::i;:::-;47545:139;;47272:419;;;:::o;47697:175::-;47837:27;47833:1;47825:6;47821:14;47814:51;47697:175;:::o;47878:366::-;48020:3;48041:67;48105:2;48100:3;48041:67;:::i;:::-;48034:74;;48117:93;48206:3;48117:93;:::i;:::-;48235:2;48230:3;48226:12;48219:19;;47878:366;;;:::o;48250:419::-;48416:4;48454:2;48443:9;48439:18;48431:26;;48503:9;48497:4;48493:20;48489:1;48478:9;48474:17;48467:47;48531:131;48657:4;48531:131;:::i;:::-;48523:139;;48250:419;;;:::o;48675:237::-;48815:34;48811:1;48803:6;48799:14;48792:58;48884:20;48879:2;48871:6;48867:15;48860:45;48675:237;:::o;48918:366::-;49060:3;49081:67;49145:2;49140:3;49081:67;:::i;:::-;49074:74;;49157:93;49246:3;49157:93;:::i;:::-;49275:2;49270:3;49266:12;49259:19;;48918:366;;;:::o;49290:419::-;49456:4;49494:2;49483:9;49479:18;49471:26;;49543:9;49537:4;49533:20;49529:1;49518:9;49514:17;49507:47;49571:131;49697:4;49571:131;:::i;:::-;49563:139;;49290:419;;;:::o;49715:180::-;49763:77;49760:1;49753:88;49860:4;49857:1;49850:15;49884:4;49881:1;49874:15;49901:185;49941:1;49958:20;49976:1;49958:20;:::i;:::-;49953:25;;49992:20;50010:1;49992:20;:::i;:::-;49987:25;;50031:1;50021:35;;50036:18;;:::i;:::-;50021:35;50078:1;50075;50071:9;50066:14;;49901:185;;;;:::o;50092:176::-;50124:1;50141:20;50159:1;50141:20;:::i;:::-;50136:25;;50175:20;50193:1;50175:20;:::i;:::-;50170:25;;50214:1;50204:35;;50219:18;;:::i;:::-;50204:35;50260:1;50257;50253:9;50248:14;;50092:176;;;;:::o;50274:79::-;50313:7;50342:5;50331:16;;50274:79;;;:::o;50359:157::-;50464:45;50484:24;50502:5;50484:24;:::i;:::-;50464:45;:::i;:::-;50459:3;50452:58;50359:157;;:::o;50522:538::-;50690:3;50705:75;50776:3;50767:6;50705:75;:::i;:::-;50805:2;50800:3;50796:12;50789:19;;50818:75;50889:3;50880:6;50818:75;:::i;:::-;50918:2;50913:3;50909:12;50902:19;;50931:75;51002:3;50993:6;50931:75;:::i;:::-;51031:2;51026:3;51022:12;51015:19;;51051:3;51044:10;;50522:538;;;;;;:::o;51066:79::-;51105:7;51134:5;51123:16;;51066:79;;;:::o;51151:157::-;51256:45;51276:24;51294:5;51276:24;:::i;:::-;51256:45;:::i;:::-;51251:3;51244:58;51151:157;;:::o;51314:397::-;51454:3;51469:75;51540:3;51531:6;51469:75;:::i;:::-;51569:2;51564:3;51560:12;51553:19;;51582:75;51653:3;51644:6;51582:75;:::i;:::-;51682:2;51677:3;51673:12;51666:19;;51702:3;51695:10;;51314:397;;;;;:::o;51717:98::-;51768:6;51802:5;51796:12;51786:22;;51717:98;;;:::o;51821:168::-;51904:11;51938:6;51933:3;51926:19;51978:4;51973:3;51969:14;51954:29;;51821:168;;;;:::o;51995:360::-;52081:3;52109:38;52141:5;52109:38;:::i;:::-;52163:70;52226:6;52221:3;52163:70;:::i;:::-;52156:77;;52242:52;52287:6;52282:3;52275:4;52268:5;52264:16;52242:52;:::i;:::-;52319:29;52341:6;52319:29;:::i;:::-;52314:3;52310:39;52303:46;;52085:270;51995:360;;;;:::o;52361:640::-;52556:4;52594:3;52583:9;52579:19;52571:27;;52608:71;52676:1;52665:9;52661:17;52652:6;52608:71;:::i;:::-;52689:72;52757:2;52746:9;52742:18;52733:6;52689:72;:::i;:::-;52771;52839:2;52828:9;52824:18;52815:6;52771:72;:::i;:::-;52890:9;52884:4;52880:20;52875:2;52864:9;52860:18;52853:48;52918:76;52989:4;52980:6;52918:76;:::i;:::-;52910:84;;52361:640;;;;;;;:::o;53007:141::-;53063:5;53094:6;53088:13;53079:22;;53110:32;53136:5;53110:32;:::i;:::-;53007:141;;;;:::o;53154:349::-;53223:6;53272:2;53260:9;53251:7;53247:23;53243:32;53240:119;;;53278:79;;:::i;:::-;53240:119;53398:1;53423:63;53478:7;53469:6;53458:9;53454:22;53423:63;:::i;:::-;53413:73;;53369:127;53154:349;;;;:::o;53509:182::-;53649:34;53645:1;53637:6;53633:14;53626:58;53509:182;:::o;53697:366::-;53839:3;53860:67;53924:2;53919:3;53860:67;:::i;:::-;53853:74;;53936:93;54025:3;53936:93;:::i;:::-;54054:2;54049:3;54045:12;54038:19;;53697:366;;;:::o;54069:419::-;54235:4;54273:2;54262:9;54258:18;54250:26;;54322:9;54316:4;54312:20;54308:1;54297:9;54293:17;54286:47;54350:131;54476:4;54350:131;:::i;:::-;54342:139;;54069:419;;;:::o;54494:178::-;54634:30;54630:1;54622:6;54618:14;54611:54;54494:178;:::o;54678:366::-;54820:3;54841:67;54905:2;54900:3;54841:67;:::i;:::-;54834:74;;54917:93;55006:3;54917:93;:::i;:::-;55035:2;55030:3;55026:12;55019:19;;54678:366;;;:::o;55050:419::-;55216:4;55254:2;55243:9;55239:18;55231:26;;55303:9;55297:4;55293:20;55289:1;55278:9;55274:17;55267:47;55331:131;55457:4;55331:131;:::i;:::-;55323:139;;55050:419;;;:::o;55475:180::-;55523:77;55520:1;55513:88;55620:4;55617:1;55610:15;55644:4;55641:1;55634:15
Swarm Source
ipfs://4f169083d34de54cd35621dabd53cc2b444ad2763f7fc8e8ca0b19223e7ab708
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.