ERC-721
Overview
Max Total Supply
3,333 KoolKittens
Holders
800
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
2 KoolKittensLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
KoolKittensNFT
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-11-18 */ // SPDX-License-Identifier: MIT /* __/\\\______________/\\\\\\\\\\\\\_______/\\\\\\\\\___________/\\\\\\\\\_ _\/\\\_____________\/\\\/////////\\\___/\\\\\\\\\\\\\______/\\\////////__ _\/\\\_____________\/\\\_______\/\\\__/\\\/////////\\\___/\\\/___________ _\/\\\_____________\/\\\\\\\\\\\\\\__\/\\\_______\/\\\__/\\\_____________ _\/\\\_____________\/\\\/////////\\\_\/\\\\\\\\\\\\\\\_\/\\\_____________ _\/\\\_____________\/\\\_______\/\\\_\/\\\/////////\\\_\//\\\____________ _\/\\\_____________\/\\\_______\/\\\_\/\\\_______\/\\\__\///\\\__________ _\/\\\\\\\\\\\\\\\_\/\\\\\\\\\\\\\/__\/\\\_______\/\\\____\////\\\\\\\\\_ _\///////////////__\/////////////____\///________\///________\/////////__ */ // File: @openzeppelin/contracts/utils/introspection/IERC165.sol pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol 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/utils/introspection/ERC165.sol pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/utils/Strings.sol pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/utils/Address.sol pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/Context.sol pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { 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"); _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/ERC721Enumerable.sol pragma solidity ^0.8.0; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } // File: @openzeppelin/contracts/access/Ownable.sol pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _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); } } pragma solidity ^0.8.0; contract KoolKittensNFT is ERC721Enumerable, Ownable { using Strings for uint256; string public baseURI; uint256 public cost = 20000000000000000; // 0.02 eth uint256 public maxSupply = 3333; uint256 public maxMintAmount = 20; bool public paused = false; mapping(address => bool) public whitelisted; constructor() ERC721("Kool Kittens", "KoolKittens") { } // internal function _baseURI() internal view virtual override returns (string memory) { return baseURI; } // public function mint(address _to, uint256 _mintAmount) public payable { uint256 supply = totalSupply(); require(!paused); require(msg.value >= cost); require(_mintAmount > 0); require(_mintAmount <= maxMintAmount); require(supply + _mintAmount <= maxSupply); if (msg.sender != owner()) { if(whitelisted[msg.sender] != true) { require(msg.value >= cost * _mintAmount); } } for (uint256 i = 1; i <= _mintAmount; i++) { _safeMint(_to, supply + i); } } // free function mintFREE(address _to, uint256 _claimAmount) public payable { uint256 supply = totalSupply(); require(!paused); require(_claimAmount > 0); require(_claimAmount <= 1); require(supply + _claimAmount <= 300); for (uint256 i = 1; i <= _claimAmount; i++) { _safeMint(_to, supply + i); } } function walletOfOwner(address _owner) public view returns (uint256[] memory) { uint256 ownerTokenCount = balanceOf(_owner); uint256[] memory tokenIds = new uint256[](ownerTokenCount); for (uint256 i; i < ownerTokenCount; i++) { tokenIds[i] = tokenOfOwnerByIndex(_owner, i); } return tokenIds; } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require( _exists(tokenId), "ERC721Metadata: URI query for nonexistent token" ); string memory currentBaseURI = _baseURI(); return bytes(currentBaseURI).length > 0 ? string(abi.encodePacked(currentBaseURI, tokenId.toString())) : ""; } //only owner function setCost(uint256 _newCost) public onlyOwner { cost = _newCost; } function setmaxMintAmount(uint256 _newmaxMintAmount) public onlyOwner { maxMintAmount = _newmaxMintAmount; } function setBaseURI(string memory _newBaseURI) public onlyOwner { baseURI = _newBaseURI; } function pause(bool _state) public onlyOwner { paused = _state; } function whitelistUser(address _user) public onlyOwner { whitelisted[_user] = true; } function removeWhitelistUser(address _user) public onlyOwner { whitelisted[_user] = false; } function withdraw() onlyOwner public { uint256 balance = address(this).balance; payable(msg.sender).transfer(balance); } }
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":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"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":[],"name":"maxMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_claimAmount","type":"uint256"}],"name":"mintFREE","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"removeWhitelistUser","outputs":[],"stateMutability":"nonpayable","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":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newmaxMintAmount","type":"uint256"}],"name":"setmaxMintAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"whitelistUser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405266470de4df820000600c55610d05600d556014600e556000600f60006101000a81548160ff0219169083151502179055503480156200004257600080fd5b506040518060400160405280600c81526020017f4b6f6f6c204b697474656e7300000000000000000000000000000000000000008152506040518060400160405280600b81526020017f4b6f6f6c4b697474656e730000000000000000000000000000000000000000008152508160009080519060200190620000c7929190620001d7565b508060019080519060200190620000e0929190620001d7565b50505062000103620000f76200010960201b60201c565b6200011160201b60201c565b620002ec565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620001e59062000287565b90600052602060002090601f01602090048101928262000209576000855562000255565b82601f106200022457805160ff191683800117855562000255565b8280016001018555821562000255579182015b828111156200025457825182559160200191906001019062000237565b5b50905062000264919062000268565b5090565b5b808211156200028357600081600090555060010162000269565b5090565b60006002820490506001821680620002a057607f821691505b60208210811415620002b757620002b6620002bd565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61427780620002fc6000396000f3fe6080604052600436106102045760003560e01c80634f6ccce71161011857806395d89b41116100a0578063c87b56dd1161006f578063c87b56dd14610735578063d5abeb0114610772578063d936547e1461079d578063e985e9c5146107da578063f2fde38b1461081757610204565b806395d89b411461069c578063a22cb465146106c7578063ae75b4dc146106f0578063b88d4fde1461070c57610204565b80636c0360eb116100e75780636c0360eb146105c957806370a08231146105f4578063715018a6146106315780637f00c7a6146106485780638da5cb5b1461067157610204565b80634f6ccce7146104fb57806355f804b3146105385780635c975abb146105615780636352211e1461058c57610204565b806323b872dd1161019b57806340c10f191161016a57806340c10f191461042757806342842e0e14610443578063438b63001461046c57806344a0d68a146104a95780634a4c560d146104d257610204565b806323b872dd146103815780632f745c59146103aa57806330cc7ae0146103e75780633ccfd60b1461041057610204565b8063095ea7b3116101d7578063095ea7b3146102d757806313faede61461030057806318160ddd1461032b578063239c70ae1461035657610204565b806301ffc9a71461020957806302329a291461024657806306fdde031461026f578063081812fc1461029a575b600080fd5b34801561021557600080fd5b50610230600480360381019061022b9190613025565b610840565b60405161023d919061356d565b60405180910390f35b34801561025257600080fd5b5061026d60048036038101906102689190612ff8565b6108ba565b005b34801561027b57600080fd5b50610284610953565b6040516102919190613588565b60405180910390f35b3480156102a657600080fd5b506102c160048036038101906102bc91906130c8565b6109e5565b6040516102ce91906134e4565b60405180910390f35b3480156102e357600080fd5b506102fe60048036038101906102f99190612fb8565b610a6a565b005b34801561030c57600080fd5b50610315610b82565b60405161032291906137ea565b60405180910390f35b34801561033757600080fd5b50610340610b88565b60405161034d91906137ea565b60405180910390f35b34801561036257600080fd5b5061036b610b95565b60405161037891906137ea565b60405180910390f35b34801561038d57600080fd5b506103a860048036038101906103a39190612ea2565b610b9b565b005b3480156103b657600080fd5b506103d160048036038101906103cc9190612fb8565b610bfb565b6040516103de91906137ea565b60405180910390f35b3480156103f357600080fd5b5061040e60048036038101906104099190612e35565b610ca0565b005b34801561041c57600080fd5b50610425610d77565b005b610441600480360381019061043c9190612fb8565b610e42565b005b34801561044f57600080fd5b5061046a60048036038101906104659190612ea2565b610f97565b005b34801561047857600080fd5b50610493600480360381019061048e9190612e35565b610fb7565b6040516104a0919061354b565b60405180910390f35b3480156104b557600080fd5b506104d060048036038101906104cb91906130c8565b611065565b005b3480156104de57600080fd5b506104f960048036038101906104f49190612e35565b6110eb565b005b34801561050757600080fd5b50610522600480360381019061051d91906130c8565b6111c2565b60405161052f91906137ea565b60405180910390f35b34801561054457600080fd5b5061055f600480360381019061055a919061307f565b611233565b005b34801561056d57600080fd5b506105766112c9565b604051610583919061356d565b60405180910390f35b34801561059857600080fd5b506105b360048036038101906105ae91906130c8565b6112dc565b6040516105c091906134e4565b60405180910390f35b3480156105d557600080fd5b506105de61138e565b6040516105eb9190613588565b60405180910390f35b34801561060057600080fd5b5061061b60048036038101906106169190612e35565b61141c565b60405161062891906137ea565b60405180910390f35b34801561063d57600080fd5b506106466114d4565b005b34801561065457600080fd5b5061066f600480360381019061066a91906130c8565b61155c565b005b34801561067d57600080fd5b506106866115e2565b60405161069391906134e4565b60405180910390f35b3480156106a857600080fd5b506106b161160c565b6040516106be9190613588565b60405180910390f35b3480156106d357600080fd5b506106ee60048036038101906106e99190612f78565b61169e565b005b61070a60048036038101906107059190612fb8565b61181f565b005b34801561071857600080fd5b50610733600480360381019061072e9190612ef5565b6118b6565b005b34801561074157600080fd5b5061075c600480360381019061075791906130c8565b611918565b6040516107699190613588565b60405180910390f35b34801561077e57600080fd5b506107876119bf565b60405161079491906137ea565b60405180910390f35b3480156107a957600080fd5b506107c460048036038101906107bf9190612e35565b6119c5565b6040516107d1919061356d565b60405180910390f35b3480156107e657600080fd5b5061080160048036038101906107fc9190612e62565b6119e5565b60405161080e919061356d565b60405180910390f35b34801561082357600080fd5b5061083e60048036038101906108399190612e35565b611a79565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108b357506108b282611b71565b5b9050919050565b6108c2611c53565b73ffffffffffffffffffffffffffffffffffffffff166108e06115e2565b73ffffffffffffffffffffffffffffffffffffffff1614610936576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092d9061372a565b60405180910390fd5b80600f60006101000a81548160ff02191690831515021790555050565b60606000805461096290613ad3565b80601f016020809104026020016040519081016040528092919081815260200182805461098e90613ad3565b80156109db5780601f106109b0576101008083540402835291602001916109db565b820191906000526020600020905b8154815290600101906020018083116109be57829003601f168201915b5050505050905090565b60006109f082611c5b565b610a2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a269061370a565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a75826112dc565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ae6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610add9061378a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b05611c53565b73ffffffffffffffffffffffffffffffffffffffff161480610b345750610b3381610b2e611c53565b6119e5565b5b610b73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6a9061368a565b60405180910390fd5b610b7d8383611cc7565b505050565b600c5481565b6000600880549050905090565b600e5481565b610bac610ba6611c53565b82611d80565b610beb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be2906137aa565b60405180910390fd5b610bf6838383611e5e565b505050565b6000610c068361141c565b8210610c47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3e906135aa565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610ca8611c53565b73ffffffffffffffffffffffffffffffffffffffff16610cc66115e2565b73ffffffffffffffffffffffffffffffffffffffff1614610d1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d139061372a565b60405180910390fd5b6000601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b610d7f611c53565b73ffffffffffffffffffffffffffffffffffffffff16610d9d6115e2565b73ffffffffffffffffffffffffffffffffffffffff1614610df3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dea9061372a565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610e3e573d6000803e3d6000fd5b5050565b6000610e4c610b88565b9050600f60009054906101000a900460ff1615610e6857600080fd5b600c54341015610e7757600080fd5b60008211610e8457600080fd5b600e54821115610e9357600080fd5b600d548282610ea29190613908565b1115610ead57600080fd5b610eb56115e2565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610f5b5760011515601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514610f5a5781600c54610f4d919061398f565b341015610f5957600080fd5b5b5b6000600190505b828111610f9157610f7e848284610f799190613908565b6120ba565b8080610f8990613b36565b915050610f62565b50505050565b610fb2838383604051806020016040528060008152506118b6565b505050565b60606000610fc48361141c565b905060008167ffffffffffffffff811115610fe257610fe1613c9b565b5b6040519080825280602002602001820160405280156110105781602001602082028036833780820191505090505b50905060005b8281101561105a576110288582610bfb565b82828151811061103b5761103a613c6c565b5b602002602001018181525050808061105290613b36565b915050611016565b508092505050919050565b61106d611c53565b73ffffffffffffffffffffffffffffffffffffffff1661108b6115e2565b73ffffffffffffffffffffffffffffffffffffffff16146110e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d89061372a565b60405180910390fd5b80600c8190555050565b6110f3611c53565b73ffffffffffffffffffffffffffffffffffffffff166111116115e2565b73ffffffffffffffffffffffffffffffffffffffff1614611167576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115e9061372a565b60405180910390fd5b6001601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60006111cc610b88565b821061120d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611204906137ca565b60405180910390fd5b6008828154811061122157611220613c6c565b5b90600052602060002001549050919050565b61123b611c53565b73ffffffffffffffffffffffffffffffffffffffff166112596115e2565b73ffffffffffffffffffffffffffffffffffffffff16146112af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a69061372a565b60405180910390fd5b80600b90805190602001906112c5929190612c49565b5050565b600f60009054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611385576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137c906136ca565b60405180910390fd5b80915050919050565b600b805461139b90613ad3565b80601f01602080910402602001604051908101604052809291908181526020018280546113c790613ad3565b80156114145780601f106113e957610100808354040283529160200191611414565b820191906000526020600020905b8154815290600101906020018083116113f757829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561148d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611484906136aa565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6114dc611c53565b73ffffffffffffffffffffffffffffffffffffffff166114fa6115e2565b73ffffffffffffffffffffffffffffffffffffffff1614611550576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115479061372a565b60405180910390fd5b61155a60006120d8565b565b611564611c53565b73ffffffffffffffffffffffffffffffffffffffff166115826115e2565b73ffffffffffffffffffffffffffffffffffffffff16146115d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115cf9061372a565b60405180910390fd5b80600e8190555050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461161b90613ad3565b80601f016020809104026020016040519081016040528092919081815260200182805461164790613ad3565b80156116945780601f1061166957610100808354040283529160200191611694565b820191906000526020600020905b81548152906001019060200180831161167757829003601f168201915b5050505050905090565b6116a6611c53565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611714576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170b9061364a565b60405180910390fd5b8060056000611721611c53565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166117ce611c53565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611813919061356d565b60405180910390a35050565b6000611829610b88565b9050600f60009054906101000a900460ff161561184557600080fd5b6000821161185257600080fd5b600182111561186057600080fd5b61012c828261186f9190613908565b111561187a57600080fd5b6000600190505b8281116118b05761189d8482846118989190613908565b6120ba565b80806118a890613b36565b915050611881565b50505050565b6118c76118c1611c53565b83611d80565b611906576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118fd906137aa565b60405180910390fd5b6119128484848461219e565b50505050565b606061192382611c5b565b611962576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119599061376a565b60405180910390fd5b600061196c6121fa565b9050600081511161198c57604051806020016040528060008152506119b7565b806119968461228c565b6040516020016119a79291906134c0565b6040516020818303038152906040525b915050919050565b600d5481565b60106020528060005260406000206000915054906101000a900460ff1681565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611a81611c53565b73ffffffffffffffffffffffffffffffffffffffff16611a9f6115e2565b73ffffffffffffffffffffffffffffffffffffffff1614611af5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aec9061372a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611b65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5c906135ea565b60405180910390fd5b611b6e816120d8565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611c3c57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611c4c5750611c4b826123ed565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611d3a836112dc565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611d8b82611c5b565b611dca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dc19061366a565b60405180910390fd5b6000611dd5836112dc565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611e4457508373ffffffffffffffffffffffffffffffffffffffff16611e2c846109e5565b73ffffffffffffffffffffffffffffffffffffffff16145b80611e555750611e5481856119e5565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611e7e826112dc565b73ffffffffffffffffffffffffffffffffffffffff1614611ed4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ecb9061374a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3b9061362a565b60405180910390fd5b611f4f838383612457565b611f5a600082611cc7565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611faa91906139e9565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120019190613908565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6120d482826040518060200160405280600081525061256b565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6121a9848484611e5e565b6121b5848484846125c6565b6121f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121eb906135ca565b60405180910390fd5b50505050565b6060600b805461220990613ad3565b80601f016020809104026020016040519081016040528092919081815260200182805461223590613ad3565b80156122825780601f1061225757610100808354040283529160200191612282565b820191906000526020600020905b81548152906001019060200180831161226557829003601f168201915b5050505050905090565b606060008214156122d4576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506123e8565b600082905060005b600082146123065780806122ef90613b36565b915050600a826122ff919061395e565b91506122dc565b60008167ffffffffffffffff81111561232257612321613c9b565b5b6040519080825280601f01601f1916602001820160405280156123545781602001600182028036833780820191505090505b5090505b600085146123e15760018261236d91906139e9565b9150600a8561237c9190613b7f565b60306123889190613908565b60f81b81838151811061239e5761239d613c6c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856123da919061395e565b9450612358565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61246283838361275d565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156124a5576124a081612762565b6124e4565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146124e3576124e283826127ab565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156125275761252281612918565b612566565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146125655761256482826129e9565b5b5b505050565b6125758383612a68565b61258260008484846125c6565b6125c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125b8906135ca565b60405180910390fd5b505050565b60006125e78473ffffffffffffffffffffffffffffffffffffffff16612c36565b15612750578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612610611c53565b8786866040518563ffffffff1660e01b815260040161263294939291906134ff565b602060405180830381600087803b15801561264c57600080fd5b505af192505050801561267d57506040513d601f19601f8201168201806040525081019061267a9190613052565b60015b612700573d80600081146126ad576040519150601f19603f3d011682016040523d82523d6000602084013e6126b2565b606091505b506000815114156126f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ef906135ca565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612755565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016127b88461141c565b6127c291906139e9565b90506000600760008481526020019081526020016000205490508181146128a7576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061292c91906139e9565b905060006009600084815260200190815260200160002054905060006008838154811061295c5761295b613c6c565b5b90600052602060002001549050806008838154811061297e5761297d613c6c565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806129cd576129cc613c3d565b5b6001900381819060005260206000200160009055905550505050565b60006129f48361141c565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612ad8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612acf906136ea565b60405180910390fd5b612ae181611c5b565b15612b21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b189061360a565b60405180910390fd5b612b2d60008383612457565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612b7d9190613908565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b828054612c5590613ad3565b90600052602060002090601f016020900481019282612c775760008555612cbe565b82601f10612c9057805160ff1916838001178555612cbe565b82800160010185558215612cbe579182015b82811115612cbd578251825591602001919060010190612ca2565b5b509050612ccb9190612ccf565b5090565b5b80821115612ce8576000816000905550600101612cd0565b5090565b6000612cff612cfa8461382a565b613805565b905082815260208101848484011115612d1b57612d1a613ccf565b5b612d26848285613a91565b509392505050565b6000612d41612d3c8461385b565b613805565b905082815260208101848484011115612d5d57612d5c613ccf565b5b612d68848285613a91565b509392505050565b600081359050612d7f816141e5565b92915050565b600081359050612d94816141fc565b92915050565b600081359050612da981614213565b92915050565b600081519050612dbe81614213565b92915050565b600082601f830112612dd957612dd8613cca565b5b8135612de9848260208601612cec565b91505092915050565b600082601f830112612e0757612e06613cca565b5b8135612e17848260208601612d2e565b91505092915050565b600081359050612e2f8161422a565b92915050565b600060208284031215612e4b57612e4a613cd9565b5b6000612e5984828501612d70565b91505092915050565b60008060408385031215612e7957612e78613cd9565b5b6000612e8785828601612d70565b9250506020612e9885828601612d70565b9150509250929050565b600080600060608486031215612ebb57612eba613cd9565b5b6000612ec986828701612d70565b9350506020612eda86828701612d70565b9250506040612eeb86828701612e20565b9150509250925092565b60008060008060808587031215612f0f57612f0e613cd9565b5b6000612f1d87828801612d70565b9450506020612f2e87828801612d70565b9350506040612f3f87828801612e20565b925050606085013567ffffffffffffffff811115612f6057612f5f613cd4565b5b612f6c87828801612dc4565b91505092959194509250565b60008060408385031215612f8f57612f8e613cd9565b5b6000612f9d85828601612d70565b9250506020612fae85828601612d85565b9150509250929050565b60008060408385031215612fcf57612fce613cd9565b5b6000612fdd85828601612d70565b9250506020612fee85828601612e20565b9150509250929050565b60006020828403121561300e5761300d613cd9565b5b600061301c84828501612d85565b91505092915050565b60006020828403121561303b5761303a613cd9565b5b600061304984828501612d9a565b91505092915050565b60006020828403121561306857613067613cd9565b5b600061307684828501612daf565b91505092915050565b60006020828403121561309557613094613cd9565b5b600082013567ffffffffffffffff8111156130b3576130b2613cd4565b5b6130bf84828501612df2565b91505092915050565b6000602082840312156130de576130dd613cd9565b5b60006130ec84828501612e20565b91505092915050565b600061310183836134a2565b60208301905092915050565b61311681613a1d565b82525050565b60006131278261389c565b61313181856138ca565b935061313c8361388c565b8060005b8381101561316d57815161315488826130f5565b975061315f836138bd565b925050600181019050613140565b5085935050505092915050565b61318381613a2f565b82525050565b6000613194826138a7565b61319e81856138db565b93506131ae818560208601613aa0565b6131b781613cde565b840191505092915050565b60006131cd826138b2565b6131d781856138ec565b93506131e7818560208601613aa0565b6131f081613cde565b840191505092915050565b6000613206826138b2565b61321081856138fd565b9350613220818560208601613aa0565b80840191505092915050565b6000613239602b836138ec565b915061324482613cef565b604082019050919050565b600061325c6032836138ec565b915061326782613d3e565b604082019050919050565b600061327f6026836138ec565b915061328a82613d8d565b604082019050919050565b60006132a2601c836138ec565b91506132ad82613ddc565b602082019050919050565b60006132c56024836138ec565b91506132d082613e05565b604082019050919050565b60006132e86019836138ec565b91506132f382613e54565b602082019050919050565b600061330b602c836138ec565b915061331682613e7d565b604082019050919050565b600061332e6038836138ec565b915061333982613ecc565b604082019050919050565b6000613351602a836138ec565b915061335c82613f1b565b604082019050919050565b60006133746029836138ec565b915061337f82613f6a565b604082019050919050565b60006133976020836138ec565b91506133a282613fb9565b602082019050919050565b60006133ba602c836138ec565b91506133c582613fe2565b604082019050919050565b60006133dd6020836138ec565b91506133e882614031565b602082019050919050565b60006134006029836138ec565b915061340b8261405a565b604082019050919050565b6000613423602f836138ec565b915061342e826140a9565b604082019050919050565b60006134466021836138ec565b9150613451826140f8565b604082019050919050565b60006134696031836138ec565b915061347482614147565b604082019050919050565b600061348c602c836138ec565b915061349782614196565b604082019050919050565b6134ab81613a87565b82525050565b6134ba81613a87565b82525050565b60006134cc82856131fb565b91506134d882846131fb565b91508190509392505050565b60006020820190506134f9600083018461310d565b92915050565b6000608082019050613514600083018761310d565b613521602083018661310d565b61352e60408301856134b1565b81810360608301526135408184613189565b905095945050505050565b60006020820190508181036000830152613565818461311c565b905092915050565b6000602082019050613582600083018461317a565b92915050565b600060208201905081810360008301526135a281846131c2565b905092915050565b600060208201905081810360008301526135c38161322c565b9050919050565b600060208201905081810360008301526135e38161324f565b9050919050565b6000602082019050818103600083015261360381613272565b9050919050565b6000602082019050818103600083015261362381613295565b9050919050565b60006020820190508181036000830152613643816132b8565b9050919050565b60006020820190508181036000830152613663816132db565b9050919050565b60006020820190508181036000830152613683816132fe565b9050919050565b600060208201905081810360008301526136a381613321565b9050919050565b600060208201905081810360008301526136c381613344565b9050919050565b600060208201905081810360008301526136e381613367565b9050919050565b600060208201905081810360008301526137038161338a565b9050919050565b60006020820190508181036000830152613723816133ad565b9050919050565b60006020820190508181036000830152613743816133d0565b9050919050565b60006020820190508181036000830152613763816133f3565b9050919050565b6000602082019050818103600083015261378381613416565b9050919050565b600060208201905081810360008301526137a381613439565b9050919050565b600060208201905081810360008301526137c38161345c565b9050919050565b600060208201905081810360008301526137e38161347f565b9050919050565b60006020820190506137ff60008301846134b1565b92915050565b600061380f613820565b905061381b8282613b05565b919050565b6000604051905090565b600067ffffffffffffffff82111561384557613844613c9b565b5b61384e82613cde565b9050602081019050919050565b600067ffffffffffffffff82111561387657613875613c9b565b5b61387f82613cde565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061391382613a87565b915061391e83613a87565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561395357613952613bb0565b5b828201905092915050565b600061396982613a87565b915061397483613a87565b92508261398457613983613bdf565b5b828204905092915050565b600061399a82613a87565b91506139a583613a87565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156139de576139dd613bb0565b5b828202905092915050565b60006139f482613a87565b91506139ff83613a87565b925082821015613a1257613a11613bb0565b5b828203905092915050565b6000613a2882613a67565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613abe578082015181840152602081019050613aa3565b83811115613acd576000848401525b50505050565b60006002820490506001821680613aeb57607f821691505b60208210811415613aff57613afe613c0e565b5b50919050565b613b0e82613cde565b810181811067ffffffffffffffff82111715613b2d57613b2c613c9b565b5b80604052505050565b6000613b4182613a87565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613b7457613b73613bb0565b5b600182019050919050565b6000613b8a82613a87565b9150613b9583613a87565b925082613ba557613ba4613bdf565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6141ee81613a1d565b81146141f957600080fd5b50565b61420581613a2f565b811461421057600080fd5b50565b61421c81613a3b565b811461422757600080fd5b50565b61423381613a87565b811461423e57600080fd5b5056fea26469706673582212209652214551c861cb45ef998ec777c9867c1f8d1fcaad2460de7488cff9cbdf3364736f6c63430008070033
Deployed Bytecode
0x6080604052600436106102045760003560e01c80634f6ccce71161011857806395d89b41116100a0578063c87b56dd1161006f578063c87b56dd14610735578063d5abeb0114610772578063d936547e1461079d578063e985e9c5146107da578063f2fde38b1461081757610204565b806395d89b411461069c578063a22cb465146106c7578063ae75b4dc146106f0578063b88d4fde1461070c57610204565b80636c0360eb116100e75780636c0360eb146105c957806370a08231146105f4578063715018a6146106315780637f00c7a6146106485780638da5cb5b1461067157610204565b80634f6ccce7146104fb57806355f804b3146105385780635c975abb146105615780636352211e1461058c57610204565b806323b872dd1161019b57806340c10f191161016a57806340c10f191461042757806342842e0e14610443578063438b63001461046c57806344a0d68a146104a95780634a4c560d146104d257610204565b806323b872dd146103815780632f745c59146103aa57806330cc7ae0146103e75780633ccfd60b1461041057610204565b8063095ea7b3116101d7578063095ea7b3146102d757806313faede61461030057806318160ddd1461032b578063239c70ae1461035657610204565b806301ffc9a71461020957806302329a291461024657806306fdde031461026f578063081812fc1461029a575b600080fd5b34801561021557600080fd5b50610230600480360381019061022b9190613025565b610840565b60405161023d919061356d565b60405180910390f35b34801561025257600080fd5b5061026d60048036038101906102689190612ff8565b6108ba565b005b34801561027b57600080fd5b50610284610953565b6040516102919190613588565b60405180910390f35b3480156102a657600080fd5b506102c160048036038101906102bc91906130c8565b6109e5565b6040516102ce91906134e4565b60405180910390f35b3480156102e357600080fd5b506102fe60048036038101906102f99190612fb8565b610a6a565b005b34801561030c57600080fd5b50610315610b82565b60405161032291906137ea565b60405180910390f35b34801561033757600080fd5b50610340610b88565b60405161034d91906137ea565b60405180910390f35b34801561036257600080fd5b5061036b610b95565b60405161037891906137ea565b60405180910390f35b34801561038d57600080fd5b506103a860048036038101906103a39190612ea2565b610b9b565b005b3480156103b657600080fd5b506103d160048036038101906103cc9190612fb8565b610bfb565b6040516103de91906137ea565b60405180910390f35b3480156103f357600080fd5b5061040e60048036038101906104099190612e35565b610ca0565b005b34801561041c57600080fd5b50610425610d77565b005b610441600480360381019061043c9190612fb8565b610e42565b005b34801561044f57600080fd5b5061046a60048036038101906104659190612ea2565b610f97565b005b34801561047857600080fd5b50610493600480360381019061048e9190612e35565b610fb7565b6040516104a0919061354b565b60405180910390f35b3480156104b557600080fd5b506104d060048036038101906104cb91906130c8565b611065565b005b3480156104de57600080fd5b506104f960048036038101906104f49190612e35565b6110eb565b005b34801561050757600080fd5b50610522600480360381019061051d91906130c8565b6111c2565b60405161052f91906137ea565b60405180910390f35b34801561054457600080fd5b5061055f600480360381019061055a919061307f565b611233565b005b34801561056d57600080fd5b506105766112c9565b604051610583919061356d565b60405180910390f35b34801561059857600080fd5b506105b360048036038101906105ae91906130c8565b6112dc565b6040516105c091906134e4565b60405180910390f35b3480156105d557600080fd5b506105de61138e565b6040516105eb9190613588565b60405180910390f35b34801561060057600080fd5b5061061b60048036038101906106169190612e35565b61141c565b60405161062891906137ea565b60405180910390f35b34801561063d57600080fd5b506106466114d4565b005b34801561065457600080fd5b5061066f600480360381019061066a91906130c8565b61155c565b005b34801561067d57600080fd5b506106866115e2565b60405161069391906134e4565b60405180910390f35b3480156106a857600080fd5b506106b161160c565b6040516106be9190613588565b60405180910390f35b3480156106d357600080fd5b506106ee60048036038101906106e99190612f78565b61169e565b005b61070a60048036038101906107059190612fb8565b61181f565b005b34801561071857600080fd5b50610733600480360381019061072e9190612ef5565b6118b6565b005b34801561074157600080fd5b5061075c600480360381019061075791906130c8565b611918565b6040516107699190613588565b60405180910390f35b34801561077e57600080fd5b506107876119bf565b60405161079491906137ea565b60405180910390f35b3480156107a957600080fd5b506107c460048036038101906107bf9190612e35565b6119c5565b6040516107d1919061356d565b60405180910390f35b3480156107e657600080fd5b5061080160048036038101906107fc9190612e62565b6119e5565b60405161080e919061356d565b60405180910390f35b34801561082357600080fd5b5061083e60048036038101906108399190612e35565b611a79565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108b357506108b282611b71565b5b9050919050565b6108c2611c53565b73ffffffffffffffffffffffffffffffffffffffff166108e06115e2565b73ffffffffffffffffffffffffffffffffffffffff1614610936576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092d9061372a565b60405180910390fd5b80600f60006101000a81548160ff02191690831515021790555050565b60606000805461096290613ad3565b80601f016020809104026020016040519081016040528092919081815260200182805461098e90613ad3565b80156109db5780601f106109b0576101008083540402835291602001916109db565b820191906000526020600020905b8154815290600101906020018083116109be57829003601f168201915b5050505050905090565b60006109f082611c5b565b610a2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a269061370a565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a75826112dc565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ae6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610add9061378a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b05611c53565b73ffffffffffffffffffffffffffffffffffffffff161480610b345750610b3381610b2e611c53565b6119e5565b5b610b73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6a9061368a565b60405180910390fd5b610b7d8383611cc7565b505050565b600c5481565b6000600880549050905090565b600e5481565b610bac610ba6611c53565b82611d80565b610beb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be2906137aa565b60405180910390fd5b610bf6838383611e5e565b505050565b6000610c068361141c565b8210610c47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3e906135aa565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610ca8611c53565b73ffffffffffffffffffffffffffffffffffffffff16610cc66115e2565b73ffffffffffffffffffffffffffffffffffffffff1614610d1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d139061372a565b60405180910390fd5b6000601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b610d7f611c53565b73ffffffffffffffffffffffffffffffffffffffff16610d9d6115e2565b73ffffffffffffffffffffffffffffffffffffffff1614610df3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dea9061372a565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610e3e573d6000803e3d6000fd5b5050565b6000610e4c610b88565b9050600f60009054906101000a900460ff1615610e6857600080fd5b600c54341015610e7757600080fd5b60008211610e8457600080fd5b600e54821115610e9357600080fd5b600d548282610ea29190613908565b1115610ead57600080fd5b610eb56115e2565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610f5b5760011515601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514610f5a5781600c54610f4d919061398f565b341015610f5957600080fd5b5b5b6000600190505b828111610f9157610f7e848284610f799190613908565b6120ba565b8080610f8990613b36565b915050610f62565b50505050565b610fb2838383604051806020016040528060008152506118b6565b505050565b60606000610fc48361141c565b905060008167ffffffffffffffff811115610fe257610fe1613c9b565b5b6040519080825280602002602001820160405280156110105781602001602082028036833780820191505090505b50905060005b8281101561105a576110288582610bfb565b82828151811061103b5761103a613c6c565b5b602002602001018181525050808061105290613b36565b915050611016565b508092505050919050565b61106d611c53565b73ffffffffffffffffffffffffffffffffffffffff1661108b6115e2565b73ffffffffffffffffffffffffffffffffffffffff16146110e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d89061372a565b60405180910390fd5b80600c8190555050565b6110f3611c53565b73ffffffffffffffffffffffffffffffffffffffff166111116115e2565b73ffffffffffffffffffffffffffffffffffffffff1614611167576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115e9061372a565b60405180910390fd5b6001601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60006111cc610b88565b821061120d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611204906137ca565b60405180910390fd5b6008828154811061122157611220613c6c565b5b90600052602060002001549050919050565b61123b611c53565b73ffffffffffffffffffffffffffffffffffffffff166112596115e2565b73ffffffffffffffffffffffffffffffffffffffff16146112af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a69061372a565b60405180910390fd5b80600b90805190602001906112c5929190612c49565b5050565b600f60009054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611385576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137c906136ca565b60405180910390fd5b80915050919050565b600b805461139b90613ad3565b80601f01602080910402602001604051908101604052809291908181526020018280546113c790613ad3565b80156114145780601f106113e957610100808354040283529160200191611414565b820191906000526020600020905b8154815290600101906020018083116113f757829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561148d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611484906136aa565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6114dc611c53565b73ffffffffffffffffffffffffffffffffffffffff166114fa6115e2565b73ffffffffffffffffffffffffffffffffffffffff1614611550576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115479061372a565b60405180910390fd5b61155a60006120d8565b565b611564611c53565b73ffffffffffffffffffffffffffffffffffffffff166115826115e2565b73ffffffffffffffffffffffffffffffffffffffff16146115d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115cf9061372a565b60405180910390fd5b80600e8190555050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461161b90613ad3565b80601f016020809104026020016040519081016040528092919081815260200182805461164790613ad3565b80156116945780601f1061166957610100808354040283529160200191611694565b820191906000526020600020905b81548152906001019060200180831161167757829003601f168201915b5050505050905090565b6116a6611c53565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611714576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170b9061364a565b60405180910390fd5b8060056000611721611c53565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166117ce611c53565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611813919061356d565b60405180910390a35050565b6000611829610b88565b9050600f60009054906101000a900460ff161561184557600080fd5b6000821161185257600080fd5b600182111561186057600080fd5b61012c828261186f9190613908565b111561187a57600080fd5b6000600190505b8281116118b05761189d8482846118989190613908565b6120ba565b80806118a890613b36565b915050611881565b50505050565b6118c76118c1611c53565b83611d80565b611906576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118fd906137aa565b60405180910390fd5b6119128484848461219e565b50505050565b606061192382611c5b565b611962576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119599061376a565b60405180910390fd5b600061196c6121fa565b9050600081511161198c57604051806020016040528060008152506119b7565b806119968461228c565b6040516020016119a79291906134c0565b6040516020818303038152906040525b915050919050565b600d5481565b60106020528060005260406000206000915054906101000a900460ff1681565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611a81611c53565b73ffffffffffffffffffffffffffffffffffffffff16611a9f6115e2565b73ffffffffffffffffffffffffffffffffffffffff1614611af5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aec9061372a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611b65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5c906135ea565b60405180910390fd5b611b6e816120d8565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611c3c57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611c4c5750611c4b826123ed565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611d3a836112dc565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611d8b82611c5b565b611dca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dc19061366a565b60405180910390fd5b6000611dd5836112dc565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611e4457508373ffffffffffffffffffffffffffffffffffffffff16611e2c846109e5565b73ffffffffffffffffffffffffffffffffffffffff16145b80611e555750611e5481856119e5565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611e7e826112dc565b73ffffffffffffffffffffffffffffffffffffffff1614611ed4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ecb9061374a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3b9061362a565b60405180910390fd5b611f4f838383612457565b611f5a600082611cc7565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611faa91906139e9565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120019190613908565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6120d482826040518060200160405280600081525061256b565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6121a9848484611e5e565b6121b5848484846125c6565b6121f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121eb906135ca565b60405180910390fd5b50505050565b6060600b805461220990613ad3565b80601f016020809104026020016040519081016040528092919081815260200182805461223590613ad3565b80156122825780601f1061225757610100808354040283529160200191612282565b820191906000526020600020905b81548152906001019060200180831161226557829003601f168201915b5050505050905090565b606060008214156122d4576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506123e8565b600082905060005b600082146123065780806122ef90613b36565b915050600a826122ff919061395e565b91506122dc565b60008167ffffffffffffffff81111561232257612321613c9b565b5b6040519080825280601f01601f1916602001820160405280156123545781602001600182028036833780820191505090505b5090505b600085146123e15760018261236d91906139e9565b9150600a8561237c9190613b7f565b60306123889190613908565b60f81b81838151811061239e5761239d613c6c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856123da919061395e565b9450612358565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61246283838361275d565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156124a5576124a081612762565b6124e4565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146124e3576124e283826127ab565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156125275761252281612918565b612566565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146125655761256482826129e9565b5b5b505050565b6125758383612a68565b61258260008484846125c6565b6125c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125b8906135ca565b60405180910390fd5b505050565b60006125e78473ffffffffffffffffffffffffffffffffffffffff16612c36565b15612750578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612610611c53565b8786866040518563ffffffff1660e01b815260040161263294939291906134ff565b602060405180830381600087803b15801561264c57600080fd5b505af192505050801561267d57506040513d601f19601f8201168201806040525081019061267a9190613052565b60015b612700573d80600081146126ad576040519150601f19603f3d011682016040523d82523d6000602084013e6126b2565b606091505b506000815114156126f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ef906135ca565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612755565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016127b88461141c565b6127c291906139e9565b90506000600760008481526020019081526020016000205490508181146128a7576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061292c91906139e9565b905060006009600084815260200190815260200160002054905060006008838154811061295c5761295b613c6c565b5b90600052602060002001549050806008838154811061297e5761297d613c6c565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806129cd576129cc613c3d565b5b6001900381819060005260206000200160009055905550505050565b60006129f48361141c565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612ad8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612acf906136ea565b60405180910390fd5b612ae181611c5b565b15612b21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b189061360a565b60405180910390fd5b612b2d60008383612457565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612b7d9190613908565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b828054612c5590613ad3565b90600052602060002090601f016020900481019282612c775760008555612cbe565b82601f10612c9057805160ff1916838001178555612cbe565b82800160010185558215612cbe579182015b82811115612cbd578251825591602001919060010190612ca2565b5b509050612ccb9190612ccf565b5090565b5b80821115612ce8576000816000905550600101612cd0565b5090565b6000612cff612cfa8461382a565b613805565b905082815260208101848484011115612d1b57612d1a613ccf565b5b612d26848285613a91565b509392505050565b6000612d41612d3c8461385b565b613805565b905082815260208101848484011115612d5d57612d5c613ccf565b5b612d68848285613a91565b509392505050565b600081359050612d7f816141e5565b92915050565b600081359050612d94816141fc565b92915050565b600081359050612da981614213565b92915050565b600081519050612dbe81614213565b92915050565b600082601f830112612dd957612dd8613cca565b5b8135612de9848260208601612cec565b91505092915050565b600082601f830112612e0757612e06613cca565b5b8135612e17848260208601612d2e565b91505092915050565b600081359050612e2f8161422a565b92915050565b600060208284031215612e4b57612e4a613cd9565b5b6000612e5984828501612d70565b91505092915050565b60008060408385031215612e7957612e78613cd9565b5b6000612e8785828601612d70565b9250506020612e9885828601612d70565b9150509250929050565b600080600060608486031215612ebb57612eba613cd9565b5b6000612ec986828701612d70565b9350506020612eda86828701612d70565b9250506040612eeb86828701612e20565b9150509250925092565b60008060008060808587031215612f0f57612f0e613cd9565b5b6000612f1d87828801612d70565b9450506020612f2e87828801612d70565b9350506040612f3f87828801612e20565b925050606085013567ffffffffffffffff811115612f6057612f5f613cd4565b5b612f6c87828801612dc4565b91505092959194509250565b60008060408385031215612f8f57612f8e613cd9565b5b6000612f9d85828601612d70565b9250506020612fae85828601612d85565b9150509250929050565b60008060408385031215612fcf57612fce613cd9565b5b6000612fdd85828601612d70565b9250506020612fee85828601612e20565b9150509250929050565b60006020828403121561300e5761300d613cd9565b5b600061301c84828501612d85565b91505092915050565b60006020828403121561303b5761303a613cd9565b5b600061304984828501612d9a565b91505092915050565b60006020828403121561306857613067613cd9565b5b600061307684828501612daf565b91505092915050565b60006020828403121561309557613094613cd9565b5b600082013567ffffffffffffffff8111156130b3576130b2613cd4565b5b6130bf84828501612df2565b91505092915050565b6000602082840312156130de576130dd613cd9565b5b60006130ec84828501612e20565b91505092915050565b600061310183836134a2565b60208301905092915050565b61311681613a1d565b82525050565b60006131278261389c565b61313181856138ca565b935061313c8361388c565b8060005b8381101561316d57815161315488826130f5565b975061315f836138bd565b925050600181019050613140565b5085935050505092915050565b61318381613a2f565b82525050565b6000613194826138a7565b61319e81856138db565b93506131ae818560208601613aa0565b6131b781613cde565b840191505092915050565b60006131cd826138b2565b6131d781856138ec565b93506131e7818560208601613aa0565b6131f081613cde565b840191505092915050565b6000613206826138b2565b61321081856138fd565b9350613220818560208601613aa0565b80840191505092915050565b6000613239602b836138ec565b915061324482613cef565b604082019050919050565b600061325c6032836138ec565b915061326782613d3e565b604082019050919050565b600061327f6026836138ec565b915061328a82613d8d565b604082019050919050565b60006132a2601c836138ec565b91506132ad82613ddc565b602082019050919050565b60006132c56024836138ec565b91506132d082613e05565b604082019050919050565b60006132e86019836138ec565b91506132f382613e54565b602082019050919050565b600061330b602c836138ec565b915061331682613e7d565b604082019050919050565b600061332e6038836138ec565b915061333982613ecc565b604082019050919050565b6000613351602a836138ec565b915061335c82613f1b565b604082019050919050565b60006133746029836138ec565b915061337f82613f6a565b604082019050919050565b60006133976020836138ec565b91506133a282613fb9565b602082019050919050565b60006133ba602c836138ec565b91506133c582613fe2565b604082019050919050565b60006133dd6020836138ec565b91506133e882614031565b602082019050919050565b60006134006029836138ec565b915061340b8261405a565b604082019050919050565b6000613423602f836138ec565b915061342e826140a9565b604082019050919050565b60006134466021836138ec565b9150613451826140f8565b604082019050919050565b60006134696031836138ec565b915061347482614147565b604082019050919050565b600061348c602c836138ec565b915061349782614196565b604082019050919050565b6134ab81613a87565b82525050565b6134ba81613a87565b82525050565b60006134cc82856131fb565b91506134d882846131fb565b91508190509392505050565b60006020820190506134f9600083018461310d565b92915050565b6000608082019050613514600083018761310d565b613521602083018661310d565b61352e60408301856134b1565b81810360608301526135408184613189565b905095945050505050565b60006020820190508181036000830152613565818461311c565b905092915050565b6000602082019050613582600083018461317a565b92915050565b600060208201905081810360008301526135a281846131c2565b905092915050565b600060208201905081810360008301526135c38161322c565b9050919050565b600060208201905081810360008301526135e38161324f565b9050919050565b6000602082019050818103600083015261360381613272565b9050919050565b6000602082019050818103600083015261362381613295565b9050919050565b60006020820190508181036000830152613643816132b8565b9050919050565b60006020820190508181036000830152613663816132db565b9050919050565b60006020820190508181036000830152613683816132fe565b9050919050565b600060208201905081810360008301526136a381613321565b9050919050565b600060208201905081810360008301526136c381613344565b9050919050565b600060208201905081810360008301526136e381613367565b9050919050565b600060208201905081810360008301526137038161338a565b9050919050565b60006020820190508181036000830152613723816133ad565b9050919050565b60006020820190508181036000830152613743816133d0565b9050919050565b60006020820190508181036000830152613763816133f3565b9050919050565b6000602082019050818103600083015261378381613416565b9050919050565b600060208201905081810360008301526137a381613439565b9050919050565b600060208201905081810360008301526137c38161345c565b9050919050565b600060208201905081810360008301526137e38161347f565b9050919050565b60006020820190506137ff60008301846134b1565b92915050565b600061380f613820565b905061381b8282613b05565b919050565b6000604051905090565b600067ffffffffffffffff82111561384557613844613c9b565b5b61384e82613cde565b9050602081019050919050565b600067ffffffffffffffff82111561387657613875613c9b565b5b61387f82613cde565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061391382613a87565b915061391e83613a87565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561395357613952613bb0565b5b828201905092915050565b600061396982613a87565b915061397483613a87565b92508261398457613983613bdf565b5b828204905092915050565b600061399a82613a87565b91506139a583613a87565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156139de576139dd613bb0565b5b828202905092915050565b60006139f482613a87565b91506139ff83613a87565b925082821015613a1257613a11613bb0565b5b828203905092915050565b6000613a2882613a67565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613abe578082015181840152602081019050613aa3565b83811115613acd576000848401525b50505050565b60006002820490506001821680613aeb57607f821691505b60208210811415613aff57613afe613c0e565b5b50919050565b613b0e82613cde565b810181811067ffffffffffffffff82111715613b2d57613b2c613c9b565b5b80604052505050565b6000613b4182613a87565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613b7457613b73613bb0565b5b600182019050919050565b6000613b8a82613a87565b9150613b9583613a87565b925082613ba557613ba4613bdf565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6141ee81613a1d565b81146141f957600080fd5b50565b61420581613a2f565b811461421057600080fd5b50565b61421c81613a3b565b811461422757600080fd5b50565b61423381613a87565b811461423e57600080fd5b5056fea26469706673582212209652214551c861cb45ef998ec777c9867c1f8d1fcaad2460de7488cff9cbdf3364736f6c63430008070033
Deployed Bytecode Sourcemap
43893:2941:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35448:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46410:73;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23340:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24899:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24422:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44009:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36088:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44101:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25789:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35756:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46589:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46695:133;;;;;;;;;;;;;:::i;:::-;;44417:534;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26199:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45314:348;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46098:80;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46489:93;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36278:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46306:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44139:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23034:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43983:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22764:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43237:94;;;;;;;;;;;;;:::i;:::-;;46184:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42586:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23509:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25192:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44968:338;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26455:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45668:408;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44065:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44170:43;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25558:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43486:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35448:224;35550:4;35589:35;35574:50;;;:11;:50;;;;:90;;;;35628:36;35652:11;35628:23;:36::i;:::-;35574:90;35567:97;;35448:224;;;:::o;46410:73::-;42817:12;:10;:12::i;:::-;42806:23;;:7;:5;:7::i;:::-;:23;;;42798:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46471:6:::1;46462;;:15;;;;;;;;;;;;;;;;;;46410:73:::0;:::o;23340:100::-;23394:13;23427:5;23420:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23340:100;:::o;24899:221::-;24975:7;25003:16;25011:7;25003;:16::i;:::-;24995:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;25088:15;:24;25104:7;25088:24;;;;;;;;;;;;;;;;;;;;;25081:31;;24899:221;;;:::o;24422:411::-;24503:13;24519:23;24534:7;24519:14;:23::i;:::-;24503:39;;24567:5;24561:11;;:2;:11;;;;24553:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;24661:5;24645:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;24670:37;24687:5;24694:12;:10;:12::i;:::-;24670:16;:37::i;:::-;24645:62;24623:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;24804:21;24813:2;24817:7;24804:8;:21::i;:::-;24492:341;24422:411;;:::o;44009:39::-;;;;:::o;36088:113::-;36149:7;36176:10;:17;;;;36169:24;;36088:113;:::o;44101:33::-;;;;:::o;25789:339::-;25984:41;26003:12;:10;:12::i;:::-;26017:7;25984:18;:41::i;:::-;25976:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;26092:28;26102:4;26108:2;26112:7;26092:9;:28::i;:::-;25789:339;;;:::o;35756:256::-;35853:7;35889:23;35906:5;35889:16;:23::i;:::-;35881:5;:31;35873:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;35978:12;:19;35991:5;35978:19;;;;;;;;;;;;;;;:26;35998:5;35978:26;;;;;;;;;;;;35971:33;;35756:256;;;;:::o;46589:100::-;42817:12;:10;:12::i;:::-;42806:23;;:7;:5;:7::i;:::-;:23;;;42798:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46678:5:::1;46657:11;:18;46669:5;46657:18;;;;;;;;;;;;;;;;:26;;;;;;;;;;;;;;;;;;46589:100:::0;:::o;46695:133::-;42817:12;:10;:12::i;:::-;42806:23;;:7;:5;:7::i;:::-;:23;;;42798:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46739:15:::1;46757:21;46739:39;;46793:10;46785:28;;:37;46814:7;46785:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;46732:96;46695:133::o:0;44417:534::-;44487:14;44504:13;:11;:13::i;:::-;44487:30;;44533:6;;;;;;;;;;;44532:7;44524:16;;;;;;44568:4;;44555:9;:17;;44547:26;;;;;;44602:1;44588:11;:15;44580:24;;;;;;44634:13;;44619:11;:28;;44611:37;;;;;;44687:9;;44672:11;44663:6;:20;;;;:::i;:::-;:33;;44655:42;;;;;;44724:7;:5;:7::i;:::-;44710:21;;:10;:21;;;44706:146;;44774:4;44747:31;;:11;:23;44759:10;44747:23;;;;;;;;;;;;;;;;;;;;;;;;;:31;;;44744:101;;44821:11;44814:4;;:18;;;;:::i;:::-;44801:9;:31;;44793:40;;;;;;44744:101;44706:146;44865:9;44877:1;44865:13;;44860:86;44885:11;44880:1;:16;44860:86;;44912:26;44922:3;44936:1;44927:6;:10;;;;:::i;:::-;44912:9;:26::i;:::-;44898:3;;;;;:::i;:::-;;;;44860:86;;;;44480:471;44417:534;;:::o;26199:185::-;26337:39;26354:4;26360:2;26364:7;26337:39;;;;;;;;;;;;:16;:39::i;:::-;26199:185;;;:::o;45314:348::-;45389:16;45417:23;45443:17;45453:6;45443:9;:17::i;:::-;45417:43;;45467:25;45509:15;45495:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45467:58;;45537:9;45532:103;45552:15;45548:1;:19;45532:103;;;45597:30;45617:6;45625:1;45597:19;:30::i;:::-;45583:8;45592:1;45583:11;;;;;;;;:::i;:::-;;;;;;;:44;;;;;45569:3;;;;;:::i;:::-;;;;45532:103;;;;45648:8;45641:15;;;;45314:348;;;:::o;46098:80::-;42817:12;:10;:12::i;:::-;42806:23;;:7;:5;:7::i;:::-;:23;;;42798:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46164:8:::1;46157:4;:15;;;;46098:80:::0;:::o;46489:93::-;42817:12;:10;:12::i;:::-;42806:23;;:7;:5;:7::i;:::-;:23;;;42798:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46572:4:::1;46551:11;:18;46563:5;46551:18;;;;;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;46489:93:::0;:::o;36278:233::-;36353:7;36389:30;:28;:30::i;:::-;36381:5;:38;36373:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;36486:10;36497:5;36486:17;;;;;;;;:::i;:::-;;;;;;;;;;36479:24;;36278:233;;;:::o;46306:98::-;42817:12;:10;:12::i;:::-;42806:23;;:7;:5;:7::i;:::-;:23;;;42798:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46387:11:::1;46377:7;:21;;;;;;;;;;;;:::i;:::-;;46306:98:::0;:::o;44139:26::-;;;;;;;;;;;;;:::o;23034:239::-;23106:7;23126:13;23142:7;:16;23150:7;23142:16;;;;;;;;;;;;;;;;;;;;;23126:32;;23194:1;23177:19;;:5;:19;;;;23169:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23260:5;23253:12;;;23034:239;;;:::o;43983:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;22764:208::-;22836:7;22881:1;22864:19;;:5;:19;;;;22856:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;22948:9;:16;22958:5;22948:16;;;;;;;;;;;;;;;;22941:23;;22764:208;;;:::o;43237:94::-;42817:12;:10;:12::i;:::-;42806:23;;:7;:5;:7::i;:::-;:23;;;42798:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43302:21:::1;43320:1;43302:9;:21::i;:::-;43237:94::o:0;46184:116::-;42817:12;:10;:12::i;:::-;42806:23;;:7;:5;:7::i;:::-;:23;;;42798:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46277:17:::1;46261:13;:33;;;;46184:116:::0;:::o;42586:87::-;42632:7;42659:6;;;;;;;;;;;42652:13;;42586:87;:::o;23509:104::-;23565:13;23598:7;23591:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23509:104;:::o;25192:295::-;25307:12;:10;:12::i;:::-;25295:24;;:8;:24;;;;25287:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;25407:8;25362:18;:32;25381:12;:10;:12::i;:::-;25362:32;;;;;;;;;;;;;;;:42;25395:8;25362:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;25460:8;25431:48;;25446:12;:10;:12::i;:::-;25431:48;;;25470:8;25431:48;;;;;;:::i;:::-;;;;;;;;25192:295;;:::o;44968:338::-;45043:14;45060:13;:11;:13::i;:::-;45043:30;;45089:6;;;;;;;;;;;45088:7;45080:16;;;;;;45126:1;45111:12;:16;45103:25;;;;;;45159:1;45143:12;:17;;45135:26;;;;;;45201:3;45185:12;45176:6;:21;;;;:::i;:::-;:28;;45168:37;;;;;;45219:9;45231:1;45219:13;;45214:87;45239:12;45234:1;:17;45214:87;;45267:26;45277:3;45291:1;45282:6;:10;;;;:::i;:::-;45267:9;:26::i;:::-;45253:3;;;;;:::i;:::-;;;;45214:87;;;;45036:270;44968:338;;:::o;26455:328::-;26630:41;26649:12;:10;:12::i;:::-;26663:7;26630:18;:41::i;:::-;26622:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;26736:39;26750:4;26756:2;26760:7;26769:5;26736:13;:39::i;:::-;26455:328;;;;:::o;45668:408::-;45766:13;45807:16;45815:7;45807;:16::i;:::-;45791:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;45897:28;45928:10;:8;:10::i;:::-;45897:41;;45983:1;45958:14;45952:28;:32;:118;;;;;;;;;;;;;;;;;46020:14;46036:18;:7;:16;:18::i;:::-;46003:52;;;;;;;;;:::i;:::-;;;;;;;;;;;;;45952:118;45945:125;;;45668:408;;;:::o;44065:31::-;;;;:::o;44170:43::-;;;;;;;;;;;;;;;;;;;;;;:::o;25558:164::-;25655:4;25679:18;:25;25698:5;25679:25;;;;;;;;;;;;;;;:35;25705:8;25679:35;;;;;;;;;;;;;;;;;;;;;;;;;25672:42;;25558:164;;;;:::o;43486:192::-;42817:12;:10;:12::i;:::-;42806:23;;:7;:5;:7::i;:::-;:23;;;42798:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43595:1:::1;43575:22;;:8;:22;;;;43567:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;43651:19;43661:8;43651:9;:19::i;:::-;43486:192:::0;:::o;22395:305::-;22497:4;22549:25;22534:40;;;:11;:40;;;;:105;;;;22606:33;22591:48;;;:11;:48;;;;22534:105;:158;;;;22656:36;22680:11;22656:23;:36::i;:::-;22534:158;22514:178;;22395:305;;;:::o;20869:98::-;20922:7;20949:10;20942:17;;20869:98;:::o;28293:127::-;28358:4;28410:1;28382:30;;:7;:16;28390:7;28382:16;;;;;;;;;;;;;;;;;;;;;:30;;;;28375:37;;28293:127;;;:::o;32275:174::-;32377:2;32350:15;:24;32366:7;32350:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;32433:7;32429:2;32395:46;;32404:23;32419:7;32404:14;:23::i;:::-;32395:46;;;;;;;;;;;;32275:174;;:::o;28587:348::-;28680:4;28705:16;28713:7;28705;:16::i;:::-;28697:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;28781:13;28797:23;28812:7;28797:14;:23::i;:::-;28781:39;;28850:5;28839:16;;:7;:16;;;:51;;;;28883:7;28859:31;;:20;28871:7;28859:11;:20::i;:::-;:31;;;28839:51;:87;;;;28894:32;28911:5;28918:7;28894:16;:32::i;:::-;28839:87;28831:96;;;28587:348;;;;:::o;31579:578::-;31738:4;31711:31;;:23;31726:7;31711:14;:23::i;:::-;:31;;;31703:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;31821:1;31807:16;;:2;:16;;;;31799:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;31877:39;31898:4;31904:2;31908:7;31877:20;:39::i;:::-;31981:29;31998:1;32002:7;31981:8;:29::i;:::-;32042:1;32023:9;:15;32033:4;32023:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;32071:1;32054:9;:13;32064:2;32054:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;32102:2;32083:7;:16;32091:7;32083:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;32141:7;32137:2;32122:27;;32131:4;32122:27;;;;;;;;;;;;31579:578;;;:::o;29277:110::-;29353:26;29363:2;29367:7;29353:26;;;;;;;;;;;;:9;:26::i;:::-;29277:110;;:::o;43686:173::-;43742:16;43761:6;;;;;;;;;;;43742:25;;43787:8;43778:6;;:17;;;;;;;;;;;;;;;;;;43842:8;43811:40;;43832:8;43811:40;;;;;;;;;;;;43731:128;43686:173;:::o;27665:315::-;27822:28;27832:4;27838:2;27842:7;27822:9;:28::i;:::-;27869:48;27892:4;27898:2;27902:7;27911:5;27869:22;:48::i;:::-;27861:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;27665:315;;;;:::o;44296:102::-;44356:13;44385:7;44378:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44296:102;:::o;8701:723::-;8757:13;8987:1;8978:5;:10;8974:53;;;9005:10;;;;;;;;;;;;;;;;;;;;;8974:53;9037:12;9052:5;9037:20;;9068:14;9093:78;9108:1;9100:4;:9;9093:78;;9126:8;;;;;:::i;:::-;;;;9157:2;9149:10;;;;;:::i;:::-;;;9093:78;;;9181:19;9213:6;9203:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9181:39;;9231:154;9247:1;9238:5;:10;9231:154;;9275:1;9265:11;;;;;:::i;:::-;;;9342:2;9334:5;:10;;;;:::i;:::-;9321:2;:24;;;;:::i;:::-;9308:39;;9291:6;9298;9291:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;9371:2;9362:11;;;;;:::i;:::-;;;9231:154;;;9409:6;9395:21;;;;;8701:723;;;;:::o;8226:157::-;8311:4;8350:25;8335:40;;;:11;:40;;;;8328:47;;8226:157;;;:::o;37124:589::-;37268:45;37295:4;37301:2;37305:7;37268:26;:45::i;:::-;37346:1;37330:18;;:4;:18;;;37326:187;;;37365:40;37397:7;37365:31;:40::i;:::-;37326:187;;;37435:2;37427:10;;:4;:10;;;37423:90;;37454:47;37487:4;37493:7;37454:32;:47::i;:::-;37423:90;37326:187;37541:1;37527:16;;:2;:16;;;37523:183;;;37560:45;37597:7;37560:36;:45::i;:::-;37523:183;;;37633:4;37627:10;;:2;:10;;;37623:83;;37654:40;37682:2;37686:7;37654:27;:40::i;:::-;37623:83;37523:183;37124:589;;;:::o;29614:321::-;29744:18;29750:2;29754:7;29744:5;:18::i;:::-;29795:54;29826:1;29830:2;29834:7;29843:5;29795:22;:54::i;:::-;29773:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;29614:321;;;:::o;33014:799::-;33169:4;33190:15;:2;:13;;;:15::i;:::-;33186:620;;;33242:2;33226:36;;;33263:12;:10;:12::i;:::-;33277:4;33283:7;33292:5;33226:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;33222:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33485:1;33468:6;:13;:18;33464:272;;;33511:60;;;;;;;;;;:::i;:::-;;;;;;;;33464:272;33686:6;33680:13;33671:6;33667:2;33663:15;33656:38;33222:529;33359:41;;;33349:51;;;:6;:51;;;;33342:58;;;;;33186:620;33790:4;33783:11;;33014:799;;;;;;;:::o;34385:126::-;;;;:::o;38436:164::-;38540:10;:17;;;;38513:15;:24;38529:7;38513:24;;;;;;;;;;;:44;;;;38568:10;38584:7;38568:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38436:164;:::o;39227:988::-;39493:22;39543:1;39518:22;39535:4;39518:16;:22::i;:::-;:26;;;;:::i;:::-;39493:51;;39555:18;39576:17;:26;39594:7;39576:26;;;;;;;;;;;;39555:47;;39723:14;39709:10;:28;39705:328;;39754:19;39776:12;:18;39789:4;39776:18;;;;;;;;;;;;;;;:34;39795:14;39776:34;;;;;;;;;;;;39754:56;;39860:11;39827:12;:18;39840:4;39827:18;;;;;;;;;;;;;;;:30;39846:10;39827:30;;;;;;;;;;;:44;;;;39977:10;39944:17;:30;39962:11;39944:30;;;;;;;;;;;:43;;;;39739:294;39705:328;40129:17;:26;40147:7;40129:26;;;;;;;;;;;40122:33;;;40173:12;:18;40186:4;40173:18;;;;;;;;;;;;;;;:34;40192:14;40173:34;;;;;;;;;;;40166:41;;;39308:907;;39227:988;;:::o;40510:1079::-;40763:22;40808:1;40788:10;:17;;;;:21;;;;:::i;:::-;40763:46;;40820:18;40841:15;:24;40857:7;40841:24;;;;;;;;;;;;40820:45;;41192:19;41214:10;41225:14;41214:26;;;;;;;;:::i;:::-;;;;;;;;;;41192:48;;41278:11;41253:10;41264;41253:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;41389:10;41358:15;:28;41374:11;41358:28;;;;;;;;;;;:41;;;;41530:15;:24;41546:7;41530:24;;;;;;;;;;;41523:31;;;41565:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;40581:1008;;;40510:1079;:::o;38014:221::-;38099:14;38116:20;38133:2;38116:16;:20::i;:::-;38099:37;;38174:7;38147:12;:16;38160:2;38147:16;;;;;;;;;;;;;;;:24;38164:6;38147:24;;;;;;;;;;;:34;;;;38221:6;38192:17;:26;38210:7;38192:26;;;;;;;;;;;:35;;;;38088:147;38014:221;;:::o;30271:382::-;30365:1;30351:16;;:2;:16;;;;30343:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;30424:16;30432:7;30424;:16::i;:::-;30423:17;30415:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;30486:45;30515:1;30519:2;30523:7;30486:20;:45::i;:::-;30561:1;30544:9;:13;30554:2;30544:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;30592:2;30573:7;:16;30581:7;30573:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;30637:7;30633:2;30612:33;;30629:1;30612:33;;;;;;;;;;;;30271:382;;:::o;11226:387::-;11286:4;11494:12;11561:7;11549:20;11541:28;;11604:1;11597:4;:8;11590:15;;;11226:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:122;;1899:79;;:::i;:::-;1858:122;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;1786:340;;;;:::o;2132:139::-;2178:5;2216:6;2203:20;2194:29;;2232:33;2259:5;2232:33;:::i;:::-;2132:139;;;;:::o;2277:329::-;2336:6;2385:2;2373:9;2364:7;2360:23;2356:32;2353:119;;;2391:79;;:::i;:::-;2353:119;2511:1;2536:53;2581:7;2572:6;2561:9;2557:22;2536:53;:::i;:::-;2526:63;;2482:117;2277:329;;;;:::o;2612:474::-;2680:6;2688;2737:2;2725:9;2716:7;2712:23;2708:32;2705:119;;;2743:79;;:::i;:::-;2705:119;2863:1;2888:53;2933:7;2924:6;2913:9;2909:22;2888:53;:::i;:::-;2878:63;;2834:117;2990:2;3016:53;3061:7;3052:6;3041:9;3037:22;3016:53;:::i;:::-;3006:63;;2961:118;2612:474;;;;;:::o;3092:619::-;3169:6;3177;3185;3234:2;3222:9;3213:7;3209:23;3205:32;3202:119;;;3240:79;;:::i;:::-;3202:119;3360:1;3385:53;3430:7;3421:6;3410:9;3406:22;3385:53;:::i;:::-;3375:63;;3331:117;3487:2;3513:53;3558:7;3549:6;3538:9;3534:22;3513:53;:::i;:::-;3503:63;;3458:118;3615:2;3641:53;3686:7;3677:6;3666:9;3662:22;3641:53;:::i;:::-;3631:63;;3586:118;3092:619;;;;;:::o;3717:943::-;3812:6;3820;3828;3836;3885:3;3873:9;3864:7;3860:23;3856:33;3853:120;;;3892:79;;:::i;:::-;3853:120;4012:1;4037:53;4082:7;4073:6;4062:9;4058:22;4037:53;:::i;:::-;4027:63;;3983:117;4139:2;4165:53;4210:7;4201:6;4190:9;4186:22;4165:53;:::i;:::-;4155:63;;4110:118;4267:2;4293:53;4338:7;4329:6;4318:9;4314:22;4293:53;:::i;:::-;4283:63;;4238:118;4423:2;4412:9;4408:18;4395:32;4454:18;4446:6;4443:30;4440:117;;;4476:79;;:::i;:::-;4440:117;4581:62;4635:7;4626:6;4615:9;4611:22;4581:62;:::i;:::-;4571:72;;4366:287;3717:943;;;;;;;:::o;4666:468::-;4731:6;4739;4788:2;4776:9;4767:7;4763:23;4759:32;4756:119;;;4794:79;;:::i;:::-;4756:119;4914:1;4939:53;4984:7;4975:6;4964:9;4960:22;4939:53;:::i;:::-;4929:63;;4885:117;5041:2;5067:50;5109:7;5100:6;5089:9;5085:22;5067:50;:::i;:::-;5057:60;;5012:115;4666:468;;;;;:::o;5140:474::-;5208:6;5216;5265:2;5253:9;5244:7;5240:23;5236:32;5233:119;;;5271:79;;:::i;:::-;5233:119;5391:1;5416:53;5461:7;5452:6;5441:9;5437:22;5416:53;:::i;:::-;5406:63;;5362:117;5518:2;5544:53;5589:7;5580:6;5569:9;5565:22;5544:53;:::i;:::-;5534:63;;5489:118;5140:474;;;;;:::o;5620:323::-;5676:6;5725:2;5713:9;5704:7;5700:23;5696:32;5693:119;;;5731:79;;:::i;:::-;5693:119;5851:1;5876:50;5918:7;5909:6;5898:9;5894:22;5876:50;:::i;:::-;5866:60;;5822:114;5620:323;;;;:::o;5949:327::-;6007:6;6056:2;6044:9;6035:7;6031:23;6027:32;6024:119;;;6062:79;;:::i;:::-;6024:119;6182:1;6207:52;6251:7;6242:6;6231:9;6227:22;6207:52;:::i;:::-;6197:62;;6153:116;5949:327;;;;:::o;6282:349::-;6351:6;6400:2;6388:9;6379:7;6375:23;6371:32;6368:119;;;6406:79;;:::i;:::-;6368:119;6526:1;6551:63;6606:7;6597:6;6586:9;6582:22;6551:63;:::i;:::-;6541:73;;6497:127;6282:349;;;;:::o;6637:509::-;6706:6;6755:2;6743:9;6734:7;6730:23;6726:32;6723:119;;;6761:79;;:::i;:::-;6723:119;6909:1;6898:9;6894:17;6881:31;6939:18;6931:6;6928:30;6925:117;;;6961:79;;:::i;:::-;6925:117;7066:63;7121:7;7112:6;7101:9;7097:22;7066:63;:::i;:::-;7056:73;;6852:287;6637:509;;;;:::o;7152:329::-;7211:6;7260:2;7248:9;7239:7;7235:23;7231:32;7228:119;;;7266:79;;:::i;:::-;7228:119;7386:1;7411:53;7456:7;7447:6;7436:9;7432:22;7411:53;:::i;:::-;7401:63;;7357:117;7152:329;;;;:::o;7487:179::-;7556:10;7577:46;7619:3;7611:6;7577:46;:::i;:::-;7655:4;7650:3;7646:14;7632:28;;7487:179;;;;:::o;7672:118::-;7759:24;7777:5;7759:24;:::i;:::-;7754:3;7747:37;7672:118;;:::o;7826:732::-;7945:3;7974:54;8022:5;7974:54;:::i;:::-;8044:86;8123:6;8118:3;8044:86;:::i;:::-;8037:93;;8154:56;8204:5;8154:56;:::i;:::-;8233:7;8264:1;8249:284;8274:6;8271:1;8268:13;8249:284;;;8350:6;8344:13;8377:63;8436:3;8421:13;8377:63;:::i;:::-;8370:70;;8463:60;8516:6;8463:60;:::i;:::-;8453:70;;8309:224;8296:1;8293;8289:9;8284:14;;8249:284;;;8253:14;8549:3;8542:10;;7950:608;;;7826:732;;;;:::o;8564:109::-;8645:21;8660:5;8645:21;:::i;:::-;8640:3;8633:34;8564:109;;:::o;8679:360::-;8765:3;8793:38;8825:5;8793:38;:::i;:::-;8847:70;8910:6;8905:3;8847:70;:::i;:::-;8840:77;;8926:52;8971:6;8966:3;8959:4;8952:5;8948:16;8926:52;:::i;:::-;9003:29;9025:6;9003:29;:::i;:::-;8998:3;8994:39;8987:46;;8769:270;8679:360;;;;:::o;9045:364::-;9133:3;9161:39;9194:5;9161:39;:::i;:::-;9216:71;9280:6;9275:3;9216:71;:::i;:::-;9209:78;;9296:52;9341:6;9336:3;9329:4;9322:5;9318:16;9296:52;:::i;:::-;9373:29;9395:6;9373:29;:::i;:::-;9368:3;9364:39;9357:46;;9137:272;9045:364;;;;:::o;9415:377::-;9521:3;9549:39;9582:5;9549:39;:::i;:::-;9604:89;9686:6;9681:3;9604:89;:::i;:::-;9597:96;;9702:52;9747:6;9742:3;9735:4;9728:5;9724:16;9702:52;:::i;:::-;9779:6;9774:3;9770:16;9763:23;;9525:267;9415:377;;;;:::o;9798:366::-;9940:3;9961:67;10025:2;10020:3;9961:67;:::i;:::-;9954:74;;10037:93;10126:3;10037:93;:::i;:::-;10155:2;10150:3;10146:12;10139:19;;9798:366;;;:::o;10170:::-;10312:3;10333:67;10397:2;10392:3;10333:67;:::i;:::-;10326:74;;10409:93;10498:3;10409:93;:::i;:::-;10527:2;10522:3;10518:12;10511:19;;10170:366;;;:::o;10542:::-;10684:3;10705:67;10769:2;10764:3;10705:67;:::i;:::-;10698:74;;10781:93;10870:3;10781:93;:::i;:::-;10899:2;10894:3;10890:12;10883:19;;10542:366;;;:::o;10914:::-;11056:3;11077:67;11141:2;11136:3;11077:67;:::i;:::-;11070:74;;11153:93;11242:3;11153:93;:::i;:::-;11271:2;11266:3;11262:12;11255:19;;10914:366;;;:::o;11286:::-;11428:3;11449:67;11513:2;11508:3;11449:67;:::i;:::-;11442:74;;11525:93;11614:3;11525:93;:::i;:::-;11643:2;11638:3;11634:12;11627:19;;11286:366;;;:::o;11658:::-;11800:3;11821:67;11885:2;11880:3;11821:67;:::i;:::-;11814:74;;11897:93;11986:3;11897:93;:::i;:::-;12015:2;12010:3;12006:12;11999:19;;11658:366;;;:::o;12030:::-;12172:3;12193:67;12257:2;12252:3;12193:67;:::i;:::-;12186:74;;12269:93;12358:3;12269:93;:::i;:::-;12387:2;12382:3;12378:12;12371:19;;12030:366;;;:::o;12402:::-;12544:3;12565:67;12629:2;12624:3;12565:67;:::i;:::-;12558:74;;12641:93;12730:3;12641:93;:::i;:::-;12759:2;12754:3;12750:12;12743:19;;12402:366;;;:::o;12774:::-;12916:3;12937:67;13001:2;12996:3;12937:67;:::i;:::-;12930:74;;13013:93;13102:3;13013:93;:::i;:::-;13131:2;13126:3;13122:12;13115:19;;12774:366;;;:::o;13146:::-;13288:3;13309:67;13373:2;13368:3;13309:67;:::i;:::-;13302:74;;13385:93;13474:3;13385:93;:::i;:::-;13503:2;13498:3;13494:12;13487:19;;13146:366;;;:::o;13518:::-;13660:3;13681:67;13745:2;13740:3;13681:67;:::i;:::-;13674:74;;13757:93;13846:3;13757:93;:::i;:::-;13875:2;13870:3;13866:12;13859:19;;13518:366;;;:::o;13890:::-;14032:3;14053:67;14117:2;14112:3;14053:67;:::i;:::-;14046:74;;14129:93;14218:3;14129:93;:::i;:::-;14247:2;14242:3;14238:12;14231:19;;13890:366;;;:::o;14262:::-;14404:3;14425:67;14489:2;14484:3;14425:67;:::i;:::-;14418:74;;14501:93;14590:3;14501:93;:::i;:::-;14619:2;14614:3;14610:12;14603:19;;14262:366;;;:::o;14634:::-;14776:3;14797:67;14861:2;14856:3;14797:67;:::i;:::-;14790:74;;14873:93;14962:3;14873:93;:::i;:::-;14991:2;14986:3;14982:12;14975:19;;14634:366;;;:::o;15006:::-;15148:3;15169:67;15233:2;15228:3;15169:67;:::i;:::-;15162:74;;15245:93;15334:3;15245:93;:::i;:::-;15363:2;15358:3;15354:12;15347:19;;15006:366;;;:::o;15378:::-;15520:3;15541:67;15605:2;15600:3;15541:67;:::i;:::-;15534:74;;15617:93;15706:3;15617:93;:::i;:::-;15735:2;15730:3;15726:12;15719:19;;15378:366;;;:::o;15750:::-;15892:3;15913:67;15977:2;15972:3;15913:67;:::i;:::-;15906:74;;15989:93;16078:3;15989:93;:::i;:::-;16107:2;16102:3;16098:12;16091:19;;15750:366;;;:::o;16122:::-;16264:3;16285:67;16349:2;16344:3;16285:67;:::i;:::-;16278:74;;16361:93;16450:3;16361:93;:::i;:::-;16479:2;16474:3;16470:12;16463:19;;16122:366;;;:::o;16494:108::-;16571:24;16589:5;16571:24;:::i;:::-;16566:3;16559:37;16494:108;;:::o;16608:118::-;16695:24;16713:5;16695:24;:::i;:::-;16690:3;16683:37;16608:118;;:::o;16732:435::-;16912:3;16934:95;17025:3;17016:6;16934:95;:::i;:::-;16927:102;;17046:95;17137:3;17128:6;17046:95;:::i;:::-;17039:102;;17158:3;17151:10;;16732:435;;;;;:::o;17173:222::-;17266:4;17304:2;17293:9;17289:18;17281:26;;17317:71;17385:1;17374:9;17370:17;17361:6;17317:71;:::i;:::-;17173:222;;;;:::o;17401:640::-;17596:4;17634:3;17623:9;17619:19;17611:27;;17648:71;17716:1;17705:9;17701:17;17692:6;17648:71;:::i;:::-;17729:72;17797:2;17786:9;17782:18;17773:6;17729:72;:::i;:::-;17811;17879:2;17868:9;17864:18;17855:6;17811:72;:::i;:::-;17930:9;17924:4;17920:20;17915:2;17904:9;17900:18;17893:48;17958:76;18029:4;18020:6;17958:76;:::i;:::-;17950:84;;17401:640;;;;;;;:::o;18047:373::-;18190:4;18228:2;18217:9;18213:18;18205:26;;18277:9;18271:4;18267:20;18263:1;18252:9;18248:17;18241:47;18305:108;18408:4;18399:6;18305:108;:::i;:::-;18297:116;;18047:373;;;;:::o;18426:210::-;18513:4;18551:2;18540:9;18536:18;18528:26;;18564:65;18626:1;18615:9;18611:17;18602:6;18564:65;:::i;:::-;18426:210;;;;:::o;18642:313::-;18755:4;18793:2;18782:9;18778:18;18770:26;;18842:9;18836:4;18832:20;18828:1;18817:9;18813:17;18806:47;18870:78;18943:4;18934:6;18870:78;:::i;:::-;18862:86;;18642:313;;;;:::o;18961:419::-;19127:4;19165:2;19154:9;19150:18;19142:26;;19214:9;19208:4;19204:20;19200:1;19189:9;19185:17;19178:47;19242:131;19368:4;19242:131;:::i;:::-;19234:139;;18961:419;;;:::o;19386:::-;19552:4;19590:2;19579:9;19575:18;19567:26;;19639:9;19633:4;19629:20;19625:1;19614:9;19610:17;19603:47;19667:131;19793:4;19667:131;:::i;:::-;19659:139;;19386:419;;;:::o;19811:::-;19977:4;20015:2;20004:9;20000:18;19992:26;;20064:9;20058:4;20054:20;20050:1;20039:9;20035:17;20028:47;20092:131;20218:4;20092:131;:::i;:::-;20084:139;;19811:419;;;:::o;20236:::-;20402:4;20440:2;20429:9;20425:18;20417:26;;20489:9;20483:4;20479:20;20475:1;20464:9;20460:17;20453:47;20517:131;20643:4;20517:131;:::i;:::-;20509:139;;20236:419;;;:::o;20661:::-;20827:4;20865:2;20854:9;20850:18;20842:26;;20914:9;20908:4;20904:20;20900:1;20889:9;20885:17;20878:47;20942:131;21068:4;20942:131;:::i;:::-;20934:139;;20661:419;;;:::o;21086:::-;21252:4;21290:2;21279:9;21275:18;21267:26;;21339:9;21333:4;21329:20;21325:1;21314:9;21310:17;21303:47;21367:131;21493:4;21367:131;:::i;:::-;21359:139;;21086:419;;;:::o;21511:::-;21677:4;21715:2;21704:9;21700:18;21692:26;;21764:9;21758:4;21754:20;21750:1;21739:9;21735:17;21728:47;21792:131;21918:4;21792:131;:::i;:::-;21784:139;;21511:419;;;:::o;21936:::-;22102:4;22140:2;22129:9;22125:18;22117:26;;22189:9;22183:4;22179:20;22175:1;22164:9;22160:17;22153:47;22217:131;22343:4;22217:131;:::i;:::-;22209:139;;21936:419;;;:::o;22361:::-;22527:4;22565:2;22554:9;22550:18;22542:26;;22614:9;22608:4;22604:20;22600:1;22589:9;22585:17;22578:47;22642:131;22768:4;22642:131;:::i;:::-;22634:139;;22361:419;;;:::o;22786:::-;22952:4;22990:2;22979:9;22975:18;22967:26;;23039:9;23033:4;23029:20;23025:1;23014:9;23010:17;23003:47;23067:131;23193:4;23067:131;:::i;:::-;23059:139;;22786:419;;;:::o;23211:::-;23377:4;23415:2;23404:9;23400:18;23392:26;;23464:9;23458:4;23454:20;23450:1;23439:9;23435:17;23428:47;23492:131;23618:4;23492:131;:::i;:::-;23484:139;;23211:419;;;:::o;23636:::-;23802:4;23840:2;23829:9;23825:18;23817:26;;23889:9;23883:4;23879:20;23875:1;23864:9;23860:17;23853:47;23917:131;24043:4;23917:131;:::i;:::-;23909:139;;23636:419;;;:::o;24061:::-;24227:4;24265:2;24254:9;24250:18;24242:26;;24314:9;24308:4;24304:20;24300:1;24289:9;24285:17;24278:47;24342:131;24468:4;24342:131;:::i;:::-;24334:139;;24061:419;;;:::o;24486:::-;24652:4;24690:2;24679:9;24675:18;24667:26;;24739:9;24733:4;24729:20;24725:1;24714:9;24710:17;24703:47;24767:131;24893:4;24767:131;:::i;:::-;24759:139;;24486:419;;;:::o;24911:::-;25077:4;25115:2;25104:9;25100:18;25092:26;;25164:9;25158:4;25154:20;25150:1;25139:9;25135:17;25128:47;25192:131;25318:4;25192:131;:::i;:::-;25184:139;;24911:419;;;:::o;25336:::-;25502:4;25540:2;25529:9;25525:18;25517:26;;25589:9;25583:4;25579:20;25575:1;25564:9;25560:17;25553:47;25617:131;25743:4;25617:131;:::i;:::-;25609:139;;25336:419;;;:::o;25761:::-;25927:4;25965:2;25954:9;25950:18;25942:26;;26014:9;26008:4;26004:20;26000:1;25989:9;25985:17;25978:47;26042:131;26168:4;26042:131;:::i;:::-;26034:139;;25761:419;;;:::o;26186:::-;26352:4;26390:2;26379:9;26375:18;26367:26;;26439:9;26433:4;26429:20;26425:1;26414:9;26410:17;26403:47;26467:131;26593:4;26467:131;:::i;:::-;26459:139;;26186:419;;;:::o;26611:222::-;26704:4;26742:2;26731:9;26727:18;26719:26;;26755:71;26823:1;26812:9;26808:17;26799:6;26755:71;:::i;:::-;26611:222;;;;:::o;26839:129::-;26873:6;26900:20;;:::i;:::-;26890:30;;26929:33;26957:4;26949:6;26929:33;:::i;:::-;26839:129;;;:::o;26974:75::-;27007:6;27040:2;27034:9;27024:19;;26974:75;:::o;27055:307::-;27116:4;27206:18;27198:6;27195:30;27192:56;;;27228:18;;:::i;:::-;27192:56;27266:29;27288:6;27266:29;:::i;:::-;27258:37;;27350:4;27344;27340:15;27332:23;;27055:307;;;:::o;27368:308::-;27430:4;27520:18;27512:6;27509:30;27506:56;;;27542:18;;:::i;:::-;27506:56;27580:29;27602:6;27580:29;:::i;:::-;27572:37;;27664:4;27658;27654:15;27646:23;;27368:308;;;:::o;27682:132::-;27749:4;27772:3;27764:11;;27802:4;27797:3;27793:14;27785:22;;27682:132;;;:::o;27820:114::-;27887:6;27921:5;27915:12;27905:22;;27820:114;;;:::o;27940:98::-;27991:6;28025:5;28019:12;28009:22;;27940:98;;;:::o;28044:99::-;28096:6;28130:5;28124:12;28114:22;;28044:99;;;:::o;28149:113::-;28219:4;28251;28246:3;28242:14;28234:22;;28149:113;;;:::o;28268:184::-;28367:11;28401:6;28396:3;28389:19;28441:4;28436:3;28432:14;28417:29;;28268:184;;;;:::o;28458:168::-;28541:11;28575:6;28570:3;28563:19;28615:4;28610:3;28606:14;28591:29;;28458:168;;;;:::o;28632:169::-;28716:11;28750:6;28745:3;28738:19;28790:4;28785:3;28781:14;28766:29;;28632:169;;;;:::o;28807:148::-;28909:11;28946:3;28931:18;;28807:148;;;;:::o;28961:305::-;29001:3;29020:20;29038:1;29020:20;:::i;:::-;29015:25;;29054:20;29072:1;29054:20;:::i;:::-;29049:25;;29208:1;29140:66;29136:74;29133:1;29130:81;29127:107;;;29214:18;;:::i;:::-;29127:107;29258:1;29255;29251:9;29244:16;;28961:305;;;;:::o;29272:185::-;29312:1;29329:20;29347:1;29329:20;:::i;:::-;29324:25;;29363:20;29381:1;29363:20;:::i;:::-;29358:25;;29402:1;29392:35;;29407:18;;:::i;:::-;29392:35;29449:1;29446;29442:9;29437:14;;29272:185;;;;:::o;29463:348::-;29503:7;29526:20;29544:1;29526:20;:::i;:::-;29521:25;;29560:20;29578:1;29560:20;:::i;:::-;29555:25;;29748:1;29680:66;29676:74;29673:1;29670:81;29665:1;29658:9;29651:17;29647:105;29644:131;;;29755:18;;:::i;:::-;29644:131;29803:1;29800;29796:9;29785:20;;29463:348;;;;:::o;29817:191::-;29857:4;29877:20;29895:1;29877:20;:::i;:::-;29872:25;;29911:20;29929:1;29911:20;:::i;:::-;29906:25;;29950:1;29947;29944:8;29941:34;;;29955:18;;:::i;:::-;29941:34;30000:1;29997;29993:9;29985:17;;29817:191;;;;:::o;30014:96::-;30051:7;30080:24;30098:5;30080:24;:::i;:::-;30069:35;;30014:96;;;:::o;30116:90::-;30150:7;30193:5;30186:13;30179:21;30168:32;;30116:90;;;:::o;30212:149::-;30248:7;30288:66;30281:5;30277:78;30266:89;;30212:149;;;:::o;30367:126::-;30404:7;30444:42;30437:5;30433:54;30422:65;;30367:126;;;:::o;30499:77::-;30536:7;30565:5;30554:16;;30499:77;;;:::o;30582:154::-;30666:6;30661:3;30656;30643:30;30728:1;30719:6;30714:3;30710:16;30703:27;30582:154;;;:::o;30742:307::-;30810:1;30820:113;30834:6;30831:1;30828:13;30820:113;;;30919:1;30914:3;30910:11;30904:18;30900:1;30895:3;30891:11;30884:39;30856:2;30853:1;30849:10;30844:15;;30820:113;;;30951:6;30948:1;30945:13;30942:101;;;31031:1;31022:6;31017:3;31013:16;31006:27;30942:101;30791:258;30742:307;;;:::o;31055:320::-;31099:6;31136:1;31130:4;31126:12;31116:22;;31183:1;31177:4;31173:12;31204:18;31194:81;;31260:4;31252:6;31248:17;31238:27;;31194:81;31322:2;31314:6;31311:14;31291:18;31288:38;31285:84;;;31341:18;;:::i;:::-;31285:84;31106:269;31055:320;;;:::o;31381:281::-;31464:27;31486:4;31464:27;:::i;:::-;31456:6;31452:40;31594:6;31582:10;31579:22;31558:18;31546:10;31543:34;31540:62;31537:88;;;31605:18;;:::i;:::-;31537:88;31645:10;31641:2;31634:22;31424:238;31381:281;;:::o;31668:233::-;31707:3;31730:24;31748:5;31730:24;:::i;:::-;31721:33;;31776:66;31769:5;31766:77;31763:103;;;31846:18;;:::i;:::-;31763:103;31893:1;31886:5;31882:13;31875:20;;31668:233;;;:::o;31907:176::-;31939:1;31956:20;31974:1;31956:20;:::i;:::-;31951:25;;31990:20;32008:1;31990:20;:::i;:::-;31985:25;;32029:1;32019:35;;32034:18;;:::i;:::-;32019:35;32075:1;32072;32068:9;32063:14;;31907:176;;;;:::o;32089:180::-;32137:77;32134:1;32127:88;32234:4;32231:1;32224:15;32258:4;32255:1;32248:15;32275:180;32323:77;32320:1;32313:88;32420:4;32417:1;32410:15;32444:4;32441:1;32434:15;32461:180;32509:77;32506:1;32499:88;32606:4;32603:1;32596:15;32630:4;32627:1;32620:15;32647:180;32695:77;32692:1;32685:88;32792:4;32789:1;32782:15;32816:4;32813:1;32806:15;32833:180;32881:77;32878:1;32871:88;32978:4;32975:1;32968:15;33002:4;32999:1;32992:15;33019:180;33067:77;33064:1;33057:88;33164:4;33161:1;33154:15;33188:4;33185:1;33178:15;33205:117;33314:1;33311;33304:12;33328:117;33437:1;33434;33427:12;33451:117;33560:1;33557;33550:12;33574:117;33683:1;33680;33673:12;33697:102;33738:6;33789:2;33785:7;33780:2;33773:5;33769:14;33765:28;33755:38;;33697:102;;;:::o;33805:230::-;33945:34;33941:1;33933:6;33929:14;33922:58;34014:13;34009:2;34001:6;33997:15;33990:38;33805:230;:::o;34041:237::-;34181:34;34177:1;34169:6;34165:14;34158:58;34250:20;34245:2;34237:6;34233:15;34226:45;34041:237;:::o;34284:225::-;34424:34;34420:1;34412:6;34408:14;34401:58;34493:8;34488:2;34480:6;34476:15;34469:33;34284:225;:::o;34515:178::-;34655:30;34651:1;34643:6;34639:14;34632:54;34515:178;:::o;34699:223::-;34839:34;34835:1;34827:6;34823:14;34816:58;34908:6;34903:2;34895:6;34891:15;34884:31;34699:223;:::o;34928:175::-;35068:27;35064:1;35056:6;35052:14;35045:51;34928:175;:::o;35109:231::-;35249:34;35245:1;35237:6;35233:14;35226:58;35318:14;35313:2;35305:6;35301:15;35294:39;35109:231;:::o;35346:243::-;35486:34;35482:1;35474:6;35470:14;35463:58;35555:26;35550:2;35542:6;35538:15;35531:51;35346:243;:::o;35595:229::-;35735:34;35731:1;35723:6;35719:14;35712:58;35804:12;35799:2;35791:6;35787:15;35780:37;35595:229;:::o;35830:228::-;35970:34;35966:1;35958:6;35954:14;35947:58;36039:11;36034:2;36026:6;36022:15;36015:36;35830:228;:::o;36064:182::-;36204:34;36200:1;36192:6;36188:14;36181:58;36064:182;:::o;36252:231::-;36392:34;36388:1;36380:6;36376:14;36369:58;36461:14;36456:2;36448:6;36444:15;36437:39;36252:231;:::o;36489:182::-;36629:34;36625:1;36617:6;36613:14;36606:58;36489:182;:::o;36677:228::-;36817:34;36813:1;36805:6;36801:14;36794:58;36886:11;36881:2;36873:6;36869:15;36862:36;36677:228;:::o;36911:234::-;37051:34;37047:1;37039:6;37035:14;37028:58;37120:17;37115:2;37107:6;37103:15;37096:42;36911:234;:::o;37151:220::-;37291:34;37287:1;37279:6;37275:14;37268:58;37360:3;37355:2;37347:6;37343:15;37336:28;37151:220;:::o;37377:236::-;37517:34;37513:1;37505:6;37501:14;37494:58;37586:19;37581:2;37573:6;37569:15;37562:44;37377:236;:::o;37619:231::-;37759:34;37755:1;37747:6;37743:14;37736:58;37828:14;37823:2;37815:6;37811:15;37804:39;37619:231;:::o;37856:122::-;37929:24;37947:5;37929:24;:::i;:::-;37922:5;37919:35;37909:63;;37968:1;37965;37958:12;37909:63;37856:122;:::o;37984:116::-;38054:21;38069:5;38054:21;:::i;:::-;38047:5;38044:32;38034:60;;38090:1;38087;38080:12;38034:60;37984:116;:::o;38106:120::-;38178:23;38195:5;38178:23;:::i;:::-;38171:5;38168:34;38158:62;;38216:1;38213;38206:12;38158:62;38106:120;:::o;38232:122::-;38305:24;38323:5;38305:24;:::i;:::-;38298:5;38295:35;38285:63;;38344:1;38341;38334:12;38285:63;38232:122;:::o
Swarm Source
ipfs://9652214551c861cb45ef998ec777c9867c1f8d1fcaad2460de7488cff9cbdf33
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.