ERC-721
Overview
Max Total Supply
929 CZNFT
Holders
753
Total Transfers
-
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Source Code Verified (Exact Match)
Contract Name:
ChineseZodiacNFT
Compiler Version
v0.8.2+commit.661d1103
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-11-28 */ /** *Submitted for verification at Etherscan.io on 2022-11-21 */ // File @openzeppelin/contracts/utils/introspection/[email protected] // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File @openzeppelin/contracts/token/ERC721/[email protected] 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/[email protected] pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File @openzeppelin/contracts/utils/[email protected] pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File @openzeppelin/contracts/utils/[email protected] pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File @openzeppelin/contracts/utils/[email protected] pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File @openzeppelin/contracts/utils/introspection/[email protected] 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/[email protected] 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 { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //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"); require(_balances[to] < 1,"error"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] pragma solidity ^0.8.0; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] pragma solidity ^0.8.0; /** * @dev ERC721 token with storage based token URI management. */ abstract contract ERC721URIStorage is ERC721 { using Strings for uint256; // Optional mapping for token URIs mapping(uint256 => string) private _tokenURIs; /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721URIStorage: URI query for nonexistent token"); string memory _tokenURI = _tokenURIs[tokenId]; string memory base = _baseURI(); // If there is no base URI, return the token URI. if (bytes(base).length == 0) { return _tokenURI; } // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked). if (bytes(_tokenURI).length > 0) { return string(abi.encodePacked(base, _tokenURI)); } return super.tokenURI(tokenId); } /** * @dev Sets `_tokenURI` as the tokenURI of `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual { require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token"); _tokenURIs[tokenId] = _tokenURI; } /** * @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 override { super._burn(tokenId); if (bytes(_tokenURIs[tokenId]).length != 0) { delete _tokenURIs[tokenId]; } } } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] pragma solidity ^0.8.0; /** * @title ERC721 Burnable Token * @dev ERC721 Token that can be irreversibly burned (destroyed). */ abstract contract ERC721Burnable is Context, ERC721 { /** * @dev Burns `tokenId`. See {ERC721-_burn}. * * Requirements: * * - The caller must own `tokenId` or be an approved operator. */ function burn(uint256 tokenId) public virtual { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721Burnable: caller is not owner nor approved"); _burn(tokenId); } } // File @openzeppelin/contracts/access/[email protected] 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() { _setOwner(_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 { _setOwner(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"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File contracts/MondoIR.sol pragma solidity ^0.8.2; contract ChineseZodiacNFT is ERC721, ERC721Enumerable, ERC721URIStorage, ERC721Burnable, Ownable { using Strings for uint256; // Optional mapping for token URIs mapping (uint256 => string) private _tokenURIs; // Base URI string private _baseURIextended; constructor() ERC721("ChineseZodiacNFT", "CZNFT") {} function setBaseURI(string memory baseURI_) external onlyOwner() { _baseURIextended = baseURI_; } function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal override(ERC721URIStorage) virtual { require(_exists(tokenId), "ERC721Metadata: URI set of nonexistent token"); _tokenURIs[tokenId] = _tokenURI; } function _baseURI() internal view virtual override returns (string memory) { return _baseURIextended; } function tokenURI(uint256 tokenId) public view virtual override(ERC721, ERC721URIStorage) returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory _tokenURI = _tokenURIs[tokenId]; string memory base = _baseURI(); // If there is no base URI, return the token URI. if (bytes(base).length == 0) { return _tokenURI; } // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked). if (bytes(_tokenURI).length > 0) { return string(abi.encodePacked(base, _tokenURI)); } // If there is a baseURI but no tokenURI, concatenate the tokenID to the baseURI. return string(abi.encodePacked(base, tokenId.toString())); } function mint( address _to, uint256 _tokenId, string memory tokenURI_ ) external { _mint(_to, _tokenId); _setTokenURI(_tokenId, tokenURI_); } // The following functions are overrides required by Solidity. function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal override(ERC721, ERC721Enumerable) { super._beforeTokenTransfer(from, to, tokenId); } function _burn(uint256 tokenId) internal override(ERC721, ERC721URIStorage) { super._burn(tokenId); } function supportsInterface(bytes4 interfaceId) public view override(ERC721, ERC721Enumerable) returns (bool) { return super.supportsInterface(interfaceId); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"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":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"string","name":"tokenURI_","type":"string"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setBaseURI","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"}]
Contract Creation Code
60806040523480156200001157600080fd5b506040518060400160405280601081526020017f4368696e6573655a6f646961634e4654000000000000000000000000000000008152506040518060400160405280600581526020017f435a4e4654000000000000000000000000000000000000000000000000000000815250816000908051906020019062000096929190620001a6565b508060019080519060200190620000af929190620001a6565b505050620000d2620000c6620000d860201b60201c565b620000e060201b60201c565b620002bb565b600033905090565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620001b49062000256565b90600052602060002090601f016020900481019282620001d8576000855562000224565b82601f10620001f357805160ff191683800117855562000224565b8280016001018555821562000224579182015b828111156200022357825182559160200191906001019062000206565b5b50905062000233919062000237565b5090565b5b808211156200025257600081600090555060010162000238565b5090565b600060028204905060018216806200026f57607f821691505b602082108114156200028657620002856200028c565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b613b4380620002cb6000396000f3fe608060405234801561001057600080fd5b50600436106101425760003560e01c80636352211e116100b8578063a22cb4651161007c578063a22cb46514610375578063b88d4fde14610391578063c87b56dd146103ad578063d3fc9864146103dd578063e985e9c5146103f9578063f2fde38b1461042957610142565b80636352211e146102cf57806370a08231146102ff578063715018a61461032f5780638da5cb5b1461033957806395d89b411461035757610142565b806323b872dd1161010a57806323b872dd146101ff5780632f745c591461021b57806342842e0e1461024b57806342966c68146102675780634f6ccce71461028357806355f804b3146102b357610142565b806301ffc9a71461014757806306fdde0314610177578063081812fc14610195578063095ea7b3146101c557806318160ddd146101e1575b600080fd5b610161600480360381019061015c9190612921565b610445565b60405161016e9190612e17565b60405180910390f35b61017f610457565b60405161018c9190612e32565b60405180910390f35b6101af60048036038101906101aa91906129b4565b6104e9565b6040516101bc9190612db0565b60405180910390f35b6101df60048036038101906101da919061287e565b61056e565b005b6101e9610686565b6040516101f691906130f4565b60405180910390f35b61021960048036038101906102149190612778565b610693565b005b6102356004803603810190610230919061287e565b6106f3565b60405161024291906130f4565b60405180910390f35b61026560048036038101906102609190612778565b610798565b005b610281600480360381019061027c91906129b4565b6107b8565b005b61029d600480360381019061029891906129b4565b610814565b6040516102aa91906130f4565b60405180910390f35b6102cd60048036038101906102c89190612973565b6108ab565b005b6102e960048036038101906102e491906129b4565b610941565b6040516102f69190612db0565b60405180910390f35b61031960048036038101906103149190612713565b6109f3565b60405161032691906130f4565b60405180910390f35b610337610aab565b005b610341610b33565b60405161034e9190612db0565b60405180910390f35b61035f610b5d565b60405161036c9190612e32565b60405180910390f35b61038f600480360381019061038a9190612842565b610bef565b005b6103ab60048036038101906103a691906127c7565b610d70565b005b6103c760048036038101906103c291906129b4565b610dd2565b6040516103d49190612e32565b60405180910390f35b6103f760048036038101906103f291906128ba565b610f45565b005b610413600480360381019061040e919061273c565b610f5e565b6040516104209190612e17565b60405180910390f35b610443600480360381019061043e9190612713565b610ff2565b005b6000610450826110ea565b9050919050565b6060600080546104669061334a565b80601f01602080910402602001604051908101604052809291908181526020018280546104929061334a565b80156104df5780601f106104b4576101008083540402835291602001916104df565b820191906000526020600020905b8154815290600101906020018083116104c257829003601f168201915b5050505050905090565b60006104f482611164565b610533576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161052a90612fd4565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061057982610941565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156105ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105e190613074565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166106096111d0565b73ffffffffffffffffffffffffffffffffffffffff1614806106385750610637816106326111d0565b610f5e565b5b610677576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161066e90612f54565b60405180910390fd5b61068183836111d8565b505050565b6000600880549050905090565b6106a461069e6111d0565b82611291565b6106e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106da90613094565b60405180910390fd5b6106ee83838361136f565b505050565b60006106fe836109f3565b821061073f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161073690612e74565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6107b383838360405180602001604052806000815250610d70565b505050565b6107c96107c36111d0565b82611291565b610808576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107ff906130d4565b60405180910390fd5b610811816115cb565b50565b600061081e610686565b821061085f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610856906130b4565b60405180910390fd5b60088281548110610899577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b6108b36111d0565b73ffffffffffffffffffffffffffffffffffffffff166108d1610b33565b73ffffffffffffffffffffffffffffffffffffffff1614610927576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091e90613014565b60405180910390fd5b80600d908051906020019061093d9291906124f7565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156109ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e190612f94565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610a64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5b90612f74565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610ab36111d0565b73ffffffffffffffffffffffffffffffffffffffff16610ad1610b33565b73ffffffffffffffffffffffffffffffffffffffff1614610b27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1e90613014565b60405180910390fd5b610b3160006115d7565b565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610b6c9061334a565b80601f0160208091040260200160405190810160405280929190818152602001828054610b989061334a565b8015610be55780601f10610bba57610100808354040283529160200191610be5565b820191906000526020600020905b815481529060010190602001808311610bc857829003601f168201915b5050505050905090565b610bf76111d0565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610c65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5c90612f14565b60405180910390fd5b8060056000610c726111d0565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610d1f6111d0565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610d649190612e17565b60405180910390a35050565b610d81610d7b6111d0565b83611291565b610dc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db790613094565b60405180910390fd5b610dcc8484848461169d565b50505050565b6060610ddd82611164565b610e1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1390613054565b60405180910390fd5b6000600c60008481526020019081526020016000208054610e3c9061334a565b80601f0160208091040260200160405190810160405280929190818152602001828054610e689061334a565b8015610eb55780601f10610e8a57610100808354040283529160200191610eb5565b820191906000526020600020905b815481529060010190602001808311610e9857829003601f168201915b505050505090506000610ec66116f9565b9050600081511415610edc578192505050610f40565b600082511115610f11578082604051602001610ef9929190612d8c565b60405160208183030381529060405292505050610f40565b80610f1b8561178b565b604051602001610f2c929190612d8c565b604051602081830303815290604052925050505b919050565b610f4f8383611938565b610f598282611b88565b505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610ffa6111d0565b73ffffffffffffffffffffffffffffffffffffffff16611018610b33565b73ffffffffffffffffffffffffffffffffffffffff161461106e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106590613014565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156110de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d590612eb4565b60405180910390fd5b6110e7816115d7565b50565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061115d575061115c82611bfc565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661124b83610941565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061129c82611164565b6112db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d290612f34565b60405180910390fd5b60006112e683610941565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061135557508373ffffffffffffffffffffffffffffffffffffffff1661133d846104e9565b73ffffffffffffffffffffffffffffffffffffffff16145b8061136657506113658185610f5e565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661138f82610941565b73ffffffffffffffffffffffffffffffffffffffff16146113e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113dc90613034565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611455576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144c90612ef4565b60405180910390fd5b611460838383611cde565b61146b6000826111d8565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546114bb9190613260565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461151291906131d9565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6115d481611cee565b50565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6116a884848461136f565b6116b484848484611d41565b6116f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ea90612e94565b60405180910390fd5b50505050565b6060600d80546117089061334a565b80601f01602080910402602001604051908101604052809291908181526020018280546117349061334a565b80156117815780601f1061175657610100808354040283529160200191611781565b820191906000526020600020905b81548152906001019060200180831161176457829003601f168201915b5050505050905090565b606060008214156117d3576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611933565b600082905060005b600082146118055780806117ee906133ad565b915050600a826117fe919061322f565b91506117db565b60008167ffffffffffffffff811115611847577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156118795781602001600182028036833780820191505090505b5090505b6000851461192c576001826118929190613260565b9150600a856118a191906133f6565b60306118ad91906131d9565b60f81b8183815181106118e9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611925919061322f565b945061187d565b8093505050505b919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156119a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199f90612fb4565b60405180910390fd5b6119b181611164565b156119f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e890612ed4565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410611a73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6a90612e54565b60405180910390fd5b611a7f60008383611cde565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611acf91906131d9565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b611b9182611164565b611bd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc790612ff4565b60405180910390fd5b80600c60008481526020019081526020016000209080519060200190611bf79291906124f7565b505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611cc757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611cd75750611cd682611ed8565b5b9050919050565b611ce9838383611f42565b505050565b611cf781612056565b6000600a60008381526020019081526020016000208054611d179061334a565b905014611d3e57600a60008281526020019081526020016000206000611d3d919061257d565b5b50565b6000611d628473ffffffffffffffffffffffffffffffffffffffff16612167565b15611ecb578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611d8b6111d0565b8786866040518563ffffffff1660e01b8152600401611dad9493929190612dcb565b602060405180830381600087803b158015611dc757600080fd5b505af1925050508015611df857506040513d601f19601f82011682018060405250810190611df5919061294a565b60015b611e7b573d8060008114611e28576040519150601f19603f3d011682016040523d82523d6000602084013e611e2d565b606091505b50600081511415611e73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6a90612e94565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611ed0565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611f4d83838361217a565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611f9057611f8b8161217f565b611fcf565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611fce57611fcd83826121c8565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156120125761200d81612335565b612051565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146120505761204f8282612478565b5b5b505050565b600061206182610941565b905061206f81600084611cde565b61207a6000836111d8565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120ca9190613260565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016121d5846109f3565b6121df9190613260565b90506000600760008481526020019081526020016000205490508181146122c4576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506123499190613260565b905060006009600084815260200190815260200160002054905060006008838154811061239f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080600883815481106123e7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061245c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612483836109f3565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b8280546125039061334a565b90600052602060002090601f016020900481019282612525576000855561256c565b82601f1061253e57805160ff191683800117855561256c565b8280016001018555821561256c579182015b8281111561256b578251825591602001919060010190612550565b5b50905061257991906125bd565b5090565b5080546125899061334a565b6000825580601f1061259b57506125ba565b601f0160209004906000526020600020908101906125b991906125bd565b5b50565b5b808211156125d65760008160009055506001016125be565b5090565b60006125ed6125e884613134565b61310f565b90508281526020810184848401111561260557600080fd5b612610848285613308565b509392505050565b600061262b61262684613165565b61310f565b90508281526020810184848401111561264357600080fd5b61264e848285613308565b509392505050565b60008135905061266581613ab1565b92915050565b60008135905061267a81613ac8565b92915050565b60008135905061268f81613adf565b92915050565b6000815190506126a481613adf565b92915050565b600082601f8301126126bb57600080fd5b81356126cb8482602086016125da565b91505092915050565b600082601f8301126126e557600080fd5b81356126f5848260208601612618565b91505092915050565b60008135905061270d81613af6565b92915050565b60006020828403121561272557600080fd5b600061273384828501612656565b91505092915050565b6000806040838503121561274f57600080fd5b600061275d85828601612656565b925050602061276e85828601612656565b9150509250929050565b60008060006060848603121561278d57600080fd5b600061279b86828701612656565b93505060206127ac86828701612656565b92505060406127bd868287016126fe565b9150509250925092565b600080600080608085870312156127dd57600080fd5b60006127eb87828801612656565b94505060206127fc87828801612656565b935050604061280d878288016126fe565b925050606085013567ffffffffffffffff81111561282a57600080fd5b612836878288016126aa565b91505092959194509250565b6000806040838503121561285557600080fd5b600061286385828601612656565b92505060206128748582860161266b565b9150509250929050565b6000806040838503121561289157600080fd5b600061289f85828601612656565b92505060206128b0858286016126fe565b9150509250929050565b6000806000606084860312156128cf57600080fd5b60006128dd86828701612656565b93505060206128ee868287016126fe565b925050604084013567ffffffffffffffff81111561290b57600080fd5b612917868287016126d4565b9150509250925092565b60006020828403121561293357600080fd5b600061294184828501612680565b91505092915050565b60006020828403121561295c57600080fd5b600061296a84828501612695565b91505092915050565b60006020828403121561298557600080fd5b600082013567ffffffffffffffff81111561299f57600080fd5b6129ab848285016126d4565b91505092915050565b6000602082840312156129c657600080fd5b60006129d4848285016126fe565b91505092915050565b6129e681613294565b82525050565b6129f5816132a6565b82525050565b6000612a0682613196565b612a1081856131ac565b9350612a20818560208601613317565b612a29816134e3565b840191505092915050565b6000612a3f826131a1565b612a4981856131bd565b9350612a59818560208601613317565b612a62816134e3565b840191505092915050565b6000612a78826131a1565b612a8281856131ce565b9350612a92818560208601613317565b80840191505092915050565b6000612aab6005836131bd565b9150612ab6826134f4565b602082019050919050565b6000612ace602b836131bd565b9150612ad98261351d565b604082019050919050565b6000612af16032836131bd565b9150612afc8261356c565b604082019050919050565b6000612b146026836131bd565b9150612b1f826135bb565b604082019050919050565b6000612b37601c836131bd565b9150612b428261360a565b602082019050919050565b6000612b5a6024836131bd565b9150612b6582613633565b604082019050919050565b6000612b7d6019836131bd565b9150612b8882613682565b602082019050919050565b6000612ba0602c836131bd565b9150612bab826136ab565b604082019050919050565b6000612bc36038836131bd565b9150612bce826136fa565b604082019050919050565b6000612be6602a836131bd565b9150612bf182613749565b604082019050919050565b6000612c096029836131bd565b9150612c1482613798565b604082019050919050565b6000612c2c6020836131bd565b9150612c37826137e7565b602082019050919050565b6000612c4f602c836131bd565b9150612c5a82613810565b604082019050919050565b6000612c72602c836131bd565b9150612c7d8261385f565b604082019050919050565b6000612c956020836131bd565b9150612ca0826138ae565b602082019050919050565b6000612cb86029836131bd565b9150612cc3826138d7565b604082019050919050565b6000612cdb602f836131bd565b9150612ce682613926565b604082019050919050565b6000612cfe6021836131bd565b9150612d0982613975565b604082019050919050565b6000612d216031836131bd565b9150612d2c826139c4565b604082019050919050565b6000612d44602c836131bd565b9150612d4f82613a13565b604082019050919050565b6000612d676030836131bd565b9150612d7282613a62565b604082019050919050565b612d86816132fe565b82525050565b6000612d988285612a6d565b9150612da48284612a6d565b91508190509392505050565b6000602082019050612dc560008301846129dd565b92915050565b6000608082019050612de060008301876129dd565b612ded60208301866129dd565b612dfa6040830185612d7d565b8181036060830152612e0c81846129fb565b905095945050505050565b6000602082019050612e2c60008301846129ec565b92915050565b60006020820190508181036000830152612e4c8184612a34565b905092915050565b60006020820190508181036000830152612e6d81612a9e565b9050919050565b60006020820190508181036000830152612e8d81612ac1565b9050919050565b60006020820190508181036000830152612ead81612ae4565b9050919050565b60006020820190508181036000830152612ecd81612b07565b9050919050565b60006020820190508181036000830152612eed81612b2a565b9050919050565b60006020820190508181036000830152612f0d81612b4d565b9050919050565b60006020820190508181036000830152612f2d81612b70565b9050919050565b60006020820190508181036000830152612f4d81612b93565b9050919050565b60006020820190508181036000830152612f6d81612bb6565b9050919050565b60006020820190508181036000830152612f8d81612bd9565b9050919050565b60006020820190508181036000830152612fad81612bfc565b9050919050565b60006020820190508181036000830152612fcd81612c1f565b9050919050565b60006020820190508181036000830152612fed81612c42565b9050919050565b6000602082019050818103600083015261300d81612c65565b9050919050565b6000602082019050818103600083015261302d81612c88565b9050919050565b6000602082019050818103600083015261304d81612cab565b9050919050565b6000602082019050818103600083015261306d81612cce565b9050919050565b6000602082019050818103600083015261308d81612cf1565b9050919050565b600060208201905081810360008301526130ad81612d14565b9050919050565b600060208201905081810360008301526130cd81612d37565b9050919050565b600060208201905081810360008301526130ed81612d5a565b9050919050565b60006020820190506131096000830184612d7d565b92915050565b600061311961312a565b9050613125828261337c565b919050565b6000604051905090565b600067ffffffffffffffff82111561314f5761314e6134b4565b5b613158826134e3565b9050602081019050919050565b600067ffffffffffffffff8211156131805761317f6134b4565b5b613189826134e3565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006131e4826132fe565b91506131ef836132fe565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561322457613223613427565b5b828201905092915050565b600061323a826132fe565b9150613245836132fe565b92508261325557613254613456565b5b828204905092915050565b600061326b826132fe565b9150613276836132fe565b92508282101561328957613288613427565b5b828203905092915050565b600061329f826132de565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561333557808201518184015260208101905061331a565b83811115613344576000848401525b50505050565b6000600282049050600182168061336257607f821691505b6020821081141561337657613375613485565b5b50919050565b613385826134e3565b810181811067ffffffffffffffff821117156133a4576133a36134b4565b5b80604052505050565b60006133b8826132fe565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156133eb576133ea613427565b5b600182019050919050565b6000613401826132fe565b915061340c836132fe565b92508261341c5761341b613456565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f6572726f72000000000000000000000000000000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920736574206f66206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656400000000000000000000000000000000602082015250565b613aba81613294565b8114613ac557600080fd5b50565b613ad1816132a6565b8114613adc57600080fd5b50565b613ae8816132b2565b8114613af357600080fd5b50565b613aff816132fe565b8114613b0a57600080fd5b5056fea26469706673582212203cc3dd37d948b7d8ccfc452f98a4ffa0ca11fbdbb19fba75e3917474cd10df0664736f6c63430008020033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101425760003560e01c80636352211e116100b8578063a22cb4651161007c578063a22cb46514610375578063b88d4fde14610391578063c87b56dd146103ad578063d3fc9864146103dd578063e985e9c5146103f9578063f2fde38b1461042957610142565b80636352211e146102cf57806370a08231146102ff578063715018a61461032f5780638da5cb5b1461033957806395d89b411461035757610142565b806323b872dd1161010a57806323b872dd146101ff5780632f745c591461021b57806342842e0e1461024b57806342966c68146102675780634f6ccce71461028357806355f804b3146102b357610142565b806301ffc9a71461014757806306fdde0314610177578063081812fc14610195578063095ea7b3146101c557806318160ddd146101e1575b600080fd5b610161600480360381019061015c9190612921565b610445565b60405161016e9190612e17565b60405180910390f35b61017f610457565b60405161018c9190612e32565b60405180910390f35b6101af60048036038101906101aa91906129b4565b6104e9565b6040516101bc9190612db0565b60405180910390f35b6101df60048036038101906101da919061287e565b61056e565b005b6101e9610686565b6040516101f691906130f4565b60405180910390f35b61021960048036038101906102149190612778565b610693565b005b6102356004803603810190610230919061287e565b6106f3565b60405161024291906130f4565b60405180910390f35b61026560048036038101906102609190612778565b610798565b005b610281600480360381019061027c91906129b4565b6107b8565b005b61029d600480360381019061029891906129b4565b610814565b6040516102aa91906130f4565b60405180910390f35b6102cd60048036038101906102c89190612973565b6108ab565b005b6102e960048036038101906102e491906129b4565b610941565b6040516102f69190612db0565b60405180910390f35b61031960048036038101906103149190612713565b6109f3565b60405161032691906130f4565b60405180910390f35b610337610aab565b005b610341610b33565b60405161034e9190612db0565b60405180910390f35b61035f610b5d565b60405161036c9190612e32565b60405180910390f35b61038f600480360381019061038a9190612842565b610bef565b005b6103ab60048036038101906103a691906127c7565b610d70565b005b6103c760048036038101906103c291906129b4565b610dd2565b6040516103d49190612e32565b60405180910390f35b6103f760048036038101906103f291906128ba565b610f45565b005b610413600480360381019061040e919061273c565b610f5e565b6040516104209190612e17565b60405180910390f35b610443600480360381019061043e9190612713565b610ff2565b005b6000610450826110ea565b9050919050565b6060600080546104669061334a565b80601f01602080910402602001604051908101604052809291908181526020018280546104929061334a565b80156104df5780601f106104b4576101008083540402835291602001916104df565b820191906000526020600020905b8154815290600101906020018083116104c257829003601f168201915b5050505050905090565b60006104f482611164565b610533576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161052a90612fd4565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061057982610941565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156105ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105e190613074565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166106096111d0565b73ffffffffffffffffffffffffffffffffffffffff1614806106385750610637816106326111d0565b610f5e565b5b610677576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161066e90612f54565b60405180910390fd5b61068183836111d8565b505050565b6000600880549050905090565b6106a461069e6111d0565b82611291565b6106e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106da90613094565b60405180910390fd5b6106ee83838361136f565b505050565b60006106fe836109f3565b821061073f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161073690612e74565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6107b383838360405180602001604052806000815250610d70565b505050565b6107c96107c36111d0565b82611291565b610808576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107ff906130d4565b60405180910390fd5b610811816115cb565b50565b600061081e610686565b821061085f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610856906130b4565b60405180910390fd5b60088281548110610899577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b6108b36111d0565b73ffffffffffffffffffffffffffffffffffffffff166108d1610b33565b73ffffffffffffffffffffffffffffffffffffffff1614610927576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091e90613014565b60405180910390fd5b80600d908051906020019061093d9291906124f7565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156109ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e190612f94565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610a64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5b90612f74565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610ab36111d0565b73ffffffffffffffffffffffffffffffffffffffff16610ad1610b33565b73ffffffffffffffffffffffffffffffffffffffff1614610b27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1e90613014565b60405180910390fd5b610b3160006115d7565b565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610b6c9061334a565b80601f0160208091040260200160405190810160405280929190818152602001828054610b989061334a565b8015610be55780601f10610bba57610100808354040283529160200191610be5565b820191906000526020600020905b815481529060010190602001808311610bc857829003601f168201915b5050505050905090565b610bf76111d0565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610c65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5c90612f14565b60405180910390fd5b8060056000610c726111d0565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610d1f6111d0565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610d649190612e17565b60405180910390a35050565b610d81610d7b6111d0565b83611291565b610dc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db790613094565b60405180910390fd5b610dcc8484848461169d565b50505050565b6060610ddd82611164565b610e1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1390613054565b60405180910390fd5b6000600c60008481526020019081526020016000208054610e3c9061334a565b80601f0160208091040260200160405190810160405280929190818152602001828054610e689061334a565b8015610eb55780601f10610e8a57610100808354040283529160200191610eb5565b820191906000526020600020905b815481529060010190602001808311610e9857829003601f168201915b505050505090506000610ec66116f9565b9050600081511415610edc578192505050610f40565b600082511115610f11578082604051602001610ef9929190612d8c565b60405160208183030381529060405292505050610f40565b80610f1b8561178b565b604051602001610f2c929190612d8c565b604051602081830303815290604052925050505b919050565b610f4f8383611938565b610f598282611b88565b505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610ffa6111d0565b73ffffffffffffffffffffffffffffffffffffffff16611018610b33565b73ffffffffffffffffffffffffffffffffffffffff161461106e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106590613014565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156110de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d590612eb4565b60405180910390fd5b6110e7816115d7565b50565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061115d575061115c82611bfc565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661124b83610941565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061129c82611164565b6112db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d290612f34565b60405180910390fd5b60006112e683610941565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061135557508373ffffffffffffffffffffffffffffffffffffffff1661133d846104e9565b73ffffffffffffffffffffffffffffffffffffffff16145b8061136657506113658185610f5e565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661138f82610941565b73ffffffffffffffffffffffffffffffffffffffff16146113e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113dc90613034565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611455576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144c90612ef4565b60405180910390fd5b611460838383611cde565b61146b6000826111d8565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546114bb9190613260565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461151291906131d9565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6115d481611cee565b50565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6116a884848461136f565b6116b484848484611d41565b6116f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ea90612e94565b60405180910390fd5b50505050565b6060600d80546117089061334a565b80601f01602080910402602001604051908101604052809291908181526020018280546117349061334a565b80156117815780601f1061175657610100808354040283529160200191611781565b820191906000526020600020905b81548152906001019060200180831161176457829003601f168201915b5050505050905090565b606060008214156117d3576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611933565b600082905060005b600082146118055780806117ee906133ad565b915050600a826117fe919061322f565b91506117db565b60008167ffffffffffffffff811115611847577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156118795781602001600182028036833780820191505090505b5090505b6000851461192c576001826118929190613260565b9150600a856118a191906133f6565b60306118ad91906131d9565b60f81b8183815181106118e9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611925919061322f565b945061187d565b8093505050505b919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156119a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199f90612fb4565b60405180910390fd5b6119b181611164565b156119f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e890612ed4565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410611a73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6a90612e54565b60405180910390fd5b611a7f60008383611cde565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611acf91906131d9565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b611b9182611164565b611bd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc790612ff4565b60405180910390fd5b80600c60008481526020019081526020016000209080519060200190611bf79291906124f7565b505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611cc757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611cd75750611cd682611ed8565b5b9050919050565b611ce9838383611f42565b505050565b611cf781612056565b6000600a60008381526020019081526020016000208054611d179061334a565b905014611d3e57600a60008281526020019081526020016000206000611d3d919061257d565b5b50565b6000611d628473ffffffffffffffffffffffffffffffffffffffff16612167565b15611ecb578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611d8b6111d0565b8786866040518563ffffffff1660e01b8152600401611dad9493929190612dcb565b602060405180830381600087803b158015611dc757600080fd5b505af1925050508015611df857506040513d601f19601f82011682018060405250810190611df5919061294a565b60015b611e7b573d8060008114611e28576040519150601f19603f3d011682016040523d82523d6000602084013e611e2d565b606091505b50600081511415611e73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6a90612e94565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611ed0565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611f4d83838361217a565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611f9057611f8b8161217f565b611fcf565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611fce57611fcd83826121c8565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156120125761200d81612335565b612051565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146120505761204f8282612478565b5b5b505050565b600061206182610941565b905061206f81600084611cde565b61207a6000836111d8565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120ca9190613260565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016121d5846109f3565b6121df9190613260565b90506000600760008481526020019081526020016000205490508181146122c4576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506123499190613260565b905060006009600084815260200190815260200160002054905060006008838154811061239f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080600883815481106123e7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061245c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612483836109f3565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b8280546125039061334a565b90600052602060002090601f016020900481019282612525576000855561256c565b82601f1061253e57805160ff191683800117855561256c565b8280016001018555821561256c579182015b8281111561256b578251825591602001919060010190612550565b5b50905061257991906125bd565b5090565b5080546125899061334a565b6000825580601f1061259b57506125ba565b601f0160209004906000526020600020908101906125b991906125bd565b5b50565b5b808211156125d65760008160009055506001016125be565b5090565b60006125ed6125e884613134565b61310f565b90508281526020810184848401111561260557600080fd5b612610848285613308565b509392505050565b600061262b61262684613165565b61310f565b90508281526020810184848401111561264357600080fd5b61264e848285613308565b509392505050565b60008135905061266581613ab1565b92915050565b60008135905061267a81613ac8565b92915050565b60008135905061268f81613adf565b92915050565b6000815190506126a481613adf565b92915050565b600082601f8301126126bb57600080fd5b81356126cb8482602086016125da565b91505092915050565b600082601f8301126126e557600080fd5b81356126f5848260208601612618565b91505092915050565b60008135905061270d81613af6565b92915050565b60006020828403121561272557600080fd5b600061273384828501612656565b91505092915050565b6000806040838503121561274f57600080fd5b600061275d85828601612656565b925050602061276e85828601612656565b9150509250929050565b60008060006060848603121561278d57600080fd5b600061279b86828701612656565b93505060206127ac86828701612656565b92505060406127bd868287016126fe565b9150509250925092565b600080600080608085870312156127dd57600080fd5b60006127eb87828801612656565b94505060206127fc87828801612656565b935050604061280d878288016126fe565b925050606085013567ffffffffffffffff81111561282a57600080fd5b612836878288016126aa565b91505092959194509250565b6000806040838503121561285557600080fd5b600061286385828601612656565b92505060206128748582860161266b565b9150509250929050565b6000806040838503121561289157600080fd5b600061289f85828601612656565b92505060206128b0858286016126fe565b9150509250929050565b6000806000606084860312156128cf57600080fd5b60006128dd86828701612656565b93505060206128ee868287016126fe565b925050604084013567ffffffffffffffff81111561290b57600080fd5b612917868287016126d4565b9150509250925092565b60006020828403121561293357600080fd5b600061294184828501612680565b91505092915050565b60006020828403121561295c57600080fd5b600061296a84828501612695565b91505092915050565b60006020828403121561298557600080fd5b600082013567ffffffffffffffff81111561299f57600080fd5b6129ab848285016126d4565b91505092915050565b6000602082840312156129c657600080fd5b60006129d4848285016126fe565b91505092915050565b6129e681613294565b82525050565b6129f5816132a6565b82525050565b6000612a0682613196565b612a1081856131ac565b9350612a20818560208601613317565b612a29816134e3565b840191505092915050565b6000612a3f826131a1565b612a4981856131bd565b9350612a59818560208601613317565b612a62816134e3565b840191505092915050565b6000612a78826131a1565b612a8281856131ce565b9350612a92818560208601613317565b80840191505092915050565b6000612aab6005836131bd565b9150612ab6826134f4565b602082019050919050565b6000612ace602b836131bd565b9150612ad98261351d565b604082019050919050565b6000612af16032836131bd565b9150612afc8261356c565b604082019050919050565b6000612b146026836131bd565b9150612b1f826135bb565b604082019050919050565b6000612b37601c836131bd565b9150612b428261360a565b602082019050919050565b6000612b5a6024836131bd565b9150612b6582613633565b604082019050919050565b6000612b7d6019836131bd565b9150612b8882613682565b602082019050919050565b6000612ba0602c836131bd565b9150612bab826136ab565b604082019050919050565b6000612bc36038836131bd565b9150612bce826136fa565b604082019050919050565b6000612be6602a836131bd565b9150612bf182613749565b604082019050919050565b6000612c096029836131bd565b9150612c1482613798565b604082019050919050565b6000612c2c6020836131bd565b9150612c37826137e7565b602082019050919050565b6000612c4f602c836131bd565b9150612c5a82613810565b604082019050919050565b6000612c72602c836131bd565b9150612c7d8261385f565b604082019050919050565b6000612c956020836131bd565b9150612ca0826138ae565b602082019050919050565b6000612cb86029836131bd565b9150612cc3826138d7565b604082019050919050565b6000612cdb602f836131bd565b9150612ce682613926565b604082019050919050565b6000612cfe6021836131bd565b9150612d0982613975565b604082019050919050565b6000612d216031836131bd565b9150612d2c826139c4565b604082019050919050565b6000612d44602c836131bd565b9150612d4f82613a13565b604082019050919050565b6000612d676030836131bd565b9150612d7282613a62565b604082019050919050565b612d86816132fe565b82525050565b6000612d988285612a6d565b9150612da48284612a6d565b91508190509392505050565b6000602082019050612dc560008301846129dd565b92915050565b6000608082019050612de060008301876129dd565b612ded60208301866129dd565b612dfa6040830185612d7d565b8181036060830152612e0c81846129fb565b905095945050505050565b6000602082019050612e2c60008301846129ec565b92915050565b60006020820190508181036000830152612e4c8184612a34565b905092915050565b60006020820190508181036000830152612e6d81612a9e565b9050919050565b60006020820190508181036000830152612e8d81612ac1565b9050919050565b60006020820190508181036000830152612ead81612ae4565b9050919050565b60006020820190508181036000830152612ecd81612b07565b9050919050565b60006020820190508181036000830152612eed81612b2a565b9050919050565b60006020820190508181036000830152612f0d81612b4d565b9050919050565b60006020820190508181036000830152612f2d81612b70565b9050919050565b60006020820190508181036000830152612f4d81612b93565b9050919050565b60006020820190508181036000830152612f6d81612bb6565b9050919050565b60006020820190508181036000830152612f8d81612bd9565b9050919050565b60006020820190508181036000830152612fad81612bfc565b9050919050565b60006020820190508181036000830152612fcd81612c1f565b9050919050565b60006020820190508181036000830152612fed81612c42565b9050919050565b6000602082019050818103600083015261300d81612c65565b9050919050565b6000602082019050818103600083015261302d81612c88565b9050919050565b6000602082019050818103600083015261304d81612cab565b9050919050565b6000602082019050818103600083015261306d81612cce565b9050919050565b6000602082019050818103600083015261308d81612cf1565b9050919050565b600060208201905081810360008301526130ad81612d14565b9050919050565b600060208201905081810360008301526130cd81612d37565b9050919050565b600060208201905081810360008301526130ed81612d5a565b9050919050565b60006020820190506131096000830184612d7d565b92915050565b600061311961312a565b9050613125828261337c565b919050565b6000604051905090565b600067ffffffffffffffff82111561314f5761314e6134b4565b5b613158826134e3565b9050602081019050919050565b600067ffffffffffffffff8211156131805761317f6134b4565b5b613189826134e3565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006131e4826132fe565b91506131ef836132fe565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561322457613223613427565b5b828201905092915050565b600061323a826132fe565b9150613245836132fe565b92508261325557613254613456565b5b828204905092915050565b600061326b826132fe565b9150613276836132fe565b92508282101561328957613288613427565b5b828203905092915050565b600061329f826132de565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561333557808201518184015260208101905061331a565b83811115613344576000848401525b50505050565b6000600282049050600182168061336257607f821691505b6020821081141561337657613375613485565b5b50919050565b613385826134e3565b810181811067ffffffffffffffff821117156133a4576133a36134b4565b5b80604052505050565b60006133b8826132fe565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156133eb576133ea613427565b5b600182019050919050565b6000613401826132fe565b915061340c836132fe565b92508261341c5761341b613456565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f6572726f72000000000000000000000000000000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920736574206f66206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656400000000000000000000000000000000602082015250565b613aba81613294565b8114613ac557600080fd5b50565b613ad1816132a6565b8114613adc57600080fd5b50565b613ae8816132b2565b8114613af357600080fd5b50565b613aff816132fe565b8114613b0a57600080fd5b5056fea26469706673582212203cc3dd37d948b7d8ccfc452f98a4ffa0ca11fbdbb19fba75e3917474cd10df0664736f6c63430008020033
Deployed Bytecode Sourcemap
46015:2715:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48511:212;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21728:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23287:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22810:411;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35518:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24177:339;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35186:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24587:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43415:245;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35708:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46413:119;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21422:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21152:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45320:94;;;:::i;:::-;;44669:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21897:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23580:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24843:328;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46971:887;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47880:224;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23946:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45569:192;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48511:212;48650:4;48679:36;48703:11;48679:23;:36::i;:::-;48672:43;;48511:212;;;:::o;21728:100::-;21782:13;21815:5;21808:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21728:100;:::o;23287:221::-;23363:7;23391:16;23399:7;23391;:16::i;:::-;23383:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23476:15;:24;23492:7;23476:24;;;;;;;;;;;;;;;;;;;;;23469:31;;23287:221;;;:::o;22810:411::-;22891:13;22907:23;22922:7;22907:14;:23::i;:::-;22891:39;;22955:5;22949:11;;:2;:11;;;;22941:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;23049:5;23033:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;23058:37;23075:5;23082:12;:10;:12::i;:::-;23058:16;:37::i;:::-;23033:62;23011:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;23192:21;23201:2;23205:7;23192:8;:21::i;:::-;22810:411;;;:::o;35518:113::-;35579:7;35606:10;:17;;;;35599:24;;35518:113;:::o;24177:339::-;24372:41;24391:12;:10;:12::i;:::-;24405:7;24372:18;:41::i;:::-;24364:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24480:28;24490:4;24496:2;24500:7;24480:9;:28::i;:::-;24177:339;;;:::o;35186:256::-;35283:7;35319:23;35336:5;35319:16;:23::i;:::-;35311:5;:31;35303:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;35408:12;:19;35421:5;35408:19;;;;;;;;;;;;;;;:26;35428:5;35408:26;;;;;;;;;;;;35401:33;;35186:256;;;;:::o;24587:185::-;24725:39;24742:4;24748:2;24752:7;24725:39;;;;;;;;;;;;:16;:39::i;:::-;24587:185;;;:::o;43415:245::-;43533:41;43552:12;:10;:12::i;:::-;43566:7;43533:18;:41::i;:::-;43525:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;43638:14;43644:7;43638:5;:14::i;:::-;43415:245;:::o;35708:233::-;35783:7;35819:30;:28;:30::i;:::-;35811:5;:38;35803:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;35916:10;35927:5;35916:17;;;;;;;;;;;;;;;;;;;;;;;;35909:24;;35708:233;;;:::o;46413:119::-;44900:12;:10;:12::i;:::-;44889:23;;:7;:5;:7::i;:::-;:23;;;44881:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46512:8:::1;46493:16;:27;;;;;;;;;;;;:::i;:::-;;46413:119:::0;:::o;21422:239::-;21494:7;21514:13;21530:7;:16;21538:7;21530:16;;;;;;;;;;;;;;;;;;;;;21514:32;;21582:1;21565:19;;:5;:19;;;;21557:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;21648:5;21641:12;;;21422:239;;;:::o;21152:208::-;21224:7;21269:1;21252:19;;:5;:19;;;;21244:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;21336:9;:16;21346:5;21336:16;;;;;;;;;;;;;;;;21329:23;;21152:208;;;:::o;45320:94::-;44900:12;:10;:12::i;:::-;44889:23;;:7;:5;:7::i;:::-;:23;;;44881:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45385:21:::1;45403:1;45385:9;:21::i;:::-;45320:94::o:0;44669:87::-;44715:7;44742:6;;;;;;;;;;;44735:13;;44669:87;:::o;21897:104::-;21953:13;21986:7;21979:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21897:104;:::o;23580:295::-;23695:12;:10;:12::i;:::-;23683:24;;:8;:24;;;;23675:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;23795:8;23750:18;:32;23769:12;:10;:12::i;:::-;23750:32;;;;;;;;;;;;;;;:42;23783:8;23750:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;23848:8;23819:48;;23834:12;:10;:12::i;:::-;23819:48;;;23858:8;23819:48;;;;;;:::i;:::-;;;;;;;;23580:295;;:::o;24843:328::-;25018:41;25037:12;:10;:12::i;:::-;25051:7;25018:18;:41::i;:::-;25010:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25124:39;25138:4;25144:2;25148:7;25157:5;25124:13;:39::i;:::-;24843:328;;;;:::o;46971:887::-;47070:13;47108:16;47116:7;47108;:16::i;:::-;47100:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;47193:23;47219:10;:19;47230:7;47219:19;;;;;;;;;;;47193:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47253:18;47274:10;:8;:10::i;:::-;47253:31;;47402:1;47386:4;47380:18;:23;47376:80;;;47431:9;47424:16;;;;;;47376:80;47594:1;47574:9;47568:23;:27;47564:116;;;47647:4;47653:9;47630:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;47616:48;;;;;;47564:116;47820:4;47826:18;:7;:16;:18::i;:::-;47803:42;;;;;;;;;:::i;:::-;;;;;;;;;;;;;47789:57;;;;46971:887;;;;:::o;47880:224::-;48024:20;48030:3;48035:8;48024:5;:20::i;:::-;48059:33;48072:8;48082:9;48059:12;:33::i;:::-;47880:224;;;:::o;23946:164::-;24043:4;24067:18;:25;24086:5;24067:25;;;;;;;;;;;;;;;:35;24093:8;24067:35;;;;;;;;;;;;;;;;;;;;;;;;;24060:42;;23946:164;;;;:::o;45569:192::-;44900:12;:10;:12::i;:::-;44889:23;;:7;:5;:7::i;:::-;:23;;;44881:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45678:1:::1;45658:22;;:8;:22;;;;45650:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;45734:19;45744:8;45734:9;:19::i;:::-;45569:192:::0;:::o;34878:224::-;34980:4;35019:35;35004:50;;;:11;:50;;;;:90;;;;35058:36;35082:11;35058:23;:36::i;:::-;35004:90;34997:97;;34878:224;;;:::o;26681:127::-;26746:4;26798:1;26770:30;;:7;:16;26778:7;26770:16;;;;;;;;;;;;;;;;;;;;;:30;;;;26763:37;;26681:127;;;:::o;16201:98::-;16254:7;16281:10;16274:17;;16201:98;:::o;30706:174::-;30808:2;30781:15;:24;30797:7;30781:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;30864:7;30860:2;30826:46;;30835:23;30850:7;30835:14;:23::i;:::-;30826:46;;;;;;;;;;;;30706:174;;:::o;26975:348::-;27068:4;27093:16;27101:7;27093;:16::i;:::-;27085:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27169:13;27185:23;27200:7;27185:14;:23::i;:::-;27169:39;;27238:5;27227:16;;:7;:16;;;:51;;;;27271:7;27247:31;;:20;27259:7;27247:11;:20::i;:::-;:31;;;27227:51;:87;;;;27282:32;27299:5;27306:7;27282:16;:32::i;:::-;27227:87;27219:96;;;26975:348;;;;:::o;30010:578::-;30169:4;30142:31;;:23;30157:7;30142:14;:23::i;:::-;:31;;;30134:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;30252:1;30238:16;;:2;:16;;;;30230:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;30308:39;30329:4;30335:2;30339:7;30308:20;:39::i;:::-;30412:29;30429:1;30433:7;30412:8;:29::i;:::-;30473:1;30454:9;:15;30464:4;30454:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;30502:1;30485:9;:13;30495:2;30485:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;30533:2;30514:7;:16;30522:7;30514:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;30572:7;30568:2;30553:27;;30562:4;30553:27;;;;;;;;;;;;30010:578;;;:::o;48390:115::-;48477:20;48489:7;48477:11;:20::i;:::-;48390:115;:::o;45769:173::-;45825:16;45844:6;;;;;;;;;;;45825:25;;45870:8;45861:6;;:17;;;;;;;;;;;;;;;;;;45925:8;45894:40;;45915:8;45894:40;;;;;;;;;;;;45769:173;;:::o;26053:315::-;26210:28;26220:4;26226:2;26230:7;26210:9;:28::i;:::-;26257:48;26280:4;26286:2;26290:7;26299:5;26257:22;:48::i;:::-;26249:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;26053:315;;;;:::o;46826:125::-;46886:13;46923:16;46916:23;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46826:125;:::o;16732:723::-;16788:13;17018:1;17009:5;:10;17005:53;;;17036:10;;;;;;;;;;;;;;;;;;;;;17005:53;17068:12;17083:5;17068:20;;17099:14;17124:78;17139:1;17131:4;:9;17124:78;;17157:8;;;;;:::i;:::-;;;;17188:2;17180:10;;;;;:::i;:::-;;;17124:78;;;17212:19;17244:6;17234:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17212:39;;17262:154;17278:1;17269:5;:10;17262:154;;17306:1;17296:11;;;;;:::i;:::-;;;17373:2;17365:5;:10;;;;:::i;:::-;17352:2;:24;;;;:::i;:::-;17339:39;;17322:6;17329;17322:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;17402:2;17393:11;;;;;:::i;:::-;;;17262:154;;;17440:6;17426:21;;;;;16732:723;;;;:::o;28659:425::-;28753:1;28739:16;;:2;:16;;;;28731:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;28812:16;28820:7;28812;:16::i;:::-;28811:17;28803:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;28896:1;28880:9;:13;28890:2;28880:13;;;;;;;;;;;;;;;;:17;28872:34;;;;;;;;;;;;:::i;:::-;;;;;;;;;28917:45;28946:1;28950:2;28954:7;28917:20;:45::i;:::-;28992:1;28975:9;:13;28985:2;28975:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29023:2;29004:7;:16;29012:7;29004:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29068:7;29064:2;29043:33;;29060:1;29043:33;;;;;;;;;;;;28659:425;;:::o;46552:254::-;46683:16;46691:7;46683;:16::i;:::-;46675:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;46785:9;46763:10;:19;46774:7;46763:19;;;;;;;;;;;:31;;;;;;;;;;;;:::i;:::-;;46552:254;;:::o;20783:305::-;20885:4;20937:25;20922:40;;;:11;:40;;;;:105;;;;20994:33;20979:48;;;:11;:48;;;;20922:105;:158;;;;21044:36;21068:11;21044:23;:36::i;:::-;20922:158;20902:178;;20783:305;;;:::o;48180:204::-;48331:45;48358:4;48364:2;48368:7;48331:26;:45::i;:::-;48180:204;;;:::o;42741:206::-;42810:20;42822:7;42810:11;:20::i;:::-;42884:1;42853:10;:19;42864:7;42853:19;;;;;;;;;;;42847:33;;;;;:::i;:::-;;;:38;42843:97;;42909:10;:19;42920:7;42909:19;;;;;;;;;;;;42902:26;;;;:::i;:::-;42843:97;42741:206;:::o;31445:799::-;31600:4;31621:15;:2;:13;;;:15::i;:::-;31617:620;;;31673:2;31657:36;;;31694:12;:10;:12::i;:::-;31708:4;31714:7;31723:5;31657:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;31653:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31916:1;31899:6;:13;:18;31895:272;;;31942:60;;;;;;;;;;:::i;:::-;;;;;;;;31895:272;32117:6;32111:13;32102:6;32098:2;32094:15;32087:38;31653:529;31790:41;;;31780:51;;;:6;:51;;;;31773:58;;;;;31617:620;32221:4;32214:11;;31445:799;;;;;;;:::o;19293:157::-;19378:4;19417:25;19402:40;;;:11;:40;;;;19395:47;;19293:157;;;:::o;36554:589::-;36698:45;36725:4;36731:2;36735:7;36698:26;:45::i;:::-;36776:1;36760:18;;:4;:18;;;36756:187;;;36795:40;36827:7;36795:31;:40::i;:::-;36756:187;;;36865:2;36857:10;;:4;:10;;;36853:90;;36884:47;36917:4;36923:7;36884:32;:47::i;:::-;36853:90;36756:187;36971:1;36957:16;;:2;:16;;;36953:183;;;36990:45;37027:7;36990:36;:45::i;:::-;36953:183;;;37063:4;37057:10;;:2;:10;;;37053:83;;37084:40;37112:2;37116:7;37084:27;:40::i;:::-;37053:83;36953:183;36554:589;;;:::o;29313:360::-;29373:13;29389:23;29404:7;29389:14;:23::i;:::-;29373:39;;29425:48;29446:5;29461:1;29465:7;29425:20;:48::i;:::-;29514:29;29531:1;29535:7;29514:8;:29::i;:::-;29576:1;29556:9;:16;29566:5;29556:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;29595:7;:16;29603:7;29595:16;;;;;;;;;;;;29588:23;;;;;;;;;;;29657:7;29653:1;29629:36;;29638:5;29629:36;;;;;;;;;;;;29313:360;;:::o;8239:387::-;8299:4;8507:12;8574:7;8562:20;8554:28;;8617:1;8610:4;:8;8603:15;;;8239:387;;;:::o;32816:126::-;;;;:::o;37866:164::-;37970:10;:17;;;;37943:15;:24;37959:7;37943:24;;;;;;;;;;;:44;;;;37998:10;38014:7;37998:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37866:164;:::o;38657:988::-;38923:22;38973:1;38948:22;38965:4;38948:16;:22::i;:::-;:26;;;;:::i;:::-;38923:51;;38985:18;39006:17;:26;39024:7;39006:26;;;;;;;;;;;;38985:47;;39153:14;39139:10;:28;39135:328;;39184:19;39206:12;:18;39219:4;39206:18;;;;;;;;;;;;;;;:34;39225:14;39206:34;;;;;;;;;;;;39184:56;;39290:11;39257:12;:18;39270:4;39257:18;;;;;;;;;;;;;;;:30;39276:10;39257:30;;;;;;;;;;;:44;;;;39407:10;39374:17;:30;39392:11;39374:30;;;;;;;;;;;:43;;;;39135:328;;39559:17;:26;39577:7;39559:26;;;;;;;;;;;39552:33;;;39603:12;:18;39616:4;39603:18;;;;;;;;;;;;;;;:34;39622:14;39603:34;;;;;;;;;;;39596:41;;;38657:988;;;;:::o;39940:1079::-;40193:22;40238:1;40218:10;:17;;;;:21;;;;:::i;:::-;40193:46;;40250:18;40271:15;:24;40287:7;40271:24;;;;;;;;;;;;40250:45;;40622:19;40644:10;40655:14;40644:26;;;;;;;;;;;;;;;;;;;;;;;;40622:48;;40708:11;40683:10;40694;40683:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;40819:10;40788:15;:28;40804:11;40788:28;;;;;;;;;;;:41;;;;40960:15;:24;40976:7;40960:24;;;;;;;;;;;40953:31;;;40995:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39940:1079;;;;:::o;37444:221::-;37529:14;37546:20;37563:2;37546:16;:20::i;:::-;37529:37;;37604:7;37577:12;:16;37590:2;37577:16;;;;;;;;;;;;;;;:24;37594:6;37577:24;;;;;;;;;;;:34;;;;37651:6;37622:17;:26;37640:7;37622:26;;;;;;;;;;;:35;;;;37444:221;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:343:1:-;;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:345::-;;459:66;475:49;517:6;475:49;:::i;:::-;459:66;:::i;:::-;450:75;;548:6;541:5;534:21;586:4;579:5;575:16;624:3;615:6;610:3;606:16;603:25;600:2;;;641:1;638;631:12;600:2;654:41;688:6;683:3;678;654:41;:::i;:::-;440:261;;;;;;:::o;707:139::-;;791:6;778:20;769:29;;807:33;834:5;807:33;:::i;:::-;759:87;;;;:::o;852:133::-;;933:6;920:20;911:29;;949:30;973:5;949:30;:::i;:::-;901:84;;;;:::o;991:137::-;;1074:6;1061:20;1052:29;;1090:32;1116:5;1090:32;:::i;:::-;1042:86;;;;:::o;1134:141::-;;1221:6;1215:13;1206:22;;1237:32;1263:5;1237:32;:::i;:::-;1196:79;;;;:::o;1294:271::-;;1398:3;1391:4;1383:6;1379:17;1375:27;1365:2;;1416:1;1413;1406:12;1365:2;1456:6;1443:20;1481:78;1555:3;1547:6;1540:4;1532:6;1528:17;1481:78;:::i;:::-;1472:87;;1355:210;;;;;:::o;1585:273::-;;1690:3;1683:4;1675:6;1671:17;1667:27;1657:2;;1708:1;1705;1698:12;1657:2;1748:6;1735:20;1773:79;1848:3;1840:6;1833:4;1825:6;1821:17;1773:79;:::i;:::-;1764:88;;1647:211;;;;;:::o;1864:139::-;;1948:6;1935:20;1926:29;;1964:33;1991:5;1964:33;:::i;:::-;1916:87;;;;:::o;2009:262::-;;2117:2;2105:9;2096:7;2092:23;2088:32;2085:2;;;2133:1;2130;2123:12;2085:2;2176:1;2201:53;2246:7;2237:6;2226:9;2222:22;2201:53;:::i;:::-;2191:63;;2147:117;2075:196;;;;:::o;2277:407::-;;;2402:2;2390:9;2381:7;2377:23;2373:32;2370:2;;;2418:1;2415;2408:12;2370:2;2461:1;2486:53;2531:7;2522:6;2511:9;2507:22;2486:53;:::i;:::-;2476:63;;2432:117;2588:2;2614:53;2659:7;2650:6;2639:9;2635:22;2614:53;:::i;:::-;2604:63;;2559:118;2360:324;;;;;:::o;2690:552::-;;;;2832:2;2820:9;2811:7;2807:23;2803:32;2800:2;;;2848:1;2845;2838:12;2800:2;2891:1;2916:53;2961:7;2952:6;2941:9;2937:22;2916:53;:::i;:::-;2906:63;;2862:117;3018:2;3044:53;3089:7;3080:6;3069:9;3065:22;3044:53;:::i;:::-;3034:63;;2989:118;3146:2;3172:53;3217:7;3208:6;3197:9;3193:22;3172:53;:::i;:::-;3162:63;;3117:118;2790:452;;;;;:::o;3248:809::-;;;;;3416:3;3404:9;3395:7;3391:23;3387:33;3384:2;;;3433:1;3430;3423:12;3384:2;3476:1;3501:53;3546:7;3537:6;3526:9;3522:22;3501:53;:::i;:::-;3491:63;;3447:117;3603:2;3629:53;3674:7;3665:6;3654:9;3650:22;3629:53;:::i;:::-;3619:63;;3574:118;3731:2;3757:53;3802:7;3793:6;3782:9;3778:22;3757:53;:::i;:::-;3747:63;;3702:118;3887:2;3876:9;3872:18;3859:32;3918:18;3910:6;3907:30;3904:2;;;3950:1;3947;3940:12;3904:2;3978:62;4032:7;4023:6;4012:9;4008:22;3978:62;:::i;:::-;3968:72;;3830:220;3374:683;;;;;;;:::o;4063:401::-;;;4185:2;4173:9;4164:7;4160:23;4156:32;4153:2;;;4201:1;4198;4191:12;4153:2;4244:1;4269:53;4314:7;4305:6;4294:9;4290:22;4269:53;:::i;:::-;4259:63;;4215:117;4371:2;4397:50;4439:7;4430:6;4419:9;4415:22;4397:50;:::i;:::-;4387:60;;4342:115;4143:321;;;;;:::o;4470:407::-;;;4595:2;4583:9;4574:7;4570:23;4566:32;4563:2;;;4611:1;4608;4601:12;4563:2;4654:1;4679:53;4724:7;4715:6;4704:9;4700:22;4679:53;:::i;:::-;4669:63;;4625:117;4781:2;4807:53;4852:7;4843:6;4832:9;4828:22;4807:53;:::i;:::-;4797:63;;4752:118;4553:324;;;;;:::o;4883:665::-;;;;5035:2;5023:9;5014:7;5010:23;5006:32;5003:2;;;5051:1;5048;5041:12;5003:2;5094:1;5119:53;5164:7;5155:6;5144:9;5140:22;5119:53;:::i;:::-;5109:63;;5065:117;5221:2;5247:53;5292:7;5283:6;5272:9;5268:22;5247:53;:::i;:::-;5237:63;;5192:118;5377:2;5366:9;5362:18;5349:32;5408:18;5400:6;5397:30;5394:2;;;5440:1;5437;5430:12;5394:2;5468:63;5523:7;5514:6;5503:9;5499:22;5468:63;:::i;:::-;5458:73;;5320:221;4993:555;;;;;:::o;5554:260::-;;5661:2;5649:9;5640:7;5636:23;5632:32;5629:2;;;5677:1;5674;5667:12;5629:2;5720:1;5745:52;5789:7;5780:6;5769:9;5765:22;5745:52;:::i;:::-;5735:62;;5691:116;5619:195;;;;:::o;5820:282::-;;5938:2;5926:9;5917:7;5913:23;5909:32;5906:2;;;5954:1;5951;5944:12;5906:2;5997:1;6022:63;6077:7;6068:6;6057:9;6053:22;6022:63;:::i;:::-;6012:73;;5968:127;5896:206;;;;:::o;6108:375::-;;6226:2;6214:9;6205:7;6201:23;6197:32;6194:2;;;6242:1;6239;6232:12;6194:2;6313:1;6302:9;6298:17;6285:31;6343:18;6335:6;6332:30;6329:2;;;6375:1;6372;6365:12;6329:2;6403:63;6458:7;6449:6;6438:9;6434:22;6403:63;:::i;:::-;6393:73;;6256:220;6184:299;;;;:::o;6489:262::-;;6597:2;6585:9;6576:7;6572:23;6568:32;6565:2;;;6613:1;6610;6603:12;6565:2;6656:1;6681:53;6726:7;6717:6;6706:9;6702:22;6681:53;:::i;:::-;6671:63;;6627:117;6555:196;;;;:::o;6757:118::-;6844:24;6862:5;6844:24;:::i;:::-;6839:3;6832:37;6822:53;;:::o;6881:109::-;6962:21;6977:5;6962:21;:::i;:::-;6957:3;6950:34;6940:50;;:::o;6996:360::-;;7110:38;7142:5;7110:38;:::i;:::-;7164:70;7227:6;7222:3;7164:70;:::i;:::-;7157:77;;7243:52;7288:6;7283:3;7276:4;7269:5;7265:16;7243:52;:::i;:::-;7320:29;7342:6;7320:29;:::i;:::-;7315:3;7311:39;7304:46;;7086:270;;;;;:::o;7362:364::-;;7478:39;7511:5;7478:39;:::i;:::-;7533:71;7597:6;7592:3;7533:71;:::i;:::-;7526:78;;7613:52;7658:6;7653:3;7646:4;7639:5;7635:16;7613:52;:::i;:::-;7690:29;7712:6;7690:29;:::i;:::-;7685:3;7681:39;7674:46;;7454:272;;;;;:::o;7732:377::-;;7866:39;7899:5;7866:39;:::i;:::-;7921:89;8003:6;7998:3;7921:89;:::i;:::-;7914:96;;8019:52;8064:6;8059:3;8052:4;8045:5;8041:16;8019:52;:::i;:::-;8096:6;8091:3;8087:16;8080:23;;7842:267;;;;;:::o;8115:365::-;;8278:66;8342:1;8337:3;8278:66;:::i;:::-;8271:73;;8353:93;8442:3;8353:93;:::i;:::-;8471:2;8466:3;8462:12;8455:19;;8261:219;;;:::o;8486:366::-;;8649:67;8713:2;8708:3;8649:67;:::i;:::-;8642:74;;8725:93;8814:3;8725:93;:::i;:::-;8843:2;8838:3;8834:12;8827:19;;8632:220;;;:::o;8858:366::-;;9021:67;9085:2;9080:3;9021:67;:::i;:::-;9014:74;;9097:93;9186:3;9097:93;:::i;:::-;9215:2;9210:3;9206:12;9199:19;;9004:220;;;:::o;9230:366::-;;9393:67;9457:2;9452:3;9393:67;:::i;:::-;9386:74;;9469:93;9558:3;9469:93;:::i;:::-;9587:2;9582:3;9578:12;9571:19;;9376:220;;;:::o;9602:366::-;;9765:67;9829:2;9824:3;9765:67;:::i;:::-;9758:74;;9841:93;9930:3;9841:93;:::i;:::-;9959:2;9954:3;9950:12;9943:19;;9748:220;;;:::o;9974:366::-;;10137:67;10201:2;10196:3;10137:67;:::i;:::-;10130:74;;10213:93;10302:3;10213:93;:::i;:::-;10331:2;10326:3;10322:12;10315:19;;10120:220;;;:::o;10346:366::-;;10509:67;10573:2;10568:3;10509:67;:::i;:::-;10502:74;;10585:93;10674:3;10585:93;:::i;:::-;10703:2;10698:3;10694:12;10687:19;;10492:220;;;:::o;10718:366::-;;10881:67;10945:2;10940:3;10881:67;:::i;:::-;10874:74;;10957:93;11046:3;10957:93;:::i;:::-;11075:2;11070:3;11066:12;11059:19;;10864:220;;;:::o;11090:366::-;;11253:67;11317:2;11312:3;11253:67;:::i;:::-;11246:74;;11329:93;11418:3;11329:93;:::i;:::-;11447:2;11442:3;11438:12;11431:19;;11236:220;;;:::o;11462:366::-;;11625:67;11689:2;11684:3;11625:67;:::i;:::-;11618:74;;11701:93;11790:3;11701:93;:::i;:::-;11819:2;11814:3;11810:12;11803:19;;11608:220;;;:::o;11834:366::-;;11997:67;12061:2;12056:3;11997:67;:::i;:::-;11990:74;;12073:93;12162:3;12073:93;:::i;:::-;12191:2;12186:3;12182:12;12175:19;;11980:220;;;:::o;12206:366::-;;12369:67;12433:2;12428:3;12369:67;:::i;:::-;12362:74;;12445:93;12534:3;12445:93;:::i;:::-;12563:2;12558:3;12554:12;12547:19;;12352:220;;;:::o;12578:366::-;;12741:67;12805:2;12800:3;12741:67;:::i;:::-;12734:74;;12817:93;12906:3;12817:93;:::i;:::-;12935:2;12930:3;12926:12;12919:19;;12724:220;;;:::o;12950:366::-;;13113:67;13177:2;13172:3;13113:67;:::i;:::-;13106:74;;13189:93;13278:3;13189:93;:::i;:::-;13307:2;13302:3;13298:12;13291:19;;13096:220;;;:::o;13322:366::-;;13485:67;13549:2;13544:3;13485:67;:::i;:::-;13478:74;;13561:93;13650:3;13561:93;:::i;:::-;13679:2;13674:3;13670:12;13663:19;;13468:220;;;:::o;13694:366::-;;13857:67;13921:2;13916:3;13857:67;:::i;:::-;13850:74;;13933:93;14022:3;13933:93;:::i;:::-;14051:2;14046:3;14042:12;14035:19;;13840:220;;;:::o;14066:366::-;;14229:67;14293:2;14288:3;14229:67;:::i;:::-;14222:74;;14305:93;14394:3;14305:93;:::i;:::-;14423:2;14418:3;14414:12;14407:19;;14212:220;;;:::o;14438:366::-;;14601:67;14665:2;14660:3;14601:67;:::i;:::-;14594:74;;14677:93;14766:3;14677:93;:::i;:::-;14795:2;14790:3;14786:12;14779:19;;14584:220;;;:::o;14810:366::-;;14973:67;15037:2;15032:3;14973:67;:::i;:::-;14966:74;;15049:93;15138:3;15049:93;:::i;:::-;15167:2;15162:3;15158:12;15151:19;;14956:220;;;:::o;15182:366::-;;15345:67;15409:2;15404:3;15345:67;:::i;:::-;15338:74;;15421:93;15510:3;15421:93;:::i;:::-;15539:2;15534:3;15530:12;15523:19;;15328:220;;;:::o;15554:366::-;;15717:67;15781:2;15776:3;15717:67;:::i;:::-;15710:74;;15793:93;15882:3;15793:93;:::i;:::-;15911:2;15906:3;15902:12;15895:19;;15700:220;;;:::o;15926:118::-;16013:24;16031:5;16013:24;:::i;:::-;16008:3;16001:37;15991:53;;:::o;16050:435::-;;16252:95;16343:3;16334:6;16252:95;:::i;:::-;16245:102;;16364:95;16455:3;16446:6;16364:95;:::i;:::-;16357:102;;16476:3;16469:10;;16234:251;;;;;:::o;16491:222::-;;16622:2;16611:9;16607:18;16599:26;;16635:71;16703:1;16692:9;16688:17;16679:6;16635:71;:::i;:::-;16589:124;;;;:::o;16719:640::-;;16952:3;16941:9;16937:19;16929:27;;16966:71;17034:1;17023:9;17019:17;17010:6;16966:71;:::i;:::-;17047:72;17115:2;17104:9;17100:18;17091:6;17047:72;:::i;:::-;17129;17197:2;17186:9;17182:18;17173:6;17129:72;:::i;:::-;17248:9;17242:4;17238:20;17233:2;17222:9;17218:18;17211:48;17276:76;17347:4;17338:6;17276:76;:::i;:::-;17268:84;;16919:440;;;;;;;:::o;17365:210::-;;17490:2;17479:9;17475:18;17467:26;;17503:65;17565:1;17554:9;17550:17;17541:6;17503:65;:::i;:::-;17457:118;;;;:::o;17581:313::-;;17732:2;17721:9;17717:18;17709:26;;17781:9;17775:4;17771:20;17767:1;17756:9;17752:17;17745:47;17809:78;17882:4;17873:6;17809:78;:::i;:::-;17801:86;;17699:195;;;;:::o;17900:419::-;;18104:2;18093:9;18089:18;18081:26;;18153:9;18147:4;18143:20;18139:1;18128:9;18124:17;18117:47;18181:131;18307:4;18181:131;:::i;:::-;18173:139;;18071:248;;;:::o;18325:419::-;;18529:2;18518:9;18514:18;18506:26;;18578:9;18572:4;18568:20;18564:1;18553:9;18549:17;18542:47;18606:131;18732:4;18606:131;:::i;:::-;18598:139;;18496:248;;;:::o;18750:419::-;;18954:2;18943:9;18939:18;18931:26;;19003:9;18997:4;18993:20;18989:1;18978:9;18974:17;18967:47;19031:131;19157:4;19031:131;:::i;:::-;19023:139;;18921:248;;;:::o;19175:419::-;;19379:2;19368:9;19364:18;19356:26;;19428:9;19422:4;19418:20;19414:1;19403:9;19399:17;19392:47;19456:131;19582:4;19456:131;:::i;:::-;19448:139;;19346:248;;;:::o;19600:419::-;;19804:2;19793:9;19789:18;19781:26;;19853:9;19847:4;19843:20;19839:1;19828:9;19824:17;19817:47;19881:131;20007:4;19881:131;:::i;:::-;19873:139;;19771:248;;;:::o;20025:419::-;;20229:2;20218:9;20214:18;20206:26;;20278:9;20272:4;20268:20;20264:1;20253:9;20249:17;20242:47;20306:131;20432:4;20306:131;:::i;:::-;20298:139;;20196:248;;;:::o;20450:419::-;;20654:2;20643:9;20639:18;20631:26;;20703:9;20697:4;20693:20;20689:1;20678:9;20674:17;20667:47;20731:131;20857:4;20731:131;:::i;:::-;20723:139;;20621:248;;;:::o;20875:419::-;;21079:2;21068:9;21064:18;21056:26;;21128:9;21122:4;21118:20;21114:1;21103:9;21099:17;21092:47;21156:131;21282:4;21156:131;:::i;:::-;21148:139;;21046:248;;;:::o;21300:419::-;;21504:2;21493:9;21489:18;21481:26;;21553:9;21547:4;21543:20;21539:1;21528:9;21524:17;21517:47;21581:131;21707:4;21581:131;:::i;:::-;21573:139;;21471:248;;;:::o;21725:419::-;;21929:2;21918:9;21914:18;21906:26;;21978:9;21972:4;21968:20;21964:1;21953:9;21949:17;21942:47;22006:131;22132:4;22006:131;:::i;:::-;21998:139;;21896:248;;;:::o;22150:419::-;;22354:2;22343:9;22339:18;22331:26;;22403:9;22397:4;22393:20;22389:1;22378:9;22374:17;22367:47;22431:131;22557:4;22431:131;:::i;:::-;22423:139;;22321:248;;;:::o;22575:419::-;;22779:2;22768:9;22764:18;22756:26;;22828:9;22822:4;22818:20;22814:1;22803:9;22799:17;22792:47;22856:131;22982:4;22856:131;:::i;:::-;22848:139;;22746:248;;;:::o;23000:419::-;;23204:2;23193:9;23189:18;23181:26;;23253:9;23247:4;23243:20;23239:1;23228:9;23224:17;23217:47;23281:131;23407:4;23281:131;:::i;:::-;23273:139;;23171:248;;;:::o;23425:419::-;;23629:2;23618:9;23614:18;23606:26;;23678:9;23672:4;23668:20;23664:1;23653:9;23649:17;23642:47;23706:131;23832:4;23706:131;:::i;:::-;23698:139;;23596:248;;;:::o;23850:419::-;;24054:2;24043:9;24039:18;24031:26;;24103:9;24097:4;24093:20;24089:1;24078:9;24074:17;24067:47;24131:131;24257:4;24131:131;:::i;:::-;24123:139;;24021:248;;;:::o;24275:419::-;;24479:2;24468:9;24464:18;24456:26;;24528:9;24522:4;24518:20;24514:1;24503:9;24499:17;24492:47;24556:131;24682:4;24556:131;:::i;:::-;24548:139;;24446:248;;;:::o;24700:419::-;;24904:2;24893:9;24889:18;24881:26;;24953:9;24947:4;24943:20;24939:1;24928:9;24924:17;24917:47;24981:131;25107:4;24981:131;:::i;:::-;24973:139;;24871:248;;;:::o;25125:419::-;;25329:2;25318:9;25314:18;25306:26;;25378:9;25372:4;25368:20;25364:1;25353:9;25349:17;25342:47;25406:131;25532:4;25406:131;:::i;:::-;25398:139;;25296:248;;;:::o;25550:419::-;;25754:2;25743:9;25739:18;25731:26;;25803:9;25797:4;25793:20;25789:1;25778:9;25774:17;25767:47;25831:131;25957:4;25831:131;:::i;:::-;25823:139;;25721:248;;;:::o;25975:419::-;;26179:2;26168:9;26164:18;26156:26;;26228:9;26222:4;26218:20;26214:1;26203:9;26199:17;26192:47;26256:131;26382:4;26256:131;:::i;:::-;26248:139;;26146:248;;;:::o;26400:419::-;;26604:2;26593:9;26589:18;26581:26;;26653:9;26647:4;26643:20;26639:1;26628:9;26624:17;26617:47;26681:131;26807:4;26681:131;:::i;:::-;26673:139;;26571:248;;;:::o;26825:222::-;;26956:2;26945:9;26941:18;26933:26;;26969:71;27037:1;27026:9;27022:17;27013:6;26969:71;:::i;:::-;26923:124;;;;:::o;27053:129::-;;27114:20;;:::i;:::-;27104:30;;27143:33;27171:4;27163:6;27143:33;:::i;:::-;27094:88;;;:::o;27188:75::-;;27254:2;27248:9;27238:19;;27228:35;:::o;27269:307::-;;27420:18;27412:6;27409:30;27406:2;;;27442:18;;:::i;:::-;27406:2;27480:29;27502:6;27480:29;:::i;:::-;27472:37;;27564:4;27558;27554:15;27546:23;;27335:241;;;:::o;27582:308::-;;27734:18;27726:6;27723:30;27720:2;;;27756:18;;:::i;:::-;27720:2;27794:29;27816:6;27794:29;:::i;:::-;27786:37;;27878:4;27872;27868:15;27860:23;;27649:241;;;:::o;27896:98::-;;27981:5;27975:12;27965:22;;27954:40;;;:::o;28000:99::-;;28086:5;28080:12;28070:22;;28059:40;;;:::o;28105:168::-;;28222:6;28217:3;28210:19;28262:4;28257:3;28253:14;28238:29;;28200:73;;;;:::o;28279:169::-;;28397:6;28392:3;28385:19;28437:4;28432:3;28428:14;28413:29;;28375:73;;;;:::o;28454:148::-;;28593:3;28578:18;;28568:34;;;;:::o;28608:305::-;;28667:20;28685:1;28667:20;:::i;:::-;28662:25;;28701:20;28719:1;28701:20;:::i;:::-;28696:25;;28855:1;28787:66;28783:74;28780:1;28777:81;28774:2;;;28861:18;;:::i;:::-;28774:2;28905:1;28902;28898:9;28891:16;;28652:261;;;;:::o;28919:185::-;;28976:20;28994:1;28976:20;:::i;:::-;28971:25;;29010:20;29028:1;29010:20;:::i;:::-;29005:25;;29049:1;29039:2;;29054:18;;:::i;:::-;29039:2;29096:1;29093;29089:9;29084:14;;28961:143;;;;:::o;29110:191::-;;29170:20;29188:1;29170:20;:::i;:::-;29165:25;;29204:20;29222:1;29204:20;:::i;:::-;29199:25;;29243:1;29240;29237:8;29234:2;;;29248:18;;:::i;:::-;29234:2;29293:1;29290;29286:9;29278:17;;29155:146;;;;:::o;29307:96::-;;29373:24;29391:5;29373:24;:::i;:::-;29362:35;;29352:51;;;:::o;29409:90::-;;29486:5;29479:13;29472:21;29461:32;;29451:48;;;:::o;29505:149::-;;29581:66;29574:5;29570:78;29559:89;;29549:105;;;:::o;29660:126::-;;29737:42;29730:5;29726:54;29715:65;;29705:81;;;:::o;29792:77::-;;29858:5;29847:16;;29837:32;;;:::o;29875:154::-;29959:6;29954:3;29949;29936:30;30021:1;30012:6;30007:3;30003:16;29996:27;29926:103;;;:::o;30035:307::-;30103:1;30113:113;30127:6;30124:1;30121:13;30113:113;;;30212:1;30207:3;30203:11;30197:18;30193:1;30188:3;30184:11;30177:39;30149:2;30146:1;30142:10;30137:15;;30113:113;;;30244:6;30241:1;30238:13;30235:2;;;30324:1;30315:6;30310:3;30306:16;30299:27;30235:2;30084:258;;;;:::o;30348:320::-;;30429:1;30423:4;30419:12;30409:22;;30476:1;30470:4;30466:12;30497:18;30487:2;;30553:4;30545:6;30541:17;30531:27;;30487:2;30615;30607:6;30604:14;30584:18;30581:38;30578:2;;;30634:18;;:::i;:::-;30578:2;30399:269;;;;:::o;30674:281::-;30757:27;30779:4;30757:27;:::i;:::-;30749:6;30745:40;30887:6;30875:10;30872:22;30851:18;30839:10;30836:34;30833:62;30830:2;;;30898:18;;:::i;:::-;30830:2;30938:10;30934:2;30927:22;30717:238;;;:::o;30961:233::-;;31023:24;31041:5;31023:24;:::i;:::-;31014:33;;31069:66;31062:5;31059:77;31056:2;;;31139:18;;:::i;:::-;31056:2;31186:1;31179:5;31175:13;31168:20;;31004:190;;;:::o;31200:176::-;;31249:20;31267:1;31249:20;:::i;:::-;31244:25;;31283:20;31301:1;31283:20;:::i;:::-;31278:25;;31322:1;31312:2;;31327:18;;:::i;:::-;31312:2;31368:1;31365;31361:9;31356:14;;31234:142;;;;:::o;31382:180::-;31430:77;31427:1;31420:88;31527:4;31524:1;31517:15;31551:4;31548:1;31541:15;31568:180;31616:77;31613:1;31606:88;31713:4;31710:1;31703:15;31737:4;31734:1;31727:15;31754:180;31802:77;31799:1;31792:88;31899:4;31896:1;31889:15;31923:4;31920:1;31913:15;31940:180;31988:77;31985:1;31978:88;32085:4;32082:1;32075:15;32109:4;32106:1;32099:15;32126:102;;32218:2;32214:7;32209:2;32202:5;32198:14;32194:28;32184:38;;32174:54;;;:::o;32234:155::-;32374:7;32370:1;32362:6;32358:14;32351:31;32340:49;:::o;32395:230::-;32535:34;32531:1;32523:6;32519:14;32512:58;32604:13;32599:2;32591:6;32587:15;32580:38;32501:124;:::o;32631:237::-;32771:34;32767:1;32759:6;32755:14;32748:58;32840:20;32835:2;32827:6;32823:15;32816:45;32737:131;:::o;32874:225::-;33014:34;33010:1;33002:6;32998:14;32991:58;33083:8;33078:2;33070:6;33066:15;33059:33;32980:119;:::o;33105:178::-;33245:30;33241:1;33233:6;33229:14;33222:54;33211:72;:::o;33289:223::-;33429:34;33425:1;33417:6;33413:14;33406:58;33498:6;33493:2;33485:6;33481:15;33474:31;33395:117;:::o;33518:175::-;33658:27;33654:1;33646:6;33642:14;33635:51;33624:69;:::o;33699:231::-;33839:34;33835:1;33827:6;33823:14;33816:58;33908:14;33903:2;33895:6;33891:15;33884:39;33805:125;:::o;33936:243::-;34076:34;34072:1;34064:6;34060:14;34053:58;34145:26;34140:2;34132:6;34128:15;34121:51;34042:137;:::o;34185:229::-;34325:34;34321:1;34313:6;34309:14;34302:58;34394:12;34389:2;34381:6;34377:15;34370:37;34291:123;:::o;34420:228::-;34560:34;34556:1;34548:6;34544:14;34537:58;34629:11;34624:2;34616:6;34612:15;34605:36;34526:122;:::o;34654:182::-;34794:34;34790:1;34782:6;34778:14;34771:58;34760:76;:::o;34842:231::-;34982:34;34978:1;34970:6;34966:14;34959:58;35051:14;35046:2;35038:6;35034:15;35027:39;34948:125;:::o;35079:231::-;35219:34;35215:1;35207:6;35203:14;35196:58;35288:14;35283:2;35275:6;35271:15;35264:39;35185:125;:::o;35316:182::-;35456:34;35452:1;35444:6;35440:14;35433:58;35422:76;:::o;35504:228::-;35644:34;35640:1;35632:6;35628:14;35621:58;35713:11;35708:2;35700:6;35696:15;35689:36;35610:122;:::o;35738:234::-;35878:34;35874:1;35866:6;35862:14;35855:58;35947:17;35942:2;35934:6;35930:15;35923:42;35844:128;:::o;35978:220::-;36118:34;36114:1;36106:6;36102:14;36095:58;36187:3;36182:2;36174:6;36170:15;36163:28;36084:114;:::o;36204:236::-;36344:34;36340:1;36332:6;36328:14;36321:58;36413:19;36408:2;36400:6;36396:15;36389:44;36310:130;:::o;36446:231::-;36586:34;36582:1;36574:6;36570:14;36563:58;36655:14;36650:2;36642:6;36638:15;36631:39;36552:125;:::o;36683:235::-;36823:34;36819:1;36811:6;36807:14;36800:58;36892:18;36887:2;36879:6;36875:15;36868:43;36789:129;:::o;36924:122::-;36997:24;37015:5;36997:24;:::i;:::-;36990:5;36987:35;36977:2;;37036:1;37033;37026:12;36977:2;36967:79;:::o;37052:116::-;37122:21;37137:5;37122:21;:::i;:::-;37115:5;37112:32;37102:2;;37158:1;37155;37148:12;37102:2;37092:76;:::o;37174:120::-;37246:23;37263:5;37246:23;:::i;:::-;37239:5;37236:34;37226:2;;37284:1;37281;37274:12;37226:2;37216:78;:::o;37300:122::-;37373:24;37391:5;37373:24;:::i;:::-;37366:5;37363:35;37353:2;;37412:1;37409;37402:12;37353:2;37343:79;:::o
Swarm Source
ipfs://3cc3dd37d948b7d8ccfc452f98a4ffa0ca11fbdbb19fba75e3917474cd10df06
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.