Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
100 BFRENS
Holders
35
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
7 BFRENSLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
BESSFRENS
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-03-30 */ // File: @openzeppelin/[email protected]/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/[email protected]/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/[email protected]/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/[email protected]/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/[email protected]/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/[email protected]/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/[email protected]/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/[email protected]/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/[email protected]/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/[email protected]/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/[email protected]/token/ERC721/extensions/ERC721URIStorage.sol pragma solidity ^0.8.0; /** * @dev ERC721 token with storage based token URI management. */ abstract contract ERC721URIStorage is ERC721 { using Strings for uint256; // Optional mapping for token URIs mapping(uint256 => string) private _tokenURIs; /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721URIStorage: URI query for nonexistent token"); string memory _tokenURI = _tokenURIs[tokenId]; string memory base = _baseURI(); // If there is no base URI, return the token URI. if (bytes(base).length == 0) { return _tokenURI; } // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked). if (bytes(_tokenURI).length > 0) { return string(abi.encodePacked(base, _tokenURI)); } return super.tokenURI(tokenId); } /** * @dev Sets `_tokenURI` as the tokenURI of `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual { require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token"); _tokenURIs[tokenId] = _tokenURI; } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual override { super._burn(tokenId); if (bytes(_tokenURIs[tokenId]).length != 0) { delete _tokenURIs[tokenId]; } } } // File: @openzeppelin/[email protected]/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/[email protected]/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); } } // File: @openzeppelin/[email protected]/token/ERC20/IERC20.sol pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File: @openzeppelin/[email protected]/token/ERC20/extensions/IERC20Metadata.sol pragma solidity ^0.8.0; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } // File: @openzeppelin/[email protected]/token/ERC20/ERC20.sol pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * Requirements: * * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom( address sender, address recipient, uint256 amount ) public virtual override returns (bool) { _transfer(sender, recipient, amount); uint256 currentAllowance = _allowances[sender][_msgSender()]; require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance"); unchecked { _approve(sender, _msgSender(), currentAllowance - amount); } return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { uint256 currentAllowance = _allowances[_msgSender()][spender]; require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(_msgSender(), spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `sender` to `recipient`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer( address sender, address recipient, uint256 amount ) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); uint256 senderBalance = _balances[sender]; require(senderBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[sender] = senderBalance - amount; } _balances[recipient] += amount; emit Transfer(sender, recipient, amount); _afterTokenTransfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; } _totalSupply -= amount; emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens 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 amount ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been 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 _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} } // File: contracts/4_BESSFRENS.sol /*** * _______ ________ ______ ______ ________ _______ ________ __ __ ______ * / \ / | / \ / \ / |/ \ / |/ \ / | / \ * $$$$$$$ |$$$$$$$$/ /$$$$$$ |/$$$$$$ |$$$$$$$$/ $$$$$$$ |$$$$$$$$/ $$ \ $$ |/$$$$$$ | * $$ |__$$ |$$ |__ $$ \__$$/ $$ \__$$/ $$ |__ $$ |__$$ |$$ |__ $$$ \$$ |$$ \__$$/ * $$ $$< $$ | $$ \ $$ \ $$ | $$ $$< $$ | $$$$ $$ |$$ \ * $$$$$$$ |$$$$$/ $$$$$$ | $$$$$$ |$$$$$/ $$$$$$$ |$$$$$/ $$ $$ $$ | $$$$$$ | * $$ |__$$ |$$ |_____ / \__$$ |/ \__$$ |$$ | $$ | $$ |$$ |_____ $$ |$$$$ |/ \__$$ | * $$ $$/ $$ |$$ $$/ $$ $$/ $$ | $$ | $$ |$$ |$$ | $$$ |$$ $$/ * $$$$$$$/ $$$$$$$$/ $$$$$$/ $$$$$$/ $$/ $$/ $$/ $$$$$$$$/ $$/ $$/ $$$$$$/ * * by drknss and paulmandl.eth * */ pragma solidity ^0.8.0; contract BESSFRENS is ERC721, ERC721Enumerable, ERC721URIStorage, Ownable { string public PROVENANCE; bool public saleIsActive = false; string private _baseURIextended; bool public isAllowListActive = false; uint256 public constant MAX_SUPPLY = 100; uint256 public constant MAX_PUBLIC_MINT = 50; uint256 public constant PRICE_PER_TOKEN = 0.06 ether; uint256 public constant PRICE_PER_TOKEN_WL = 0.04 ether; mapping(address => uint8) private _allowList; constructor() ERC721("BESSFRENS", "BFRENS") { } function _burn(uint256 tokenId) internal override(ERC721, ERC721URIStorage) { super._burn(tokenId); } function tokenURI(uint256 tokenId) public view override(ERC721, ERC721URIStorage) returns (string memory) { return super.tokenURI(tokenId); } function setIsAllowListActive(bool _isAllowListActive) external onlyOwner { isAllowListActive = _isAllowListActive; } function setAllowList(address[] calldata addresses, uint8 numAllowedToMint) external onlyOwner { for (uint256 i = 0; i < addresses.length; i++) { _allowList[addresses[i]] = numAllowedToMint; } } function append(string memory a, string memory b, string memory c) internal pure returns (string memory) { return string(bytes.concat(bytes(a), bytes(b), bytes(c))); } function setTokenUri(uint tokenId, string memory uri) external onlyOwner { _setTokenURI(tokenId, uri); } function uint2str(uint _i) internal pure returns (string memory _uintAsString) { if (_i == 0) { return "0"; } uint j = _i; uint len; while (j != 0) { len++; j /= 10; } bytes memory bstr = new bytes(len); uint k = len; while (_i != 0) { k = k-1; uint8 temp = (48 + uint8(_i - _i / 10 * 10)); bytes1 b1 = bytes1(temp); bstr[k] = b1; _i /= 10; } return string(bstr); } function constructTokenURI(uint256 tokenId) internal pure returns (string memory) { return append("https://bessfrens.mypinata.cloud/ipfs/QmTBhdiXDgdmQdZyxHAEYefvqRwJiW828iP1bYzNuKL1pN/BESSFREN", uint2str(tokenId), ".json"); } function numAvailableToMint(address addr) external view returns (uint8) { return _allowList[addr]; } function mintAllowList(uint8 numberOfTokens) external payable { uint256 ts = totalSupply(); require(isAllowListActive, "Allow list is not active"); require(numberOfTokens <= _allowList[msg.sender], "Exceeded max available to purchase"); require(ts + numberOfTokens <= MAX_SUPPLY, "Purchase would exceed max tokens"); require(PRICE_PER_TOKEN_WL * numberOfTokens <= msg.value, "Ether value sent is not correct"); _allowList[msg.sender] -= numberOfTokens; for (uint256 i = 0; i < numberOfTokens; i++) { uint256 nextTokenId = ts + i; _safeMint(msg.sender, nextTokenId); _setTokenURI(nextTokenId, constructTokenURI(nextTokenId)); } } function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal override(ERC721, ERC721Enumerable) { super._beforeTokenTransfer(from, to, tokenId); } function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721, ERC721Enumerable) returns (bool) { return super.supportsInterface(interfaceId); } function setBaseURI(string memory baseURI_) external onlyOwner() { _baseURIextended = baseURI_; } function _baseURI() internal view virtual override returns (string memory) { return _baseURIextended; } function setProvenance(string memory provenance) public onlyOwner { PROVENANCE = provenance; } function reserve(uint256 n) public onlyOwner { uint supply = totalSupply(); uint i; for (i = 0; i < n; i++) { uint256 nextTokenId = supply + i; _safeMint(msg.sender, nextTokenId); _setTokenURI(nextTokenId, constructTokenURI(nextTokenId)); } } function setSaleState(bool newState) public onlyOwner { saleIsActive = newState; } function mint(uint numberOfTokens) public payable { uint256 ts = totalSupply(); require(saleIsActive, "Sale must be active to mint tokens"); require(numberOfTokens <= MAX_PUBLIC_MINT, "Exceeded max token purchase"); require(ts + numberOfTokens <= MAX_SUPPLY, "Purchase would exceed max tokens"); require(PRICE_PER_TOKEN * numberOfTokens <= msg.value, "Ether value sent is not correct"); for (uint256 i = 0; i < numberOfTokens; i++) { uint256 nextTokenId = ts + i; _safeMint(msg.sender, nextTokenId); _setTokenURI(nextTokenId, constructTokenURI(nextTokenId)); } } function withdraw() public onlyOwner { uint 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":[],"name":"MAX_PUBLIC_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE_PER_TOKEN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE_PER_TOKEN_WL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PROVENANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isAllowListActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint8","name":"numberOfTokens","type":"uint8"}],"name":"mintAllowList","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"numAvailableToMint","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"n","type":"uint256"}],"name":"reserve","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":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"uint8","name":"numAllowedToMint","type":"uint8"}],"name":"setAllowList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isAllowListActive","type":"bool"}],"name":"setIsAllowListActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"provenance","type":"string"}],"name":"setProvenance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"newState","type":"bool"}],"name":"setSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"uri","type":"string"}],"name":"setTokenUri","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":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526000600d60006101000a81548160ff0219169083151502179055506000600f60006101000a81548160ff0219169083151502179055503480156200004757600080fd5b506040518060400160405280600981526020017f424553534652454e5300000000000000000000000000000000000000000000008152506040518060400160405280600681526020017f424652454e5300000000000000000000000000000000000000000000000000008152508160009080519060200190620000cc929190620001dc565b508060019080519060200190620000e5929190620001dc565b50505062000108620000fc6200010e60201b60201c565b6200011660201b60201c565b620002f1565b600033905090565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620001ea906200028c565b90600052602060002090601f0160209004810192826200020e57600085556200025a565b82601f106200022957805160ff19168380011785556200025a565b828001600101855582156200025a579182015b82811115620002595782518255916020019190600101906200023c565b5b5090506200026991906200026d565b5090565b5b80821115620002885760008160009055506001016200026e565b5090565b60006002820490506001821680620002a557607f821691505b60208210811415620002bc57620002bb620002c2565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b614f8c80620003016000396000f3fe60806040526004361061021a5760003560e01c8063715018a611610123578063b88d4fde116100ab578063e985e9c51161006f578063e985e9c5146107b3578063eacddd2e146107f0578063eb8d24441461081b578063f2fde38b14610846578063ffe630b51461086f5761021a565b8063b88d4fde146106cb578063c04a2836146106f4578063c4e3709514610731578063c87b56dd1461075a578063ddff5b1c146107975761021a565b8063833b9499116100f2578063833b9499146106055780638da5cb5b1461063057806395d89b411461065b578063a0712d6814610686578063a22cb465146106a25761021a565b8063715018a614610573578063718bc4af1461058a578063819b25ba146105b35780638295784d146105dc5761021a565b80633ccfd60b116101a657806357f7789e1161017557806357f7789e1461047a5780636352211e146104a35780636373a6b1146104e057806365f130971461050b57806370a08231146105365761021a565b80633ccfd60b146103d457806342842e0e146103eb5780634f6ccce71461041457806355f804b3146104515761021a565b806318160ddd116101ed57806318160ddd146102ed57806323b872dd1461031857806329fc6bae146103415780632f745c591461036c57806332cb6b0c146103a95761021a565b806301ffc9a71461021f57806306fdde031461025c578063081812fc14610287578063095ea7b3146102c4575b600080fd5b34801561022b57600080fd5b506102466004803603810190610241919061380c565b610898565b6040516102539190613ebf565b60405180910390f35b34801561026857600080fd5b506102716108aa565b60405161027e9190613eda565b60405180910390f35b34801561029357600080fd5b506102ae60048036038101906102a991906138af565b61093c565b6040516102bb9190613e58565b60405180910390f35b3480156102d057600080fd5b506102eb60048036038101906102e6919061373f565b6109c1565b005b3480156102f957600080fd5b50610302610ad9565b60405161030f919061423c565b60405180910390f35b34801561032457600080fd5b5061033f600480360381019061033a9190613629565b610ae6565b005b34801561034d57600080fd5b50610356610b46565b6040516103639190613ebf565b60405180910390f35b34801561037857600080fd5b50610393600480360381019061038e919061373f565b610b59565b6040516103a0919061423c565b60405180910390f35b3480156103b557600080fd5b506103be610bfe565b6040516103cb919061423c565b60405180910390f35b3480156103e057600080fd5b506103e9610c03565b005b3480156103f757600080fd5b50610412600480360381019061040d9190613629565b610cce565b005b34801561042057600080fd5b5061043b600480360381019061043691906138af565b610cee565b604051610448919061423c565b60405180910390f35b34801561045d57600080fd5b5061047860048036038101906104739190613866565b610d5f565b005b34801561048657600080fd5b506104a1600480360381019061049c91906138dc565b610df5565b005b3480156104af57600080fd5b506104ca60048036038101906104c591906138af565b610e7f565b6040516104d79190613e58565b60405180910390f35b3480156104ec57600080fd5b506104f5610f31565b6040516105029190613eda565b60405180910390f35b34801561051757600080fd5b50610520610fbf565b60405161052d919061423c565b60405180910390f35b34801561054257600080fd5b5061055d600480360381019061055891906135bc565b610fc4565b60405161056a919061423c565b60405180910390f35b34801561057f57600080fd5b5061058861107c565b005b34801561059657600080fd5b506105b160048036038101906105ac91906137df565b611104565b005b3480156105bf57600080fd5b506105da60048036038101906105d591906138af565b61119d565b005b3480156105e857600080fd5b5061060360048036038101906105fe919061377f565b611275565b005b34801561061157600080fd5b5061061a611397565b604051610627919061423c565b60405180910390f35b34801561063c57600080fd5b506106456113a2565b6040516106529190613e58565b60405180910390f35b34801561066757600080fd5b506106706113cc565b60405161067d9190613eda565b60405180910390f35b6106a0600480360381019061069b91906138af565b61145e565b005b3480156106ae57600080fd5b506106c960048036038101906106c491906136ff565b6115f1565b005b3480156106d757600080fd5b506106f260048036038101906106ed919061367c565b611772565b005b34801561070057600080fd5b5061071b600480360381019061071691906135bc565b6117d4565b6040516107289190614257565b60405180910390f35b34801561073d57600080fd5b50610758600480360381019061075391906137df565b61182a565b005b34801561076657600080fd5b50610781600480360381019061077c91906138af565b6118c3565b60405161078e9190613eda565b60405180910390f35b6107b160048036038101906107ac9190613938565b6118d5565b005b3480156107bf57600080fd5b506107da60048036038101906107d591906135e9565b611b35565b6040516107e79190613ebf565b60405180910390f35b3480156107fc57600080fd5b50610805611bc9565b604051610812919061423c565b60405180910390f35b34801561082757600080fd5b50610830611bd4565b60405161083d9190613ebf565b60405180910390f35b34801561085257600080fd5b5061086d600480360381019061086891906135bc565b611be7565b005b34801561087b57600080fd5b5061089660048036038101906108919190613866565b611cdf565b005b60006108a382611d75565b9050919050565b6060600080546108b99061458a565b80601f01602080910402602001604051908101604052809291908181526020018280546108e59061458a565b80156109325780601f1061090757610100808354040283529160200191610932565b820191906000526020600020905b81548152906001019060200180831161091557829003601f168201915b5050505050905090565b600061094782611def565b610986576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097d906140dc565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109cc82610e7f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a349061417c565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a5c611e5b565b73ffffffffffffffffffffffffffffffffffffffff161480610a8b5750610a8a81610a85611e5b565b611b35565b5b610aca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac19061401c565b60405180910390fd5b610ad48383611e63565b505050565b6000600880549050905090565b610af7610af1611e5b565b82611f1c565b610b36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2d906141dc565b60405180910390fd5b610b41838383611ffa565b505050565b600f60009054906101000a900460ff1681565b6000610b6483610fc4565b8210610ba5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9c90613efc565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b606481565b610c0b611e5b565b73ffffffffffffffffffffffffffffffffffffffff16610c296113a2565b73ffffffffffffffffffffffffffffffffffffffff1614610c7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c76906140fc565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610cca573d6000803e3d6000fd5b5050565b610ce983838360405180602001604052806000815250611772565b505050565b6000610cf8610ad9565b8210610d39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d30906141fc565b60405180910390fd5b60088281548110610d4d57610d4c614723565b5b90600052602060002001549050919050565b610d67611e5b565b73ffffffffffffffffffffffffffffffffffffffff16610d856113a2565b73ffffffffffffffffffffffffffffffffffffffff1614610ddb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd2906140fc565b60405180910390fd5b80600e9080519060200190610df1929190613365565b5050565b610dfd611e5b565b73ffffffffffffffffffffffffffffffffffffffff16610e1b6113a2565b73ffffffffffffffffffffffffffffffffffffffff1614610e71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e68906140fc565b60405180910390fd5b610e7b8282612256565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610f28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1f9061405c565b60405180910390fd5b80915050919050565b600c8054610f3e9061458a565b80601f0160208091040260200160405190810160405280929190818152602001828054610f6a9061458a565b8015610fb75780601f10610f8c57610100808354040283529160200191610fb7565b820191906000526020600020905b815481529060010190602001808311610f9a57829003601f168201915b505050505081565b603281565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611035576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102c9061403c565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611084611e5b565b73ffffffffffffffffffffffffffffffffffffffff166110a26113a2565b73ffffffffffffffffffffffffffffffffffffffff16146110f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ef906140fc565b60405180910390fd5b61110260006122ca565b565b61110c611e5b565b73ffffffffffffffffffffffffffffffffffffffff1661112a6113a2565b73ffffffffffffffffffffffffffffffffffffffff1614611180576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611177906140fc565b60405180910390fd5b80600f60006101000a81548160ff02191690831515021790555050565b6111a5611e5b565b73ffffffffffffffffffffffffffffffffffffffff166111c36113a2565b73ffffffffffffffffffffffffffffffffffffffff1614611219576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611210906140fc565b60405180910390fd5b6000611223610ad9565b905060005b82811015611270576000818361123e9190614347565b905061124a3382612390565b61125c81611257836123ae565b612256565b508080611268906145ed565b915050611228565b505050565b61127d611e5b565b73ffffffffffffffffffffffffffffffffffffffff1661129b6113a2565b73ffffffffffffffffffffffffffffffffffffffff16146112f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e8906140fc565b60405180910390fd5b60005b8383905081101561139157816010600086868581811061131757611316614723565b5b905060200201602081019061132c91906135bc565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff1602179055508080611389906145ed565b9150506112f4565b50505050565b66d529ae9e86000081565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546113db9061458a565b80601f01602080910402602001604051908101604052809291908181526020018280546114079061458a565b80156114545780601f1061142957610100808354040283529160200191611454565b820191906000526020600020905b81548152906001019060200180831161143757829003601f168201915b5050505050905090565b6000611468610ad9565b9050600d60009054906101000a900460ff166114b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b09061415c565b60405180910390fd5b60328211156114fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f49061419c565b60405180910390fd5b6064828261150b9190614347565b111561154c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154390613f5c565b60405180910390fd5b348266d529ae9e8600006115609190614405565b11156115a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159890613fdc565b60405180910390fd5b60005b828110156115ec57600081836115ba9190614347565b90506115c63382612390565b6115d8816115d3836123ae565b612256565b5080806115e4906145ed565b9150506115a4565b505050565b6115f9611e5b565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611667576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165e90613fbc565b60405180910390fd5b8060056000611674611e5b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611721611e5b565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516117669190613ebf565b60405180910390a35050565b61178361177d611e5b565b83611f1c565b6117c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b9906141dc565b60405180910390fd5b6117ce84848484612417565b50505050565b6000601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b611832611e5b565b73ffffffffffffffffffffffffffffffffffffffff166118506113a2565b73ffffffffffffffffffffffffffffffffffffffff16146118a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189d906140fc565b60405180910390fd5b80600d60006101000a81548160ff02191690831515021790555050565b60606118ce82612473565b9050919050565b60006118df610ad9565b9050600f60009054906101000a900460ff16611930576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119279061421c565b60405180910390fd5b601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff168260ff1611156119c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119bc906141bc565b60405180910390fd5b60648260ff16826119d69190614347565b1115611a17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0e90613f5c565b60405180910390fd5b348260ff16668e1bc9bf040000611a2e9190614405565b1115611a6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6690613fdc565b60405180910390fd5b81601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282829054906101000a900460ff16611aca9190614493565b92506101000a81548160ff021916908360ff16021790555060005b8260ff16811015611b305760008183611afe9190614347565b9050611b0a3382612390565b611b1c81611b17836123ae565b612256565b508080611b28906145ed565b915050611ae5565b505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b668e1bc9bf04000081565b600d60009054906101000a900460ff1681565b611bef611e5b565b73ffffffffffffffffffffffffffffffffffffffff16611c0d6113a2565b73ffffffffffffffffffffffffffffffffffffffff1614611c63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5a906140fc565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611cd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cca90613f3c565b60405180910390fd5b611cdc816122ca565b50565b611ce7611e5b565b73ffffffffffffffffffffffffffffffffffffffff16611d056113a2565b73ffffffffffffffffffffffffffffffffffffffff1614611d5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d52906140fc565b60405180910390fd5b80600c9080519060200190611d71929190613365565b5050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611de85750611de7826125c5565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611ed683610e7f565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611f2782611def565b611f66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5d90613ffc565b60405180910390fd5b6000611f7183610e7f565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611fe057508373ffffffffffffffffffffffffffffffffffffffff16611fc88461093c565b73ffffffffffffffffffffffffffffffffffffffff16145b80611ff15750611ff08185611b35565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661201a82610e7f565b73ffffffffffffffffffffffffffffffffffffffff1614612070576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120679061411c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156120e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d790613f9c565b60405180910390fd5b6120eb8383836126a7565b6120f6600082611e63565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612146919061445f565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461219d9190614347565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b61225f82611def565b61229e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122959061407c565b60405180910390fd5b80600a600084815260200190815260200160002090805190602001906122c5929190613365565b505050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6123aa8282604051806020016040528060008152506126b7565b5050565b60606124106040518060800160405280605d8152602001614efa605d91396123d584612712565b6040518060400160405280600581526020017f2e6a736f6e00000000000000000000000000000000000000000000000000000081525061289b565b9050919050565b612422848484611ffa565b61242e848484846128ca565b61246d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161246490613f1c565b60405180910390fd5b50505050565b606061247e82611def565b6124bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124b4906140bc565b60405180910390fd5b6000600a600084815260200190815260200160002080546124dd9061458a565b80601f01602080910402602001604051908101604052809291908181526020018280546125099061458a565b80156125565780601f1061252b57610100808354040283529160200191612556565b820191906000526020600020905b81548152906001019060200180831161253957829003601f168201915b505050505090506000612567612a61565b905060008151141561257d5781925050506125c0565b6000825111156125b257808260405160200161259a929190613e34565b604051602081830303815290604052925050506125c0565b6125bb84612af3565b925050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061269057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806126a0575061269f82612b9a565b5b9050919050565b6126b2838383612c04565b505050565b6126c18383612d18565b6126ce60008484846128ca565b61270d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161270490613f1c565b60405180910390fd5b505050565b6060600082141561275a576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612896565b600082905060005b6000821461278c578080612775906145ed565b915050600a8261278591906143d4565b9150612762565b60008167ffffffffffffffff8111156127a8576127a7614752565b5b6040519080825280601f01601f1916602001820160405280156127da5781602001600182028036833780820191505090505b50905060008290505b6000861461288e576001816127f8919061445f565b90506000600a808861280a91906143d4565b6128149190614405565b8761281f919061445f565b603061282b919061439d565b905060008160f81b90508084848151811061284957612848614723565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8861288591906143d4565b975050506127e3565b819450505050505b919050565b60608383836040516020016128b293929190613e03565b60405160208183030381529060405290509392505050565b60006128eb8473ffffffffffffffffffffffffffffffffffffffff16612ee6565b15612a54578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612914611e5b565b8786866040518563ffffffff1660e01b81526004016129369493929190613e73565b602060405180830381600087803b15801561295057600080fd5b505af192505050801561298157506040513d601f19601f8201168201806040525081019061297e9190613839565b60015b612a04573d80600081146129b1576040519150601f19603f3d011682016040523d82523d6000602084013e6129b6565b606091505b506000815114156129fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129f390613f1c565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612a59565b600190505b949350505050565b6060600e8054612a709061458a565b80601f0160208091040260200160405190810160405280929190818152602001828054612a9c9061458a565b8015612ae95780601f10612abe57610100808354040283529160200191612ae9565b820191906000526020600020905b815481529060010190602001808311612acc57829003601f168201915b5050505050905090565b6060612afe82611def565b612b3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b349061413c565b60405180910390fd5b6000612b47612a61565b90506000815111612b675760405180602001604052806000815250612b92565b80612b7184612ef9565b604051602001612b82929190613e34565b6040516020818303038152906040525b915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612c0f83838361305a565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612c5257612c4d8161305f565b612c91565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612c9057612c8f83826130a8565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612cd457612ccf81613215565b612d13565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612d1257612d1182826132e6565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612d88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d7f9061409c565b60405180910390fd5b612d9181611def565b15612dd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dc890613f7c565b60405180910390fd5b612ddd600083836126a7565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612e2d9190614347565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b60606000821415612f41576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613055565b600082905060005b60008214612f73578080612f5c906145ed565b915050600a82612f6c91906143d4565b9150612f49565b60008167ffffffffffffffff811115612f8f57612f8e614752565b5b6040519080825280601f01601f191660200182016040528015612fc15781602001600182028036833780820191505090505b5090505b6000851461304e57600182612fda919061445f565b9150600a85612fe99190614636565b6030612ff59190614347565b60f81b81838151811061300b5761300a614723565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561304791906143d4565b9450612fc5565b8093505050505b919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016130b584610fc4565b6130bf919061445f565b90506000600760008481526020019081526020016000205490508181146131a4576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050613229919061445f565b905060006009600084815260200190815260200160002054905060006008838154811061325957613258614723565b5b90600052602060002001549050806008838154811061327b5761327a614723565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806132ca576132c96146f4565b5b6001900381819060005260206000200160009055905550505050565b60006132f183610fc4565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b8280546133719061458a565b90600052602060002090601f01602090048101928261339357600085556133da565b82601f106133ac57805160ff19168380011785556133da565b828001600101855582156133da579182015b828111156133d95782518255916020019190600101906133be565b5b5090506133e791906133eb565b5090565b5b808211156134045760008160009055506001016133ec565b5090565b600061341b61341684614297565b614272565b90508281526020810184848401111561343757613436614790565b5b613442848285614548565b509392505050565b600061345d613458846142c8565b614272565b90508281526020810184848401111561347957613478614790565b5b613484848285614548565b509392505050565b60008135905061349b81614e86565b92915050565b60008083601f8401126134b7576134b6614786565b5b8235905067ffffffffffffffff8111156134d4576134d3614781565b5b6020830191508360208202830111156134f0576134ef61478b565b5b9250929050565b60008135905061350681614e9d565b92915050565b60008135905061351b81614eb4565b92915050565b60008151905061353081614eb4565b92915050565b600082601f83011261354b5761354a614786565b5b813561355b848260208601613408565b91505092915050565b600082601f83011261357957613578614786565b5b813561358984826020860161344a565b91505092915050565b6000813590506135a181614ecb565b92915050565b6000813590506135b681614ee2565b92915050565b6000602082840312156135d2576135d161479a565b5b60006135e08482850161348c565b91505092915050565b60008060408385031215613600576135ff61479a565b5b600061360e8582860161348c565b925050602061361f8582860161348c565b9150509250929050565b6000806000606084860312156136425761364161479a565b5b60006136508682870161348c565b93505060206136618682870161348c565b925050604061367286828701613592565b9150509250925092565b600080600080608085870312156136965761369561479a565b5b60006136a48782880161348c565b94505060206136b58782880161348c565b93505060406136c687828801613592565b925050606085013567ffffffffffffffff8111156136e7576136e6614795565b5b6136f387828801613536565b91505092959194509250565b600080604083850312156137165761371561479a565b5b60006137248582860161348c565b9250506020613735858286016134f7565b9150509250929050565b600080604083850312156137565761375561479a565b5b60006137648582860161348c565b925050602061377585828601613592565b9150509250929050565b6000806000604084860312156137985761379761479a565b5b600084013567ffffffffffffffff8111156137b6576137b5614795565b5b6137c2868287016134a1565b935093505060206137d5868287016135a7565b9150509250925092565b6000602082840312156137f5576137f461479a565b5b6000613803848285016134f7565b91505092915050565b6000602082840312156138225761382161479a565b5b60006138308482850161350c565b91505092915050565b60006020828403121561384f5761384e61479a565b5b600061385d84828501613521565b91505092915050565b60006020828403121561387c5761387b61479a565b5b600082013567ffffffffffffffff81111561389a57613899614795565b5b6138a684828501613564565b91505092915050565b6000602082840312156138c5576138c461479a565b5b60006138d384828501613592565b91505092915050565b600080604083850312156138f3576138f261479a565b5b600061390185828601613592565b925050602083013567ffffffffffffffff81111561392257613921614795565b5b61392e85828601613564565b9150509250929050565b60006020828403121561394e5761394d61479a565b5b600061395c848285016135a7565b91505092915050565b61396e816144c7565b82525050565b61397d816144d9565b82525050565b600061398e826142f9565b613998818561430f565b93506139a8818560208601614557565b6139b18161479f565b840191505092915050565b60006139c7826142f9565b6139d18185614320565b93506139e1818560208601614557565b80840191505092915050565b60006139f882614304565b613a02818561432b565b9350613a12818560208601614557565b613a1b8161479f565b840191505092915050565b6000613a3182614304565b613a3b818561433c565b9350613a4b818560208601614557565b80840191505092915050565b6000613a64602b8361432b565b9150613a6f826147b0565b604082019050919050565b6000613a8760328361432b565b9150613a92826147ff565b604082019050919050565b6000613aaa60268361432b565b9150613ab58261484e565b604082019050919050565b6000613acd60208361432b565b9150613ad88261489d565b602082019050919050565b6000613af0601c8361432b565b9150613afb826148c6565b602082019050919050565b6000613b1360248361432b565b9150613b1e826148ef565b604082019050919050565b6000613b3660198361432b565b9150613b418261493e565b602082019050919050565b6000613b59601f8361432b565b9150613b6482614967565b602082019050919050565b6000613b7c602c8361432b565b9150613b8782614990565b604082019050919050565b6000613b9f60388361432b565b9150613baa826149df565b604082019050919050565b6000613bc2602a8361432b565b9150613bcd82614a2e565b604082019050919050565b6000613be560298361432b565b9150613bf082614a7d565b604082019050919050565b6000613c08602e8361432b565b9150613c1382614acc565b604082019050919050565b6000613c2b60208361432b565b9150613c3682614b1b565b602082019050919050565b6000613c4e60318361432b565b9150613c5982614b44565b604082019050919050565b6000613c71602c8361432b565b9150613c7c82614b93565b604082019050919050565b6000613c9460208361432b565b9150613c9f82614be2565b602082019050919050565b6000613cb760298361432b565b9150613cc282614c0b565b604082019050919050565b6000613cda602f8361432b565b9150613ce582614c5a565b604082019050919050565b6000613cfd60228361432b565b9150613d0882614ca9565b604082019050919050565b6000613d2060218361432b565b9150613d2b82614cf8565b604082019050919050565b6000613d43601b8361432b565b9150613d4e82614d47565b602082019050919050565b6000613d6660228361432b565b9150613d7182614d70565b604082019050919050565b6000613d8960318361432b565b9150613d9482614dbf565b604082019050919050565b6000613dac602c8361432b565b9150613db782614e0e565b604082019050919050565b6000613dcf60188361432b565b9150613dda82614e5d565b602082019050919050565b613dee81614531565b82525050565b613dfd8161453b565b82525050565b6000613e0f82866139bc565b9150613e1b82856139bc565b9150613e2782846139bc565b9150819050949350505050565b6000613e408285613a26565b9150613e4c8284613a26565b91508190509392505050565b6000602082019050613e6d6000830184613965565b92915050565b6000608082019050613e886000830187613965565b613e956020830186613965565b613ea26040830185613de5565b8181036060830152613eb48184613983565b905095945050505050565b6000602082019050613ed46000830184613974565b92915050565b60006020820190508181036000830152613ef481846139ed565b905092915050565b60006020820190508181036000830152613f1581613a57565b9050919050565b60006020820190508181036000830152613f3581613a7a565b9050919050565b60006020820190508181036000830152613f5581613a9d565b9050919050565b60006020820190508181036000830152613f7581613ac0565b9050919050565b60006020820190508181036000830152613f9581613ae3565b9050919050565b60006020820190508181036000830152613fb581613b06565b9050919050565b60006020820190508181036000830152613fd581613b29565b9050919050565b60006020820190508181036000830152613ff581613b4c565b9050919050565b6000602082019050818103600083015261401581613b6f565b9050919050565b6000602082019050818103600083015261403581613b92565b9050919050565b6000602082019050818103600083015261405581613bb5565b9050919050565b6000602082019050818103600083015261407581613bd8565b9050919050565b6000602082019050818103600083015261409581613bfb565b9050919050565b600060208201905081810360008301526140b581613c1e565b9050919050565b600060208201905081810360008301526140d581613c41565b9050919050565b600060208201905081810360008301526140f581613c64565b9050919050565b6000602082019050818103600083015261411581613c87565b9050919050565b6000602082019050818103600083015261413581613caa565b9050919050565b6000602082019050818103600083015261415581613ccd565b9050919050565b6000602082019050818103600083015261417581613cf0565b9050919050565b6000602082019050818103600083015261419581613d13565b9050919050565b600060208201905081810360008301526141b581613d36565b9050919050565b600060208201905081810360008301526141d581613d59565b9050919050565b600060208201905081810360008301526141f581613d7c565b9050919050565b6000602082019050818103600083015261421581613d9f565b9050919050565b6000602082019050818103600083015261423581613dc2565b9050919050565b60006020820190506142516000830184613de5565b92915050565b600060208201905061426c6000830184613df4565b92915050565b600061427c61428d565b905061428882826145bc565b919050565b6000604051905090565b600067ffffffffffffffff8211156142b2576142b1614752565b5b6142bb8261479f565b9050602081019050919050565b600067ffffffffffffffff8211156142e3576142e2614752565b5b6142ec8261479f565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061435282614531565b915061435d83614531565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561439257614391614667565b5b828201905092915050565b60006143a88261453b565b91506143b38361453b565b92508260ff038211156143c9576143c8614667565b5b828201905092915050565b60006143df82614531565b91506143ea83614531565b9250826143fa576143f9614696565b5b828204905092915050565b600061441082614531565b915061441b83614531565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561445457614453614667565b5b828202905092915050565b600061446a82614531565b915061447583614531565b92508282101561448857614487614667565b5b828203905092915050565b600061449e8261453b565b91506144a98361453b565b9250828210156144bc576144bb614667565b5b828203905092915050565b60006144d282614511565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b8381101561457557808201518184015260208101905061455a565b83811115614584576000848401525b50505050565b600060028204905060018216806145a257607f821691505b602082108114156145b6576145b56146c5565b5b50919050565b6145c58261479f565b810181811067ffffffffffffffff821117156145e4576145e3614752565b5b80604052505050565b60006145f882614531565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561462b5761462a614667565b5b600182019050919050565b600061464182614531565b915061464c83614531565b92508261465c5761465b614696565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f507572636861736520776f756c6420657863656564206d617820746f6b656e73600082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f53616c65206d7573742062652061637469766520746f206d696e7420746f6b6560008201527f6e73000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4578636565646564206d617820746f6b656e2070757263686173650000000000600082015250565b7f4578636565646564206d617820617661696c61626c6520746f2070757263686160008201527f7365000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f416c6c6f77206c697374206973206e6f74206163746976650000000000000000600082015250565b614e8f816144c7565b8114614e9a57600080fd5b50565b614ea6816144d9565b8114614eb157600080fd5b50565b614ebd816144e5565b8114614ec857600080fd5b50565b614ed481614531565b8114614edf57600080fd5b50565b614eeb8161453b565b8114614ef657600080fd5b5056fe68747470733a2f2f626573736672656e732e6d7970696e6174612e636c6f75642f697066732f516d5442686469584467646d51645a7978484145596566767152774a695738323869503162597a4e754b4c31704e2f424553534652454ea2646970667358221220745a9cd3a0add13406591f9ef9977050f0ed09fd037b74df0bd94808659f452664736f6c63430008070033
Deployed Bytecode
0x60806040526004361061021a5760003560e01c8063715018a611610123578063b88d4fde116100ab578063e985e9c51161006f578063e985e9c5146107b3578063eacddd2e146107f0578063eb8d24441461081b578063f2fde38b14610846578063ffe630b51461086f5761021a565b8063b88d4fde146106cb578063c04a2836146106f4578063c4e3709514610731578063c87b56dd1461075a578063ddff5b1c146107975761021a565b8063833b9499116100f2578063833b9499146106055780638da5cb5b1461063057806395d89b411461065b578063a0712d6814610686578063a22cb465146106a25761021a565b8063715018a614610573578063718bc4af1461058a578063819b25ba146105b35780638295784d146105dc5761021a565b80633ccfd60b116101a657806357f7789e1161017557806357f7789e1461047a5780636352211e146104a35780636373a6b1146104e057806365f130971461050b57806370a08231146105365761021a565b80633ccfd60b146103d457806342842e0e146103eb5780634f6ccce71461041457806355f804b3146104515761021a565b806318160ddd116101ed57806318160ddd146102ed57806323b872dd1461031857806329fc6bae146103415780632f745c591461036c57806332cb6b0c146103a95761021a565b806301ffc9a71461021f57806306fdde031461025c578063081812fc14610287578063095ea7b3146102c4575b600080fd5b34801561022b57600080fd5b506102466004803603810190610241919061380c565b610898565b6040516102539190613ebf565b60405180910390f35b34801561026857600080fd5b506102716108aa565b60405161027e9190613eda565b60405180910390f35b34801561029357600080fd5b506102ae60048036038101906102a991906138af565b61093c565b6040516102bb9190613e58565b60405180910390f35b3480156102d057600080fd5b506102eb60048036038101906102e6919061373f565b6109c1565b005b3480156102f957600080fd5b50610302610ad9565b60405161030f919061423c565b60405180910390f35b34801561032457600080fd5b5061033f600480360381019061033a9190613629565b610ae6565b005b34801561034d57600080fd5b50610356610b46565b6040516103639190613ebf565b60405180910390f35b34801561037857600080fd5b50610393600480360381019061038e919061373f565b610b59565b6040516103a0919061423c565b60405180910390f35b3480156103b557600080fd5b506103be610bfe565b6040516103cb919061423c565b60405180910390f35b3480156103e057600080fd5b506103e9610c03565b005b3480156103f757600080fd5b50610412600480360381019061040d9190613629565b610cce565b005b34801561042057600080fd5b5061043b600480360381019061043691906138af565b610cee565b604051610448919061423c565b60405180910390f35b34801561045d57600080fd5b5061047860048036038101906104739190613866565b610d5f565b005b34801561048657600080fd5b506104a1600480360381019061049c91906138dc565b610df5565b005b3480156104af57600080fd5b506104ca60048036038101906104c591906138af565b610e7f565b6040516104d79190613e58565b60405180910390f35b3480156104ec57600080fd5b506104f5610f31565b6040516105029190613eda565b60405180910390f35b34801561051757600080fd5b50610520610fbf565b60405161052d919061423c565b60405180910390f35b34801561054257600080fd5b5061055d600480360381019061055891906135bc565b610fc4565b60405161056a919061423c565b60405180910390f35b34801561057f57600080fd5b5061058861107c565b005b34801561059657600080fd5b506105b160048036038101906105ac91906137df565b611104565b005b3480156105bf57600080fd5b506105da60048036038101906105d591906138af565b61119d565b005b3480156105e857600080fd5b5061060360048036038101906105fe919061377f565b611275565b005b34801561061157600080fd5b5061061a611397565b604051610627919061423c565b60405180910390f35b34801561063c57600080fd5b506106456113a2565b6040516106529190613e58565b60405180910390f35b34801561066757600080fd5b506106706113cc565b60405161067d9190613eda565b60405180910390f35b6106a0600480360381019061069b91906138af565b61145e565b005b3480156106ae57600080fd5b506106c960048036038101906106c491906136ff565b6115f1565b005b3480156106d757600080fd5b506106f260048036038101906106ed919061367c565b611772565b005b34801561070057600080fd5b5061071b600480360381019061071691906135bc565b6117d4565b6040516107289190614257565b60405180910390f35b34801561073d57600080fd5b50610758600480360381019061075391906137df565b61182a565b005b34801561076657600080fd5b50610781600480360381019061077c91906138af565b6118c3565b60405161078e9190613eda565b60405180910390f35b6107b160048036038101906107ac9190613938565b6118d5565b005b3480156107bf57600080fd5b506107da60048036038101906107d591906135e9565b611b35565b6040516107e79190613ebf565b60405180910390f35b3480156107fc57600080fd5b50610805611bc9565b604051610812919061423c565b60405180910390f35b34801561082757600080fd5b50610830611bd4565b60405161083d9190613ebf565b60405180910390f35b34801561085257600080fd5b5061086d600480360381019061086891906135bc565b611be7565b005b34801561087b57600080fd5b5061089660048036038101906108919190613866565b611cdf565b005b60006108a382611d75565b9050919050565b6060600080546108b99061458a565b80601f01602080910402602001604051908101604052809291908181526020018280546108e59061458a565b80156109325780601f1061090757610100808354040283529160200191610932565b820191906000526020600020905b81548152906001019060200180831161091557829003601f168201915b5050505050905090565b600061094782611def565b610986576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097d906140dc565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109cc82610e7f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a349061417c565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a5c611e5b565b73ffffffffffffffffffffffffffffffffffffffff161480610a8b5750610a8a81610a85611e5b565b611b35565b5b610aca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac19061401c565b60405180910390fd5b610ad48383611e63565b505050565b6000600880549050905090565b610af7610af1611e5b565b82611f1c565b610b36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2d906141dc565b60405180910390fd5b610b41838383611ffa565b505050565b600f60009054906101000a900460ff1681565b6000610b6483610fc4565b8210610ba5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9c90613efc565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b606481565b610c0b611e5b565b73ffffffffffffffffffffffffffffffffffffffff16610c296113a2565b73ffffffffffffffffffffffffffffffffffffffff1614610c7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c76906140fc565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610cca573d6000803e3d6000fd5b5050565b610ce983838360405180602001604052806000815250611772565b505050565b6000610cf8610ad9565b8210610d39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d30906141fc565b60405180910390fd5b60088281548110610d4d57610d4c614723565b5b90600052602060002001549050919050565b610d67611e5b565b73ffffffffffffffffffffffffffffffffffffffff16610d856113a2565b73ffffffffffffffffffffffffffffffffffffffff1614610ddb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd2906140fc565b60405180910390fd5b80600e9080519060200190610df1929190613365565b5050565b610dfd611e5b565b73ffffffffffffffffffffffffffffffffffffffff16610e1b6113a2565b73ffffffffffffffffffffffffffffffffffffffff1614610e71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e68906140fc565b60405180910390fd5b610e7b8282612256565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610f28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1f9061405c565b60405180910390fd5b80915050919050565b600c8054610f3e9061458a565b80601f0160208091040260200160405190810160405280929190818152602001828054610f6a9061458a565b8015610fb75780601f10610f8c57610100808354040283529160200191610fb7565b820191906000526020600020905b815481529060010190602001808311610f9a57829003601f168201915b505050505081565b603281565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611035576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102c9061403c565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611084611e5b565b73ffffffffffffffffffffffffffffffffffffffff166110a26113a2565b73ffffffffffffffffffffffffffffffffffffffff16146110f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ef906140fc565b60405180910390fd5b61110260006122ca565b565b61110c611e5b565b73ffffffffffffffffffffffffffffffffffffffff1661112a6113a2565b73ffffffffffffffffffffffffffffffffffffffff1614611180576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611177906140fc565b60405180910390fd5b80600f60006101000a81548160ff02191690831515021790555050565b6111a5611e5b565b73ffffffffffffffffffffffffffffffffffffffff166111c36113a2565b73ffffffffffffffffffffffffffffffffffffffff1614611219576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611210906140fc565b60405180910390fd5b6000611223610ad9565b905060005b82811015611270576000818361123e9190614347565b905061124a3382612390565b61125c81611257836123ae565b612256565b508080611268906145ed565b915050611228565b505050565b61127d611e5b565b73ffffffffffffffffffffffffffffffffffffffff1661129b6113a2565b73ffffffffffffffffffffffffffffffffffffffff16146112f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e8906140fc565b60405180910390fd5b60005b8383905081101561139157816010600086868581811061131757611316614723565b5b905060200201602081019061132c91906135bc565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff1602179055508080611389906145ed565b9150506112f4565b50505050565b66d529ae9e86000081565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546113db9061458a565b80601f01602080910402602001604051908101604052809291908181526020018280546114079061458a565b80156114545780601f1061142957610100808354040283529160200191611454565b820191906000526020600020905b81548152906001019060200180831161143757829003601f168201915b5050505050905090565b6000611468610ad9565b9050600d60009054906101000a900460ff166114b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b09061415c565b60405180910390fd5b60328211156114fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f49061419c565b60405180910390fd5b6064828261150b9190614347565b111561154c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154390613f5c565b60405180910390fd5b348266d529ae9e8600006115609190614405565b11156115a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159890613fdc565b60405180910390fd5b60005b828110156115ec57600081836115ba9190614347565b90506115c63382612390565b6115d8816115d3836123ae565b612256565b5080806115e4906145ed565b9150506115a4565b505050565b6115f9611e5b565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611667576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165e90613fbc565b60405180910390fd5b8060056000611674611e5b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611721611e5b565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516117669190613ebf565b60405180910390a35050565b61178361177d611e5b565b83611f1c565b6117c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b9906141dc565b60405180910390fd5b6117ce84848484612417565b50505050565b6000601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b611832611e5b565b73ffffffffffffffffffffffffffffffffffffffff166118506113a2565b73ffffffffffffffffffffffffffffffffffffffff16146118a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189d906140fc565b60405180910390fd5b80600d60006101000a81548160ff02191690831515021790555050565b60606118ce82612473565b9050919050565b60006118df610ad9565b9050600f60009054906101000a900460ff16611930576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119279061421c565b60405180910390fd5b601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff168260ff1611156119c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119bc906141bc565b60405180910390fd5b60648260ff16826119d69190614347565b1115611a17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0e90613f5c565b60405180910390fd5b348260ff16668e1bc9bf040000611a2e9190614405565b1115611a6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6690613fdc565b60405180910390fd5b81601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282829054906101000a900460ff16611aca9190614493565b92506101000a81548160ff021916908360ff16021790555060005b8260ff16811015611b305760008183611afe9190614347565b9050611b0a3382612390565b611b1c81611b17836123ae565b612256565b508080611b28906145ed565b915050611ae5565b505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b668e1bc9bf04000081565b600d60009054906101000a900460ff1681565b611bef611e5b565b73ffffffffffffffffffffffffffffffffffffffff16611c0d6113a2565b73ffffffffffffffffffffffffffffffffffffffff1614611c63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5a906140fc565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611cd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cca90613f3c565b60405180910390fd5b611cdc816122ca565b50565b611ce7611e5b565b73ffffffffffffffffffffffffffffffffffffffff16611d056113a2565b73ffffffffffffffffffffffffffffffffffffffff1614611d5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d52906140fc565b60405180910390fd5b80600c9080519060200190611d71929190613365565b5050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611de85750611de7826125c5565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611ed683610e7f565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611f2782611def565b611f66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5d90613ffc565b60405180910390fd5b6000611f7183610e7f565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611fe057508373ffffffffffffffffffffffffffffffffffffffff16611fc88461093c565b73ffffffffffffffffffffffffffffffffffffffff16145b80611ff15750611ff08185611b35565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661201a82610e7f565b73ffffffffffffffffffffffffffffffffffffffff1614612070576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120679061411c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156120e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d790613f9c565b60405180910390fd5b6120eb8383836126a7565b6120f6600082611e63565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612146919061445f565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461219d9190614347565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b61225f82611def565b61229e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122959061407c565b60405180910390fd5b80600a600084815260200190815260200160002090805190602001906122c5929190613365565b505050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6123aa8282604051806020016040528060008152506126b7565b5050565b60606124106040518060800160405280605d8152602001614efa605d91396123d584612712565b6040518060400160405280600581526020017f2e6a736f6e00000000000000000000000000000000000000000000000000000081525061289b565b9050919050565b612422848484611ffa565b61242e848484846128ca565b61246d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161246490613f1c565b60405180910390fd5b50505050565b606061247e82611def565b6124bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124b4906140bc565b60405180910390fd5b6000600a600084815260200190815260200160002080546124dd9061458a565b80601f01602080910402602001604051908101604052809291908181526020018280546125099061458a565b80156125565780601f1061252b57610100808354040283529160200191612556565b820191906000526020600020905b81548152906001019060200180831161253957829003601f168201915b505050505090506000612567612a61565b905060008151141561257d5781925050506125c0565b6000825111156125b257808260405160200161259a929190613e34565b604051602081830303815290604052925050506125c0565b6125bb84612af3565b925050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061269057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806126a0575061269f82612b9a565b5b9050919050565b6126b2838383612c04565b505050565b6126c18383612d18565b6126ce60008484846128ca565b61270d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161270490613f1c565b60405180910390fd5b505050565b6060600082141561275a576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612896565b600082905060005b6000821461278c578080612775906145ed565b915050600a8261278591906143d4565b9150612762565b60008167ffffffffffffffff8111156127a8576127a7614752565b5b6040519080825280601f01601f1916602001820160405280156127da5781602001600182028036833780820191505090505b50905060008290505b6000861461288e576001816127f8919061445f565b90506000600a808861280a91906143d4565b6128149190614405565b8761281f919061445f565b603061282b919061439d565b905060008160f81b90508084848151811061284957612848614723565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8861288591906143d4565b975050506127e3565b819450505050505b919050565b60608383836040516020016128b293929190613e03565b60405160208183030381529060405290509392505050565b60006128eb8473ffffffffffffffffffffffffffffffffffffffff16612ee6565b15612a54578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612914611e5b565b8786866040518563ffffffff1660e01b81526004016129369493929190613e73565b602060405180830381600087803b15801561295057600080fd5b505af192505050801561298157506040513d601f19601f8201168201806040525081019061297e9190613839565b60015b612a04573d80600081146129b1576040519150601f19603f3d011682016040523d82523d6000602084013e6129b6565b606091505b506000815114156129fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129f390613f1c565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612a59565b600190505b949350505050565b6060600e8054612a709061458a565b80601f0160208091040260200160405190810160405280929190818152602001828054612a9c9061458a565b8015612ae95780601f10612abe57610100808354040283529160200191612ae9565b820191906000526020600020905b815481529060010190602001808311612acc57829003601f168201915b5050505050905090565b6060612afe82611def565b612b3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b349061413c565b60405180910390fd5b6000612b47612a61565b90506000815111612b675760405180602001604052806000815250612b92565b80612b7184612ef9565b604051602001612b82929190613e34565b6040516020818303038152906040525b915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612c0f83838361305a565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612c5257612c4d8161305f565b612c91565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612c9057612c8f83826130a8565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612cd457612ccf81613215565b612d13565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612d1257612d1182826132e6565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612d88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d7f9061409c565b60405180910390fd5b612d9181611def565b15612dd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dc890613f7c565b60405180910390fd5b612ddd600083836126a7565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612e2d9190614347565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b60606000821415612f41576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613055565b600082905060005b60008214612f73578080612f5c906145ed565b915050600a82612f6c91906143d4565b9150612f49565b60008167ffffffffffffffff811115612f8f57612f8e614752565b5b6040519080825280601f01601f191660200182016040528015612fc15781602001600182028036833780820191505090505b5090505b6000851461304e57600182612fda919061445f565b9150600a85612fe99190614636565b6030612ff59190614347565b60f81b81838151811061300b5761300a614723565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561304791906143d4565b9450612fc5565b8093505050505b919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016130b584610fc4565b6130bf919061445f565b90506000600760008481526020019081526020016000205490508181146131a4576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050613229919061445f565b905060006009600084815260200190815260200160002054905060006008838154811061325957613258614723565b5b90600052602060002001549050806008838154811061327b5761327a614723565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806132ca576132c96146f4565b5b6001900381819060005260206000200160009055905550505050565b60006132f183610fc4565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b8280546133719061458a565b90600052602060002090601f01602090048101928261339357600085556133da565b82601f106133ac57805160ff19168380011785556133da565b828001600101855582156133da579182015b828111156133d95782518255916020019190600101906133be565b5b5090506133e791906133eb565b5090565b5b808211156134045760008160009055506001016133ec565b5090565b600061341b61341684614297565b614272565b90508281526020810184848401111561343757613436614790565b5b613442848285614548565b509392505050565b600061345d613458846142c8565b614272565b90508281526020810184848401111561347957613478614790565b5b613484848285614548565b509392505050565b60008135905061349b81614e86565b92915050565b60008083601f8401126134b7576134b6614786565b5b8235905067ffffffffffffffff8111156134d4576134d3614781565b5b6020830191508360208202830111156134f0576134ef61478b565b5b9250929050565b60008135905061350681614e9d565b92915050565b60008135905061351b81614eb4565b92915050565b60008151905061353081614eb4565b92915050565b600082601f83011261354b5761354a614786565b5b813561355b848260208601613408565b91505092915050565b600082601f83011261357957613578614786565b5b813561358984826020860161344a565b91505092915050565b6000813590506135a181614ecb565b92915050565b6000813590506135b681614ee2565b92915050565b6000602082840312156135d2576135d161479a565b5b60006135e08482850161348c565b91505092915050565b60008060408385031215613600576135ff61479a565b5b600061360e8582860161348c565b925050602061361f8582860161348c565b9150509250929050565b6000806000606084860312156136425761364161479a565b5b60006136508682870161348c565b93505060206136618682870161348c565b925050604061367286828701613592565b9150509250925092565b600080600080608085870312156136965761369561479a565b5b60006136a48782880161348c565b94505060206136b58782880161348c565b93505060406136c687828801613592565b925050606085013567ffffffffffffffff8111156136e7576136e6614795565b5b6136f387828801613536565b91505092959194509250565b600080604083850312156137165761371561479a565b5b60006137248582860161348c565b9250506020613735858286016134f7565b9150509250929050565b600080604083850312156137565761375561479a565b5b60006137648582860161348c565b925050602061377585828601613592565b9150509250929050565b6000806000604084860312156137985761379761479a565b5b600084013567ffffffffffffffff8111156137b6576137b5614795565b5b6137c2868287016134a1565b935093505060206137d5868287016135a7565b9150509250925092565b6000602082840312156137f5576137f461479a565b5b6000613803848285016134f7565b91505092915050565b6000602082840312156138225761382161479a565b5b60006138308482850161350c565b91505092915050565b60006020828403121561384f5761384e61479a565b5b600061385d84828501613521565b91505092915050565b60006020828403121561387c5761387b61479a565b5b600082013567ffffffffffffffff81111561389a57613899614795565b5b6138a684828501613564565b91505092915050565b6000602082840312156138c5576138c461479a565b5b60006138d384828501613592565b91505092915050565b600080604083850312156138f3576138f261479a565b5b600061390185828601613592565b925050602083013567ffffffffffffffff81111561392257613921614795565b5b61392e85828601613564565b9150509250929050565b60006020828403121561394e5761394d61479a565b5b600061395c848285016135a7565b91505092915050565b61396e816144c7565b82525050565b61397d816144d9565b82525050565b600061398e826142f9565b613998818561430f565b93506139a8818560208601614557565b6139b18161479f565b840191505092915050565b60006139c7826142f9565b6139d18185614320565b93506139e1818560208601614557565b80840191505092915050565b60006139f882614304565b613a02818561432b565b9350613a12818560208601614557565b613a1b8161479f565b840191505092915050565b6000613a3182614304565b613a3b818561433c565b9350613a4b818560208601614557565b80840191505092915050565b6000613a64602b8361432b565b9150613a6f826147b0565b604082019050919050565b6000613a8760328361432b565b9150613a92826147ff565b604082019050919050565b6000613aaa60268361432b565b9150613ab58261484e565b604082019050919050565b6000613acd60208361432b565b9150613ad88261489d565b602082019050919050565b6000613af0601c8361432b565b9150613afb826148c6565b602082019050919050565b6000613b1360248361432b565b9150613b1e826148ef565b604082019050919050565b6000613b3660198361432b565b9150613b418261493e565b602082019050919050565b6000613b59601f8361432b565b9150613b6482614967565b602082019050919050565b6000613b7c602c8361432b565b9150613b8782614990565b604082019050919050565b6000613b9f60388361432b565b9150613baa826149df565b604082019050919050565b6000613bc2602a8361432b565b9150613bcd82614a2e565b604082019050919050565b6000613be560298361432b565b9150613bf082614a7d565b604082019050919050565b6000613c08602e8361432b565b9150613c1382614acc565b604082019050919050565b6000613c2b60208361432b565b9150613c3682614b1b565b602082019050919050565b6000613c4e60318361432b565b9150613c5982614b44565b604082019050919050565b6000613c71602c8361432b565b9150613c7c82614b93565b604082019050919050565b6000613c9460208361432b565b9150613c9f82614be2565b602082019050919050565b6000613cb760298361432b565b9150613cc282614c0b565b604082019050919050565b6000613cda602f8361432b565b9150613ce582614c5a565b604082019050919050565b6000613cfd60228361432b565b9150613d0882614ca9565b604082019050919050565b6000613d2060218361432b565b9150613d2b82614cf8565b604082019050919050565b6000613d43601b8361432b565b9150613d4e82614d47565b602082019050919050565b6000613d6660228361432b565b9150613d7182614d70565b604082019050919050565b6000613d8960318361432b565b9150613d9482614dbf565b604082019050919050565b6000613dac602c8361432b565b9150613db782614e0e565b604082019050919050565b6000613dcf60188361432b565b9150613dda82614e5d565b602082019050919050565b613dee81614531565b82525050565b613dfd8161453b565b82525050565b6000613e0f82866139bc565b9150613e1b82856139bc565b9150613e2782846139bc565b9150819050949350505050565b6000613e408285613a26565b9150613e4c8284613a26565b91508190509392505050565b6000602082019050613e6d6000830184613965565b92915050565b6000608082019050613e886000830187613965565b613e956020830186613965565b613ea26040830185613de5565b8181036060830152613eb48184613983565b905095945050505050565b6000602082019050613ed46000830184613974565b92915050565b60006020820190508181036000830152613ef481846139ed565b905092915050565b60006020820190508181036000830152613f1581613a57565b9050919050565b60006020820190508181036000830152613f3581613a7a565b9050919050565b60006020820190508181036000830152613f5581613a9d565b9050919050565b60006020820190508181036000830152613f7581613ac0565b9050919050565b60006020820190508181036000830152613f9581613ae3565b9050919050565b60006020820190508181036000830152613fb581613b06565b9050919050565b60006020820190508181036000830152613fd581613b29565b9050919050565b60006020820190508181036000830152613ff581613b4c565b9050919050565b6000602082019050818103600083015261401581613b6f565b9050919050565b6000602082019050818103600083015261403581613b92565b9050919050565b6000602082019050818103600083015261405581613bb5565b9050919050565b6000602082019050818103600083015261407581613bd8565b9050919050565b6000602082019050818103600083015261409581613bfb565b9050919050565b600060208201905081810360008301526140b581613c1e565b9050919050565b600060208201905081810360008301526140d581613c41565b9050919050565b600060208201905081810360008301526140f581613c64565b9050919050565b6000602082019050818103600083015261411581613c87565b9050919050565b6000602082019050818103600083015261413581613caa565b9050919050565b6000602082019050818103600083015261415581613ccd565b9050919050565b6000602082019050818103600083015261417581613cf0565b9050919050565b6000602082019050818103600083015261419581613d13565b9050919050565b600060208201905081810360008301526141b581613d36565b9050919050565b600060208201905081810360008301526141d581613d59565b9050919050565b600060208201905081810360008301526141f581613d7c565b9050919050565b6000602082019050818103600083015261421581613d9f565b9050919050565b6000602082019050818103600083015261423581613dc2565b9050919050565b60006020820190506142516000830184613de5565b92915050565b600060208201905061426c6000830184613df4565b92915050565b600061427c61428d565b905061428882826145bc565b919050565b6000604051905090565b600067ffffffffffffffff8211156142b2576142b1614752565b5b6142bb8261479f565b9050602081019050919050565b600067ffffffffffffffff8211156142e3576142e2614752565b5b6142ec8261479f565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061435282614531565b915061435d83614531565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561439257614391614667565b5b828201905092915050565b60006143a88261453b565b91506143b38361453b565b92508260ff038211156143c9576143c8614667565b5b828201905092915050565b60006143df82614531565b91506143ea83614531565b9250826143fa576143f9614696565b5b828204905092915050565b600061441082614531565b915061441b83614531565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561445457614453614667565b5b828202905092915050565b600061446a82614531565b915061447583614531565b92508282101561448857614487614667565b5b828203905092915050565b600061449e8261453b565b91506144a98361453b565b9250828210156144bc576144bb614667565b5b828203905092915050565b60006144d282614511565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b8381101561457557808201518184015260208101905061455a565b83811115614584576000848401525b50505050565b600060028204905060018216806145a257607f821691505b602082108114156145b6576145b56146c5565b5b50919050565b6145c58261479f565b810181811067ffffffffffffffff821117156145e4576145e3614752565b5b80604052505050565b60006145f882614531565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561462b5761462a614667565b5b600182019050919050565b600061464182614531565b915061464c83614531565b92508261465c5761465b614696565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f507572636861736520776f756c6420657863656564206d617820746f6b656e73600082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f53616c65206d7573742062652061637469766520746f206d696e7420746f6b6560008201527f6e73000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4578636565646564206d617820746f6b656e2070757263686173650000000000600082015250565b7f4578636565646564206d617820617661696c61626c6520746f2070757263686160008201527f7365000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f416c6c6f77206c697374206973206e6f74206163746976650000000000000000600082015250565b614e8f816144c7565b8114614e9a57600080fd5b50565b614ea6816144d9565b8114614eb157600080fd5b50565b614ebd816144e5565b8114614ec857600080fd5b50565b614ed481614531565b8114614edf57600080fd5b50565b614eeb8161453b565b8114614ef657600080fd5b5056fe68747470733a2f2f626573736672656e732e6d7970696e6174612e636c6f75642f697066732f516d5442686469584467646d51645a7978484145596566767152774a695738323869503162597a4e754b4c31704e2f424553534652454ea2646970667358221220745a9cd3a0add13406591f9ef9977050f0ed09fd037b74df0bd94808659f452664736f6c63430008070033
Deployed Bytecode Sourcemap
61952:5258:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65421:179;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22641:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24200:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23723:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37325:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25090:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62143:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36993:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62187:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67067:140;;;;;;;;;;;;;:::i;:::-;;25500:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37515:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65608:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63408:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22335:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62033:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62234:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22065:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44488:94;;;;;;;;;;;;;:::i;:::-;;62846:131;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65968:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62985:230;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62285:52;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43837:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22810:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66388:671;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24493:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25756:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64356:114;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66284:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62644:196;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64478:746;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24859:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62344:55;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62064:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44737:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65852:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65421:179;65532:4;65556:36;65580:11;65556:23;:36::i;:::-;65549:43;;65421:179;;;:::o;22641:100::-;22695:13;22728:5;22721:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22641:100;:::o;24200:221::-;24276:7;24304:16;24312:7;24304;:16::i;:::-;24296:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;24389:15;:24;24405:7;24389:24;;;;;;;;;;;;;;;;;;;;;24382:31;;24200:221;;;:::o;23723:411::-;23804:13;23820:23;23835:7;23820:14;:23::i;:::-;23804:39;;23868:5;23862:11;;:2;:11;;;;23854:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;23962:5;23946:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;23971:37;23988:5;23995:12;:10;:12::i;:::-;23971:16;:37::i;:::-;23946:62;23924:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;24105:21;24114:2;24118:7;24105:8;:21::i;:::-;23793:341;23723:411;;:::o;37325:113::-;37386:7;37413:10;:17;;;;37406:24;;37325:113;:::o;25090:339::-;25285:41;25304:12;:10;:12::i;:::-;25318:7;25285:18;:41::i;:::-;25277:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25393:28;25403:4;25409:2;25413:7;25393:9;:28::i;:::-;25090:339;;;:::o;62143:37::-;;;;;;;;;;;;;:::o;36993:256::-;37090:7;37126:23;37143:5;37126:16;:23::i;:::-;37118:5;:31;37110:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;37215:12;:19;37228:5;37215:19;;;;;;;;;;;;;;;:26;37235:5;37215:26;;;;;;;;;;;;37208:33;;36993:256;;;;:::o;62187:40::-;62224:3;62187:40;:::o;67067:140::-;44068:12;:10;:12::i;:::-;44057:23;;:7;:5;:7::i;:::-;:23;;;44049:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67115:12:::1;67130:21;67115:36;;67170:10;67162:28;;:37;67191:7;67162:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;67104:103;67067:140::o:0;25500:185::-;25638:39;25655:4;25661:2;25665:7;25638:39;;;;;;;;;;;;:16;:39::i;:::-;25500:185;;;:::o;37515:233::-;37590:7;37626:30;:28;:30::i;:::-;37618:5;:38;37610:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;37723:10;37734:5;37723:17;;;;;;;;:::i;:::-;;;;;;;;;;37716:24;;37515:233;;;:::o;65608:111::-;44068:12;:10;:12::i;:::-;44057:23;;:7;:5;:7::i;:::-;:23;;;44049:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;65703:8:::1;65684:16;:27;;;;;;;;;;;;:::i;:::-;;65608:111:::0;:::o;63408:118::-;44068:12;:10;:12::i;:::-;44057:23;;:7;:5;:7::i;:::-;:23;;;44049:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;63492:26:::1;63505:7;63514:3;63492:12;:26::i;:::-;63408:118:::0;;:::o;22335:239::-;22407:7;22427:13;22443:7;:16;22451:7;22443:16;;;;;;;;;;;;;;;;;;;;;22427:32;;22495:1;22478:19;;:5;:19;;;;22470:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22561:5;22554:12;;;22335:239;;;:::o;62033:24::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;62234:44::-;62276:2;62234:44;:::o;22065:208::-;22137:7;22182:1;22165:19;;:5;:19;;;;22157:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;22249:9;:16;22259:5;22249:16;;;;;;;;;;;;;;;;22242:23;;22065:208;;;:::o;44488:94::-;44068:12;:10;:12::i;:::-;44057:23;;:7;:5;:7::i;:::-;:23;;;44049:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44553:21:::1;44571:1;44553:9;:21::i;:::-;44488:94::o:0;62846:131::-;44068:12;:10;:12::i;:::-;44057:23;;:7;:5;:7::i;:::-;:23;;;44049:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62951:18:::1;62931:17;;:38;;;;;;;;;;;;;;;;;;62846:131:::0;:::o;65968:308::-;44068:12;:10;:12::i;:::-;44057:23;;:7;:5;:7::i;:::-;:23;;;44049:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;66022:11:::1;66036:13;:11;:13::i;:::-;66022:27;;66058:6;66073:196;66089:1;66085;:5;66073:196;;;66110:19;66141:1;66132:6;:10;;;;:::i;:::-;66110:32;;66155:34;66165:10;66177:11;66155:9;:34::i;:::-;66202:57;66215:11;66228:30;66246:11;66228:17;:30::i;:::-;66202:12;:57::i;:::-;66097:172;66092:3;;;;;:::i;:::-;;;;66073:196;;;66013:263;;65968:308:::0;:::o;62985:230::-;44068:12;:10;:12::i;:::-;44057:23;;:7;:5;:7::i;:::-;:23;;;44049:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;63096:9:::1;63091:117;63115:9;;:16;;63111:1;:20;63091:117;;;63180:16;63153:10;:24;63164:9;;63174:1;63164:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;63153:24;;;;;;;;;;;;;;;;:43;;;;;;;;;;;;;;;;;;63133:3;;;;;:::i;:::-;;;;63091:117;;;;62985:230:::0;;;:::o;62285:52::-;62327:10;62285:52;:::o;43837:87::-;43883:7;43910:6;;;;;;;;;;;43903:13;;43837:87;:::o;22810:104::-;22866:13;22899:7;22892:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22810:104;:::o;66388:671::-;66449:10;66462:13;:11;:13::i;:::-;66449:26;;66494:12;;;;;;;;;;;66486:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;62276:2;66564:14;:33;;66556:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;62224:3;66653:14;66648:2;:19;;;;:::i;:::-;:33;;66640:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;66773:9;66755:14;62327:10;66737:32;;;;:::i;:::-;:45;;66729:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;66836:9;66831:221;66855:14;66851:1;:18;66831:221;;;66891:19;66918:1;66913:2;:6;;;;:::i;:::-;66891:28;;66934:34;66944:10;66956:11;66934:9;:34::i;:::-;66983:57;66996:11;67009:30;67027:11;67009:17;:30::i;:::-;66983:12;:57::i;:::-;66876:176;66871:3;;;;;:::i;:::-;;;;66831:221;;;;66438:621;66388:671;:::o;24493:295::-;24608:12;:10;:12::i;:::-;24596:24;;:8;:24;;;;24588:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;24708:8;24663:18;:32;24682:12;:10;:12::i;:::-;24663:32;;;;;;;;;;;;;;;:42;24696:8;24663:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;24761:8;24732:48;;24747:12;:10;:12::i;:::-;24732:48;;;24771:8;24732:48;;;;;;:::i;:::-;;;;;;;;24493:295;;:::o;25756:328::-;25931:41;25950:12;:10;:12::i;:::-;25964:7;25931:18;:41::i;:::-;25923:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;26037:39;26051:4;26057:2;26061:7;26070:5;26037:13;:39::i;:::-;25756:328;;;;:::o;64356:114::-;64421:5;64446:10;:16;64457:4;64446:16;;;;;;;;;;;;;;;;;;;;;;;;;64439:23;;64356:114;;;:::o;66284:96::-;44068:12;:10;:12::i;:::-;44057:23;;:7;:5;:7::i;:::-;:23;;;44049:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;66364:8:::1;66349:12;;:23;;;;;;;;;;;;;;;;;;66284:96:::0;:::o;62644:196::-;62771:13;62809:23;62824:7;62809:14;:23::i;:::-;62802:30;;62644:196;;;:::o;64478:746::-;64551:10;64564:13;:11;:13::i;:::-;64551:26;;64596:17;;;;;;;;;;;64588:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;64679:10;:22;64690:10;64679:22;;;;;;;;;;;;;;;;;;;;;;;;;64661:40;;:14;:40;;;;64653:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;62224:3;64764:14;64759:19;;:2;:19;;;;:::i;:::-;:33;;64751:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;64887:9;64869:14;64848:35;;62389:10;64848:35;;;;:::i;:::-;:48;;64840:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;64971:14;64945:10;:22;64956:10;64945:22;;;;;;;;;;;;;;;;:40;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;65001:9;64996:221;65020:14;65016:18;;:1;:18;64996:221;;;65056:19;65083:1;65078:2;:6;;;;:::i;:::-;65056:28;;65099:34;65109:10;65121:11;65099:9;:34::i;:::-;65148:57;65161:11;65174:30;65192:11;65174:17;:30::i;:::-;65148:12;:57::i;:::-;65041:176;65036:3;;;;;:::i;:::-;;;;64996:221;;;;64540:684;64478:746;:::o;24859:164::-;24956:4;24980:18;:25;24999:5;24980:25;;;;;;;;;;;;;;;:35;25006:8;24980:35;;;;;;;;;;;;;;;;;;;;;;;;;24973:42;;24859:164;;;;:::o;62344:55::-;62389:10;62344:55;:::o;62064:32::-;;;;;;;;;;;;;:::o;44737:192::-;44068:12;:10;:12::i;:::-;44057:23;;:7;:5;:7::i;:::-;:23;;;44049:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44846:1:::1;44826:22;;:8;:22;;;;44818:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;44902:19;44912:8;44902:9;:19::i;:::-;44737:192:::0;:::o;65852:108::-;44068:12;:10;:12::i;:::-;44057:23;;:7;:5;:7::i;:::-;:23;;;44049:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;65942:10:::1;65929;:23;;;;;;;;;;;;:::i;:::-;;65852:108:::0;:::o;36685:224::-;36787:4;36826:35;36811:50;;;:11;:50;;;;:90;;;;36865:36;36889:11;36865:23;:36::i;:::-;36811:90;36804:97;;36685:224;;;:::o;27594:127::-;27659:4;27711:1;27683:30;;:7;:16;27691:7;27683:16;;;;;;;;;;;;;;;;;;;;;:30;;;;27676:37;;27594:127;;;:::o;20144:98::-;20197:7;20224:10;20217:17;;20144:98;:::o;31576:174::-;31678:2;31651:15;:24;31667:7;31651:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;31734:7;31730:2;31696:46;;31705:23;31720:7;31705:14;:23::i;:::-;31696:46;;;;;;;;;;;;31576:174;;:::o;27888:348::-;27981:4;28006:16;28014:7;28006;:16::i;:::-;27998:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;28082:13;28098:23;28113:7;28098:14;:23::i;:::-;28082:39;;28151:5;28140:16;;:7;:16;;;:51;;;;28184:7;28160:31;;:20;28172:7;28160:11;:20::i;:::-;:31;;;28140:51;:87;;;;28195:32;28212:5;28219:7;28195:16;:32::i;:::-;28140:87;28132:96;;;27888:348;;;;:::o;30880:578::-;31039:4;31012:31;;:23;31027:7;31012:14;:23::i;:::-;:31;;;31004:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;31122:1;31108:16;;:2;:16;;;;31100:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;31178:39;31199:4;31205:2;31209:7;31178:20;:39::i;:::-;31282:29;31299:1;31303:7;31282:8;:29::i;:::-;31343:1;31324:9;:15;31334:4;31324:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;31372:1;31355:9;:13;31365:2;31355:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;31403:2;31384:7;:16;31392:7;31384:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;31442:7;31438:2;31423:27;;31432:4;31423:27;;;;;;;;;;;;30880:578;;;:::o;35090:217::-;35190:16;35198:7;35190;:16::i;:::-;35182:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;35290:9;35268:10;:19;35279:7;35268:19;;;;;;;;;;;:31;;;;;;;;;;;;:::i;:::-;;35090:217;;:::o;44937:173::-;44993:16;45012:6;;;;;;;;;;;44993:25;;45038:8;45029:6;;:17;;;;;;;;;;;;;;;;;;45093:8;45062:40;;45083:8;45062:40;;;;;;;;;;;;44982:128;44937:173;:::o;28578:110::-;28654:26;28664:2;28668:7;28654:26;;;;;;;;;;;;:9;:26::i;:::-;28578:110;;:::o;64111:239::-;64178:13;64211:131;;;;;;;;;;;;;;;;;;64315:17;64324:7;64315:8;:17::i;:::-;64211:131;;;;;;;;;;;;;;;;;:6;:131::i;:::-;64204:138;;64111:239;;;:::o;26966:315::-;27123:28;27133:4;27139:2;27143:7;27123:9;:28::i;:::-;27170:48;27193:4;27199:2;27203:7;27212:5;27170:22;:48::i;:::-;27162:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;26966:315;;;;:::o;34255:679::-;34328:13;34362:16;34370:7;34362;:16::i;:::-;34354:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;34445:23;34471:10;:19;34482:7;34471:19;;;;;;;;;;;34445:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34501:18;34522:10;:8;:10::i;:::-;34501:31;;34630:1;34614:4;34608:18;:23;34604:72;;;34655:9;34648:16;;;;;;34604:72;34806:1;34786:9;34780:23;:27;34776:108;;;34855:4;34861:9;34838:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;34824:48;;;;;;34776:108;34903:23;34918:7;34903:14;:23::i;:::-;34896:30;;;;34255:679;;;;:::o;21696:305::-;21798:4;21850:25;21835:40;;;:11;:40;;;;:105;;;;21907:33;21892:48;;;:11;:48;;;;21835:105;:158;;;;21957:36;21981:11;21957:23;:36::i;:::-;21835:158;21815:178;;21696:305;;;:::o;65232:181::-;65360:45;65387:4;65393:2;65397:7;65360:26;:45::i;:::-;65232:181;;;:::o;28915:321::-;29045:18;29051:2;29055:7;29045:5;:18::i;:::-;29096:54;29127:1;29131:2;29135:7;29144:5;29096:22;:54::i;:::-;29074:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;28915:321;;;:::o;63532:573::-;63582:27;63632:1;63626:2;:7;63622:50;;;63650:10;;;;;;;;;;;;;;;;;;;;;63622:50;63682:6;63691:2;63682:11;;63704:8;63723:69;63735:1;63730;:6;63723:69;;63753:5;;;;;:::i;:::-;;;;63778:2;63773:7;;;;;:::i;:::-;;;63723:69;;;63802:17;63832:3;63822:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63802:34;;63847:6;63856:3;63847:12;;63870:198;63883:1;63877:2;:7;63870:198;;63907:1;63905;:3;;;;:::i;:::-;63901:7;;63923:10;63963:2;63958;63953;:7;;;;:::i;:::-;:12;;;;:::i;:::-;63948:2;:17;;;;:::i;:::-;63937:2;:29;;;;:::i;:::-;63923:44;;63982:9;64001:4;63994:12;;63982:24;;64031:2;64021:4;64026:1;64021:7;;;;;;;;:::i;:::-;;;;;:12;;;;;;;;;;;64054:2;64048:8;;;;;:::i;:::-;;;63886:182;;63870:198;;;64092:4;64078:19;;;;;;63532:573;;;;:::o;63221:181::-;63311:13;63370:1;63380;63390;63351:42;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;63337:57;;63221:181;;;;;:::o;32315:799::-;32470:4;32491:15;:2;:13;;;:15::i;:::-;32487:620;;;32543:2;32527:36;;;32564:12;:10;:12::i;:::-;32578:4;32584:7;32593:5;32527:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;32523:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32786:1;32769:6;:13;:18;32765:272;;;32812:60;;;;;;;;;;:::i;:::-;;;;;;;;32765:272;32987:6;32981:13;32972:6;32968:2;32964:15;32957:38;32523:529;32660:41;;;32650:51;;;:6;:51;;;;32643:58;;;;;32487:620;33091:4;33084:11;;32315:799;;;;;;;:::o;65727:117::-;65787:13;65820:16;65813:23;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65727:117;:::o;22985:334::-;23058:13;23092:16;23100:7;23092;:16::i;:::-;23084:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;23173:21;23197:10;:8;:10::i;:::-;23173:34;;23249:1;23231:7;23225:21;:25;:86;;;;;;;;;;;;;;;;;23277:7;23286:18;:7;:16;:18::i;:::-;23260:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;23225:86;23218:93;;;22985:334;;;:::o;12806:157::-;12891:4;12930:25;12915:40;;;:11;:40;;;;12908:47;;12806:157;;;:::o;38361:589::-;38505:45;38532:4;38538:2;38542:7;38505:26;:45::i;:::-;38583:1;38567:18;;:4;:18;;;38563:187;;;38602:40;38634:7;38602:31;:40::i;:::-;38563:187;;;38672:2;38664:10;;:4;:10;;;38660:90;;38691:47;38724:4;38730:7;38691:32;:47::i;:::-;38660:90;38563:187;38778:1;38764:16;;:2;:16;;;38760:183;;;38797:45;38834:7;38797:36;:45::i;:::-;38760:183;;;38870:4;38864:10;;:2;:10;;;38860:83;;38891:40;38919:2;38923:7;38891:27;:40::i;:::-;38860:83;38760:183;38361:589;;;:::o;29572:382::-;29666:1;29652:16;;:2;:16;;;;29644:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;29725:16;29733:7;29725;:16::i;:::-;29724:17;29716:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;29787:45;29816:1;29820:2;29824:7;29787:20;:45::i;:::-;29862:1;29845:9;:13;29855:2;29845:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29893:2;29874:7;:16;29882:7;29874:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29938:7;29934:2;29913:33;;29930:1;29913:33;;;;;;;;;;;;29572:382;;:::o;2848:387::-;2908:4;3116:12;3183:7;3171:20;3163:28;;3226:1;3219:4;:8;3212:15;;;2848:387;;;:::o;317:723::-;373:13;603:1;594:5;:10;590:53;;;621:10;;;;;;;;;;;;;;;;;;;;;590:53;653:12;668:5;653:20;;684:14;709:78;724:1;716:4;:9;709:78;;742:8;;;;;:::i;:::-;;;;773:2;765:10;;;;;:::i;:::-;;;709:78;;;797:19;829:6;819:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;797:39;;847:154;863:1;854:5;:10;847:154;;891:1;881:11;;;;;:::i;:::-;;;958:2;950:5;:10;;;;:::i;:::-;937:2;:24;;;;:::i;:::-;924:39;;907:6;914;907:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;987:2;978:11;;;;;:::i;:::-;;;847:154;;;1025:6;1011:21;;;;;317:723;;;;:::o;33686:126::-;;;;:::o;39673:164::-;39777:10;:17;;;;39750:15;:24;39766:7;39750:24;;;;;;;;;;;:44;;;;39805:10;39821:7;39805:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39673:164;:::o;40464:988::-;40730:22;40780:1;40755:22;40772:4;40755:16;:22::i;:::-;:26;;;;:::i;:::-;40730:51;;40792:18;40813:17;:26;40831:7;40813:26;;;;;;;;;;;;40792:47;;40960:14;40946:10;:28;40942:328;;40991:19;41013:12;:18;41026:4;41013:18;;;;;;;;;;;;;;;:34;41032:14;41013:34;;;;;;;;;;;;40991:56;;41097:11;41064:12;:18;41077:4;41064:18;;;;;;;;;;;;;;;:30;41083:10;41064:30;;;;;;;;;;;:44;;;;41214:10;41181:17;:30;41199:11;41181:30;;;;;;;;;;;:43;;;;40976:294;40942:328;41366:17;:26;41384:7;41366:26;;;;;;;;;;;41359:33;;;41410:12;:18;41423:4;41410:18;;;;;;;;;;;;;;;:34;41429:14;41410:34;;;;;;;;;;;41403:41;;;40545:907;;40464:988;;:::o;41747:1079::-;42000:22;42045:1;42025:10;:17;;;;:21;;;;:::i;:::-;42000:46;;42057:18;42078:15;:24;42094:7;42078:24;;;;;;;;;;;;42057:45;;42429:19;42451:10;42462:14;42451:26;;;;;;;;:::i;:::-;;;;;;;;;;42429:48;;42515:11;42490:10;42501;42490:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;42626:10;42595:15;:28;42611:11;42595:28;;;;;;;;;;;:41;;;;42767:15;:24;42783:7;42767:24;;;;;;;;;;;42760:31;;;42802:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;41818:1008;;;41747:1079;:::o;39251:221::-;39336:14;39353:20;39370:2;39353:16;:20::i;:::-;39336:37;;39411:7;39384:12;:16;39397:2;39384:16;;;;;;;;;;;;;;;:24;39401:6;39384:24;;;;;;;;;;;:34;;;;39458:6;39429:17;:26;39447:7;39429:26;;;;;;;;;;;:35;;;;39325:147;39251:221;;:::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;1003:568::-;1076:8;1086:6;1136:3;1129:4;1121:6;1117:17;1113:27;1103:122;;1144:79;;:::i;:::-;1103:122;1257:6;1244:20;1234:30;;1287:18;1279:6;1276:30;1273:117;;;1309:79;;:::i;:::-;1273:117;1423:4;1415:6;1411:17;1399:29;;1477:3;1469:4;1461:6;1457:17;1447:8;1443:32;1440:41;1437:128;;;1484:79;;:::i;:::-;1437:128;1003:568;;;;;:::o;1577:133::-;1620:5;1658:6;1645:20;1636:29;;1674:30;1698:5;1674:30;:::i;:::-;1577:133;;;;:::o;1716:137::-;1761:5;1799:6;1786:20;1777:29;;1815:32;1841:5;1815:32;:::i;:::-;1716:137;;;;:::o;1859:141::-;1915:5;1946:6;1940:13;1931:22;;1962:32;1988:5;1962:32;:::i;:::-;1859:141;;;;:::o;2019:338::-;2074:5;2123:3;2116:4;2108:6;2104:17;2100:27;2090:122;;2131:79;;:::i;:::-;2090:122;2248:6;2235:20;2273:78;2347:3;2339:6;2332:4;2324:6;2320:17;2273:78;:::i;:::-;2264:87;;2080:277;2019:338;;;;:::o;2377:340::-;2433:5;2482:3;2475:4;2467:6;2463:17;2459:27;2449:122;;2490:79;;:::i;:::-;2449:122;2607:6;2594:20;2632:79;2707:3;2699:6;2692:4;2684:6;2680:17;2632:79;:::i;:::-;2623:88;;2439:278;2377:340;;;;:::o;2723:139::-;2769:5;2807:6;2794:20;2785:29;;2823:33;2850:5;2823:33;:::i;:::-;2723:139;;;;:::o;2868:135::-;2912:5;2950:6;2937:20;2928:29;;2966:31;2991:5;2966:31;:::i;:::-;2868:135;;;;:::o;3009:329::-;3068:6;3117:2;3105:9;3096:7;3092:23;3088:32;3085:119;;;3123:79;;:::i;:::-;3085:119;3243:1;3268:53;3313:7;3304:6;3293:9;3289:22;3268:53;:::i;:::-;3258:63;;3214:117;3009:329;;;;:::o;3344:474::-;3412:6;3420;3469:2;3457:9;3448:7;3444:23;3440:32;3437:119;;;3475:79;;:::i;:::-;3437:119;3595:1;3620:53;3665:7;3656:6;3645:9;3641:22;3620:53;:::i;:::-;3610:63;;3566:117;3722:2;3748:53;3793:7;3784:6;3773:9;3769:22;3748:53;:::i;:::-;3738:63;;3693:118;3344:474;;;;;:::o;3824:619::-;3901:6;3909;3917;3966:2;3954:9;3945:7;3941:23;3937:32;3934:119;;;3972:79;;:::i;:::-;3934:119;4092:1;4117:53;4162:7;4153:6;4142:9;4138:22;4117:53;:::i;:::-;4107:63;;4063:117;4219:2;4245:53;4290:7;4281:6;4270:9;4266:22;4245:53;:::i;:::-;4235:63;;4190:118;4347:2;4373:53;4418:7;4409:6;4398:9;4394:22;4373:53;:::i;:::-;4363:63;;4318:118;3824:619;;;;;:::o;4449:943::-;4544:6;4552;4560;4568;4617:3;4605:9;4596:7;4592:23;4588:33;4585:120;;;4624:79;;:::i;:::-;4585:120;4744:1;4769:53;4814:7;4805:6;4794:9;4790:22;4769:53;:::i;:::-;4759:63;;4715:117;4871:2;4897:53;4942:7;4933:6;4922:9;4918:22;4897:53;:::i;:::-;4887:63;;4842:118;4999:2;5025:53;5070:7;5061:6;5050:9;5046:22;5025:53;:::i;:::-;5015:63;;4970:118;5155:2;5144:9;5140:18;5127:32;5186:18;5178:6;5175:30;5172:117;;;5208:79;;:::i;:::-;5172:117;5313:62;5367:7;5358:6;5347:9;5343:22;5313:62;:::i;:::-;5303:72;;5098:287;4449:943;;;;;;;:::o;5398:468::-;5463:6;5471;5520:2;5508:9;5499:7;5495:23;5491:32;5488:119;;;5526:79;;:::i;:::-;5488:119;5646:1;5671:53;5716:7;5707:6;5696:9;5692:22;5671:53;:::i;:::-;5661:63;;5617:117;5773:2;5799:50;5841:7;5832:6;5821:9;5817:22;5799:50;:::i;:::-;5789:60;;5744:115;5398:468;;;;;:::o;5872:474::-;5940:6;5948;5997:2;5985:9;5976:7;5972:23;5968:32;5965:119;;;6003:79;;:::i;:::-;5965:119;6123:1;6148:53;6193:7;6184:6;6173:9;6169:22;6148:53;:::i;:::-;6138:63;;6094:117;6250:2;6276:53;6321:7;6312:6;6301:9;6297:22;6276:53;:::i;:::-;6266:63;;6221:118;5872:474;;;;;:::o;6352:700::-;6445:6;6453;6461;6510:2;6498:9;6489:7;6485:23;6481:32;6478:119;;;6516:79;;:::i;:::-;6478:119;6664:1;6653:9;6649:17;6636:31;6694:18;6686:6;6683:30;6680:117;;;6716:79;;:::i;:::-;6680:117;6829:80;6901:7;6892:6;6881:9;6877:22;6829:80;:::i;:::-;6811:98;;;;6607:312;6958:2;6984:51;7027:7;7018:6;7007:9;7003:22;6984:51;:::i;:::-;6974:61;;6929:116;6352:700;;;;;:::o;7058:323::-;7114:6;7163:2;7151:9;7142:7;7138:23;7134:32;7131:119;;;7169:79;;:::i;:::-;7131:119;7289:1;7314:50;7356:7;7347:6;7336:9;7332:22;7314:50;:::i;:::-;7304:60;;7260:114;7058:323;;;;:::o;7387:327::-;7445:6;7494:2;7482:9;7473:7;7469:23;7465:32;7462:119;;;7500:79;;:::i;:::-;7462:119;7620:1;7645:52;7689:7;7680:6;7669:9;7665:22;7645:52;:::i;:::-;7635:62;;7591:116;7387:327;;;;:::o;7720:349::-;7789:6;7838:2;7826:9;7817:7;7813:23;7809:32;7806:119;;;7844:79;;:::i;:::-;7806:119;7964:1;7989:63;8044:7;8035:6;8024:9;8020:22;7989:63;:::i;:::-;7979:73;;7935:127;7720:349;;;;:::o;8075:509::-;8144:6;8193:2;8181:9;8172:7;8168:23;8164:32;8161:119;;;8199:79;;:::i;:::-;8161:119;8347:1;8336:9;8332:17;8319:31;8377:18;8369:6;8366:30;8363:117;;;8399:79;;:::i;:::-;8363:117;8504:63;8559:7;8550:6;8539:9;8535:22;8504:63;:::i;:::-;8494:73;;8290:287;8075:509;;;;:::o;8590:329::-;8649:6;8698:2;8686:9;8677:7;8673:23;8669:32;8666:119;;;8704:79;;:::i;:::-;8666:119;8824:1;8849:53;8894:7;8885:6;8874:9;8870:22;8849:53;:::i;:::-;8839:63;;8795:117;8590:329;;;;:::o;8925:654::-;9003:6;9011;9060:2;9048:9;9039:7;9035:23;9031:32;9028:119;;;9066:79;;:::i;:::-;9028:119;9186:1;9211:53;9256:7;9247:6;9236:9;9232:22;9211:53;:::i;:::-;9201:63;;9157:117;9341:2;9330:9;9326:18;9313:32;9372:18;9364:6;9361:30;9358:117;;;9394:79;;:::i;:::-;9358:117;9499:63;9554:7;9545:6;9534:9;9530:22;9499:63;:::i;:::-;9489:73;;9284:288;8925:654;;;;;:::o;9585:325::-;9642:6;9691:2;9679:9;9670:7;9666:23;9662:32;9659:119;;;9697:79;;:::i;:::-;9659:119;9817:1;9842:51;9885:7;9876:6;9865:9;9861:22;9842:51;:::i;:::-;9832:61;;9788:115;9585:325;;;;:::o;9916:118::-;10003:24;10021:5;10003:24;:::i;:::-;9998:3;9991:37;9916:118;;:::o;10040:109::-;10121:21;10136:5;10121:21;:::i;:::-;10116:3;10109:34;10040:109;;:::o;10155:360::-;10241:3;10269:38;10301:5;10269:38;:::i;:::-;10323:70;10386:6;10381:3;10323:70;:::i;:::-;10316:77;;10402:52;10447:6;10442:3;10435:4;10428:5;10424:16;10402:52;:::i;:::-;10479:29;10501:6;10479:29;:::i;:::-;10474:3;10470:39;10463:46;;10245:270;10155:360;;;;:::o;10521:373::-;10625:3;10653:38;10685:5;10653:38;:::i;:::-;10707:88;10788:6;10783:3;10707:88;:::i;:::-;10700:95;;10804:52;10849:6;10844:3;10837:4;10830:5;10826:16;10804:52;:::i;:::-;10881:6;10876:3;10872:16;10865:23;;10629:265;10521:373;;;;:::o;10900:364::-;10988:3;11016:39;11049:5;11016:39;:::i;:::-;11071:71;11135:6;11130:3;11071:71;:::i;:::-;11064:78;;11151:52;11196:6;11191:3;11184:4;11177:5;11173:16;11151:52;:::i;:::-;11228:29;11250:6;11228:29;:::i;:::-;11223:3;11219:39;11212:46;;10992:272;10900:364;;;;:::o;11270:377::-;11376:3;11404:39;11437:5;11404:39;:::i;:::-;11459:89;11541:6;11536:3;11459:89;:::i;:::-;11452:96;;11557:52;11602:6;11597:3;11590:4;11583:5;11579:16;11557:52;:::i;:::-;11634:6;11629:3;11625:16;11618:23;;11380:267;11270:377;;;;:::o;11653:366::-;11795:3;11816:67;11880:2;11875:3;11816:67;:::i;:::-;11809:74;;11892:93;11981:3;11892:93;:::i;:::-;12010:2;12005:3;12001:12;11994:19;;11653:366;;;:::o;12025:::-;12167:3;12188:67;12252:2;12247:3;12188:67;:::i;:::-;12181:74;;12264:93;12353:3;12264:93;:::i;:::-;12382:2;12377:3;12373:12;12366:19;;12025:366;;;:::o;12397:::-;12539:3;12560:67;12624:2;12619:3;12560:67;:::i;:::-;12553:74;;12636:93;12725:3;12636:93;:::i;:::-;12754:2;12749:3;12745:12;12738:19;;12397:366;;;:::o;12769:::-;12911:3;12932:67;12996:2;12991:3;12932:67;:::i;:::-;12925:74;;13008:93;13097:3;13008:93;:::i;:::-;13126:2;13121:3;13117:12;13110:19;;12769:366;;;:::o;13141:::-;13283:3;13304:67;13368:2;13363:3;13304:67;:::i;:::-;13297:74;;13380:93;13469:3;13380:93;:::i;:::-;13498:2;13493:3;13489:12;13482:19;;13141:366;;;:::o;13513:::-;13655:3;13676:67;13740:2;13735:3;13676:67;:::i;:::-;13669:74;;13752:93;13841:3;13752:93;:::i;:::-;13870:2;13865:3;13861:12;13854:19;;13513:366;;;:::o;13885:::-;14027:3;14048:67;14112:2;14107:3;14048:67;:::i;:::-;14041:74;;14124:93;14213:3;14124:93;:::i;:::-;14242:2;14237:3;14233:12;14226:19;;13885:366;;;:::o;14257:::-;14399:3;14420:67;14484:2;14479:3;14420:67;:::i;:::-;14413:74;;14496:93;14585:3;14496:93;:::i;:::-;14614:2;14609:3;14605:12;14598:19;;14257:366;;;:::o;14629:::-;14771:3;14792:67;14856:2;14851:3;14792:67;:::i;:::-;14785:74;;14868:93;14957:3;14868:93;:::i;:::-;14986:2;14981:3;14977:12;14970:19;;14629:366;;;:::o;15001:::-;15143:3;15164:67;15228:2;15223:3;15164:67;:::i;:::-;15157:74;;15240:93;15329:3;15240:93;:::i;:::-;15358:2;15353:3;15349:12;15342:19;;15001:366;;;:::o;15373:::-;15515:3;15536:67;15600:2;15595:3;15536:67;:::i;:::-;15529:74;;15612:93;15701:3;15612:93;:::i;:::-;15730:2;15725:3;15721:12;15714:19;;15373:366;;;:::o;15745:::-;15887:3;15908:67;15972:2;15967:3;15908:67;:::i;:::-;15901:74;;15984:93;16073:3;15984:93;:::i;:::-;16102:2;16097:3;16093:12;16086:19;;15745:366;;;:::o;16117:::-;16259:3;16280:67;16344:2;16339:3;16280:67;:::i;:::-;16273:74;;16356:93;16445:3;16356:93;:::i;:::-;16474:2;16469:3;16465:12;16458:19;;16117:366;;;:::o;16489:::-;16631:3;16652:67;16716:2;16711:3;16652:67;:::i;:::-;16645:74;;16728:93;16817:3;16728:93;:::i;:::-;16846:2;16841:3;16837:12;16830:19;;16489:366;;;:::o;16861:::-;17003:3;17024:67;17088:2;17083:3;17024:67;:::i;:::-;17017:74;;17100:93;17189:3;17100:93;:::i;:::-;17218:2;17213:3;17209:12;17202:19;;16861:366;;;:::o;17233:::-;17375:3;17396:67;17460:2;17455:3;17396:67;:::i;:::-;17389:74;;17472:93;17561:3;17472:93;:::i;:::-;17590:2;17585:3;17581:12;17574:19;;17233:366;;;:::o;17605:::-;17747:3;17768:67;17832:2;17827:3;17768:67;:::i;:::-;17761:74;;17844:93;17933:3;17844:93;:::i;:::-;17962:2;17957:3;17953:12;17946:19;;17605:366;;;:::o;17977:::-;18119:3;18140:67;18204:2;18199:3;18140:67;:::i;:::-;18133:74;;18216:93;18305:3;18216:93;:::i;:::-;18334:2;18329:3;18325:12;18318:19;;17977:366;;;:::o;18349:::-;18491:3;18512:67;18576:2;18571:3;18512:67;:::i;:::-;18505:74;;18588:93;18677:3;18588:93;:::i;:::-;18706:2;18701:3;18697:12;18690:19;;18349:366;;;:::o;18721:::-;18863:3;18884:67;18948:2;18943:3;18884:67;:::i;:::-;18877:74;;18960:93;19049:3;18960:93;:::i;:::-;19078:2;19073:3;19069:12;19062:19;;18721:366;;;:::o;19093:::-;19235:3;19256:67;19320:2;19315:3;19256:67;:::i;:::-;19249:74;;19332:93;19421:3;19332:93;:::i;:::-;19450:2;19445:3;19441:12;19434:19;;19093:366;;;:::o;19465:::-;19607:3;19628:67;19692:2;19687:3;19628:67;:::i;:::-;19621:74;;19704:93;19793:3;19704:93;:::i;:::-;19822:2;19817:3;19813:12;19806:19;;19465:366;;;:::o;19837:::-;19979:3;20000:67;20064:2;20059:3;20000:67;:::i;:::-;19993:74;;20076:93;20165:3;20076:93;:::i;:::-;20194:2;20189:3;20185:12;20178:19;;19837:366;;;:::o;20209:::-;20351:3;20372:67;20436:2;20431:3;20372:67;:::i;:::-;20365:74;;20448:93;20537:3;20448:93;:::i;:::-;20566:2;20561:3;20557:12;20550:19;;20209:366;;;:::o;20581:::-;20723:3;20744:67;20808:2;20803:3;20744:67;:::i;:::-;20737:74;;20820:93;20909:3;20820:93;:::i;:::-;20938:2;20933:3;20929:12;20922:19;;20581:366;;;:::o;20953:::-;21095:3;21116:67;21180:2;21175:3;21116:67;:::i;:::-;21109:74;;21192:93;21281:3;21192:93;:::i;:::-;21310:2;21305:3;21301:12;21294:19;;20953:366;;;:::o;21325:118::-;21412:24;21430:5;21412:24;:::i;:::-;21407:3;21400:37;21325:118;;:::o;21449:112::-;21532:22;21548:5;21532:22;:::i;:::-;21527:3;21520:35;21449:112;;:::o;21567:583::-;21789:3;21811:93;21900:3;21891:6;21811:93;:::i;:::-;21804:100;;21921:93;22010:3;22001:6;21921:93;:::i;:::-;21914:100;;22031:93;22120:3;22111:6;22031:93;:::i;:::-;22024:100;;22141:3;22134:10;;21567:583;;;;;;:::o;22156:435::-;22336:3;22358:95;22449:3;22440:6;22358:95;:::i;:::-;22351:102;;22470:95;22561:3;22552:6;22470:95;:::i;:::-;22463:102;;22582:3;22575:10;;22156:435;;;;;:::o;22597:222::-;22690:4;22728:2;22717:9;22713:18;22705:26;;22741:71;22809:1;22798:9;22794:17;22785:6;22741:71;:::i;:::-;22597:222;;;;:::o;22825:640::-;23020:4;23058:3;23047:9;23043:19;23035:27;;23072:71;23140:1;23129:9;23125:17;23116:6;23072:71;:::i;:::-;23153:72;23221:2;23210:9;23206:18;23197:6;23153:72;:::i;:::-;23235;23303:2;23292:9;23288:18;23279:6;23235:72;:::i;:::-;23354:9;23348:4;23344:20;23339:2;23328:9;23324:18;23317:48;23382:76;23453:4;23444:6;23382:76;:::i;:::-;23374:84;;22825:640;;;;;;;:::o;23471:210::-;23558:4;23596:2;23585:9;23581:18;23573:26;;23609:65;23671:1;23660:9;23656:17;23647:6;23609:65;:::i;:::-;23471:210;;;;:::o;23687:313::-;23800:4;23838:2;23827:9;23823:18;23815:26;;23887:9;23881:4;23877:20;23873:1;23862:9;23858:17;23851:47;23915:78;23988:4;23979:6;23915:78;:::i;:::-;23907:86;;23687:313;;;;:::o;24006:419::-;24172:4;24210:2;24199:9;24195:18;24187:26;;24259:9;24253:4;24249:20;24245:1;24234:9;24230:17;24223:47;24287:131;24413:4;24287:131;:::i;:::-;24279:139;;24006:419;;;:::o;24431:::-;24597:4;24635:2;24624:9;24620:18;24612:26;;24684:9;24678:4;24674:20;24670:1;24659:9;24655:17;24648:47;24712:131;24838:4;24712:131;:::i;:::-;24704:139;;24431:419;;;:::o;24856:::-;25022:4;25060:2;25049:9;25045:18;25037:26;;25109:9;25103:4;25099:20;25095:1;25084:9;25080:17;25073:47;25137:131;25263:4;25137:131;:::i;:::-;25129:139;;24856:419;;;:::o;25281:::-;25447:4;25485:2;25474:9;25470:18;25462:26;;25534:9;25528:4;25524:20;25520:1;25509:9;25505:17;25498:47;25562:131;25688:4;25562:131;:::i;:::-;25554:139;;25281:419;;;:::o;25706:::-;25872:4;25910:2;25899:9;25895:18;25887:26;;25959:9;25953:4;25949:20;25945:1;25934:9;25930:17;25923:47;25987:131;26113:4;25987:131;:::i;:::-;25979:139;;25706:419;;;:::o;26131:::-;26297:4;26335:2;26324:9;26320:18;26312:26;;26384:9;26378:4;26374:20;26370:1;26359:9;26355:17;26348:47;26412:131;26538:4;26412:131;:::i;:::-;26404:139;;26131:419;;;:::o;26556:::-;26722:4;26760:2;26749:9;26745:18;26737:26;;26809:9;26803:4;26799:20;26795:1;26784:9;26780:17;26773:47;26837:131;26963:4;26837:131;:::i;:::-;26829:139;;26556:419;;;:::o;26981:::-;27147:4;27185:2;27174:9;27170:18;27162:26;;27234:9;27228:4;27224:20;27220:1;27209:9;27205:17;27198:47;27262:131;27388:4;27262:131;:::i;:::-;27254:139;;26981:419;;;:::o;27406:::-;27572:4;27610:2;27599:9;27595:18;27587:26;;27659:9;27653:4;27649:20;27645:1;27634:9;27630:17;27623:47;27687:131;27813:4;27687:131;:::i;:::-;27679:139;;27406:419;;;:::o;27831:::-;27997:4;28035:2;28024:9;28020:18;28012:26;;28084:9;28078:4;28074:20;28070:1;28059:9;28055:17;28048:47;28112:131;28238:4;28112:131;:::i;:::-;28104:139;;27831:419;;;:::o;28256:::-;28422:4;28460:2;28449:9;28445:18;28437:26;;28509:9;28503:4;28499:20;28495:1;28484:9;28480:17;28473:47;28537:131;28663:4;28537:131;:::i;:::-;28529:139;;28256:419;;;:::o;28681:::-;28847:4;28885:2;28874:9;28870:18;28862:26;;28934:9;28928:4;28924:20;28920:1;28909:9;28905:17;28898:47;28962:131;29088:4;28962:131;:::i;:::-;28954:139;;28681:419;;;:::o;29106:::-;29272:4;29310:2;29299:9;29295:18;29287:26;;29359:9;29353:4;29349:20;29345:1;29334:9;29330:17;29323:47;29387:131;29513:4;29387:131;:::i;:::-;29379:139;;29106:419;;;:::o;29531:::-;29697:4;29735:2;29724:9;29720:18;29712:26;;29784:9;29778:4;29774:20;29770:1;29759:9;29755:17;29748:47;29812:131;29938:4;29812:131;:::i;:::-;29804:139;;29531:419;;;:::o;29956:::-;30122:4;30160:2;30149:9;30145:18;30137:26;;30209:9;30203:4;30199:20;30195:1;30184:9;30180:17;30173:47;30237:131;30363:4;30237:131;:::i;:::-;30229:139;;29956:419;;;:::o;30381:::-;30547:4;30585:2;30574:9;30570:18;30562:26;;30634:9;30628:4;30624:20;30620:1;30609:9;30605:17;30598:47;30662:131;30788:4;30662:131;:::i;:::-;30654:139;;30381:419;;;:::o;30806:::-;30972:4;31010:2;30999:9;30995:18;30987:26;;31059:9;31053:4;31049:20;31045:1;31034:9;31030:17;31023:47;31087:131;31213:4;31087:131;:::i;:::-;31079:139;;30806:419;;;:::o;31231:::-;31397:4;31435:2;31424:9;31420:18;31412:26;;31484:9;31478:4;31474:20;31470:1;31459:9;31455:17;31448:47;31512:131;31638:4;31512:131;:::i;:::-;31504:139;;31231:419;;;:::o;31656:::-;31822:4;31860:2;31849:9;31845:18;31837:26;;31909:9;31903:4;31899:20;31895:1;31884:9;31880:17;31873:47;31937:131;32063:4;31937:131;:::i;:::-;31929:139;;31656:419;;;:::o;32081:::-;32247:4;32285:2;32274:9;32270:18;32262:26;;32334:9;32328:4;32324:20;32320:1;32309:9;32305:17;32298:47;32362:131;32488:4;32362:131;:::i;:::-;32354:139;;32081:419;;;:::o;32506:::-;32672:4;32710:2;32699:9;32695:18;32687:26;;32759:9;32753:4;32749:20;32745:1;32734:9;32730:17;32723:47;32787:131;32913:4;32787:131;:::i;:::-;32779:139;;32506:419;;;:::o;32931:::-;33097:4;33135:2;33124:9;33120:18;33112:26;;33184:9;33178:4;33174:20;33170:1;33159:9;33155:17;33148:47;33212:131;33338:4;33212:131;:::i;:::-;33204:139;;32931:419;;;:::o;33356:::-;33522:4;33560:2;33549:9;33545:18;33537:26;;33609:9;33603:4;33599:20;33595:1;33584:9;33580:17;33573:47;33637:131;33763:4;33637:131;:::i;:::-;33629:139;;33356:419;;;:::o;33781:::-;33947:4;33985:2;33974:9;33970:18;33962:26;;34034:9;34028:4;34024:20;34020:1;34009:9;34005:17;33998:47;34062:131;34188:4;34062:131;:::i;:::-;34054:139;;33781:419;;;:::o;34206:::-;34372:4;34410:2;34399:9;34395:18;34387:26;;34459:9;34453:4;34449:20;34445:1;34434:9;34430:17;34423:47;34487:131;34613:4;34487:131;:::i;:::-;34479:139;;34206:419;;;:::o;34631:::-;34797:4;34835:2;34824:9;34820:18;34812:26;;34884:9;34878:4;34874:20;34870:1;34859:9;34855:17;34848:47;34912:131;35038:4;34912:131;:::i;:::-;34904:139;;34631:419;;;:::o;35056:222::-;35149:4;35187:2;35176:9;35172:18;35164:26;;35200:71;35268:1;35257:9;35253:17;35244:6;35200:71;:::i;:::-;35056:222;;;;:::o;35284:214::-;35373:4;35411:2;35400:9;35396:18;35388:26;;35424:67;35488:1;35477:9;35473:17;35464:6;35424:67;:::i;:::-;35284:214;;;;:::o;35504:129::-;35538:6;35565:20;;:::i;:::-;35555:30;;35594:33;35622:4;35614:6;35594:33;:::i;:::-;35504:129;;;:::o;35639:75::-;35672:6;35705:2;35699:9;35689:19;;35639:75;:::o;35720:307::-;35781:4;35871:18;35863:6;35860:30;35857:56;;;35893:18;;:::i;:::-;35857:56;35931:29;35953:6;35931:29;:::i;:::-;35923:37;;36015:4;36009;36005:15;35997:23;;35720:307;;;:::o;36033:308::-;36095:4;36185:18;36177:6;36174:30;36171:56;;;36207:18;;:::i;:::-;36171:56;36245:29;36267:6;36245:29;:::i;:::-;36237:37;;36329:4;36323;36319:15;36311:23;;36033:308;;;:::o;36347:98::-;36398:6;36432:5;36426:12;36416:22;;36347:98;;;:::o;36451:99::-;36503:6;36537:5;36531:12;36521:22;;36451:99;;;:::o;36556:168::-;36639:11;36673:6;36668:3;36661:19;36713:4;36708:3;36704:14;36689:29;;36556:168;;;;:::o;36730:147::-;36831:11;36868:3;36853:18;;36730:147;;;;:::o;36883:169::-;36967:11;37001:6;36996:3;36989:19;37041:4;37036:3;37032:14;37017:29;;36883:169;;;;:::o;37058:148::-;37160:11;37197:3;37182:18;;37058:148;;;;:::o;37212:305::-;37252:3;37271:20;37289:1;37271:20;:::i;:::-;37266:25;;37305:20;37323:1;37305:20;:::i;:::-;37300:25;;37459:1;37391:66;37387:74;37384:1;37381:81;37378:107;;;37465:18;;:::i;:::-;37378:107;37509:1;37506;37502:9;37495:16;;37212:305;;;;:::o;37523:237::-;37561:3;37580:18;37596:1;37580:18;:::i;:::-;37575:23;;37612:18;37628:1;37612:18;:::i;:::-;37607:23;;37702:1;37696:4;37692:12;37689:1;37686:19;37683:45;;;37708:18;;:::i;:::-;37683:45;37752:1;37749;37745:9;37738:16;;37523:237;;;;:::o;37766:185::-;37806:1;37823:20;37841:1;37823:20;:::i;:::-;37818:25;;37857:20;37875:1;37857:20;:::i;:::-;37852:25;;37896:1;37886:35;;37901:18;;:::i;:::-;37886:35;37943:1;37940;37936:9;37931:14;;37766:185;;;;:::o;37957:348::-;37997:7;38020:20;38038:1;38020:20;:::i;:::-;38015:25;;38054:20;38072:1;38054:20;:::i;:::-;38049:25;;38242:1;38174:66;38170:74;38167:1;38164:81;38159:1;38152:9;38145:17;38141:105;38138:131;;;38249:18;;:::i;:::-;38138:131;38297:1;38294;38290:9;38279:20;;37957:348;;;;:::o;38311:191::-;38351:4;38371:20;38389:1;38371:20;:::i;:::-;38366:25;;38405:20;38423:1;38405:20;:::i;:::-;38400:25;;38444:1;38441;38438:8;38435:34;;;38449:18;;:::i;:::-;38435:34;38494:1;38491;38487:9;38479:17;;38311:191;;;;:::o;38508:185::-;38546:4;38566:18;38582:1;38566:18;:::i;:::-;38561:23;;38598:18;38614:1;38598:18;:::i;:::-;38593:23;;38635:1;38632;38629:8;38626:34;;;38640:18;;:::i;:::-;38626:34;38685:1;38682;38678:9;38670:17;;38508:185;;;;:::o;38699:96::-;38736:7;38765:24;38783:5;38765:24;:::i;:::-;38754:35;;38699:96;;;:::o;38801:90::-;38835:7;38878:5;38871:13;38864:21;38853:32;;38801:90;;;:::o;38897:149::-;38933:7;38973:66;38966:5;38962:78;38951:89;;38897:149;;;:::o;39052:126::-;39089:7;39129:42;39122:5;39118:54;39107:65;;39052:126;;;:::o;39184:77::-;39221:7;39250:5;39239:16;;39184:77;;;:::o;39267:86::-;39302:7;39342:4;39335:5;39331:16;39320:27;;39267:86;;;:::o;39359:154::-;39443:6;39438:3;39433;39420:30;39505:1;39496:6;39491:3;39487:16;39480:27;39359:154;;;:::o;39519:307::-;39587:1;39597:113;39611:6;39608:1;39605:13;39597:113;;;39696:1;39691:3;39687:11;39681:18;39677:1;39672:3;39668:11;39661:39;39633:2;39630:1;39626:10;39621:15;;39597:113;;;39728:6;39725:1;39722:13;39719:101;;;39808:1;39799:6;39794:3;39790:16;39783:27;39719:101;39568:258;39519:307;;;:::o;39832:320::-;39876:6;39913:1;39907:4;39903:12;39893:22;;39960:1;39954:4;39950:12;39981:18;39971:81;;40037:4;40029:6;40025:17;40015:27;;39971:81;40099:2;40091:6;40088:14;40068:18;40065:38;40062:84;;;40118:18;;:::i;:::-;40062:84;39883:269;39832:320;;;:::o;40158:281::-;40241:27;40263:4;40241:27;:::i;:::-;40233:6;40229:40;40371:6;40359:10;40356:22;40335:18;40323:10;40320:34;40317:62;40314:88;;;40382:18;;:::i;:::-;40314:88;40422:10;40418:2;40411:22;40201:238;40158:281;;:::o;40445:233::-;40484:3;40507:24;40525:5;40507:24;:::i;:::-;40498:33;;40553:66;40546:5;40543:77;40540:103;;;40623:18;;:::i;:::-;40540:103;40670:1;40663:5;40659:13;40652:20;;40445:233;;;:::o;40684:176::-;40716:1;40733:20;40751:1;40733:20;:::i;:::-;40728:25;;40767:20;40785:1;40767:20;:::i;:::-;40762:25;;40806:1;40796:35;;40811:18;;:::i;:::-;40796:35;40852:1;40849;40845:9;40840:14;;40684:176;;;;:::o;40866:180::-;40914:77;40911:1;40904:88;41011:4;41008:1;41001:15;41035:4;41032:1;41025:15;41052:180;41100:77;41097:1;41090:88;41197:4;41194:1;41187:15;41221:4;41218:1;41211:15;41238:180;41286:77;41283:1;41276:88;41383:4;41380:1;41373:15;41407:4;41404:1;41397:15;41424:180;41472:77;41469:1;41462:88;41569:4;41566:1;41559:15;41593:4;41590:1;41583:15;41610:180;41658:77;41655:1;41648:88;41755:4;41752:1;41745:15;41779:4;41776:1;41769:15;41796:180;41844:77;41841:1;41834:88;41941:4;41938:1;41931:15;41965:4;41962:1;41955:15;41982:117;42091:1;42088;42081:12;42105:117;42214:1;42211;42204:12;42228:117;42337:1;42334;42327:12;42351:117;42460:1;42457;42450:12;42474:117;42583:1;42580;42573:12;42597:117;42706:1;42703;42696:12;42720:102;42761:6;42812:2;42808:7;42803:2;42796:5;42792:14;42788:28;42778:38;;42720:102;;;:::o;42828:230::-;42968:34;42964:1;42956:6;42952:14;42945:58;43037:13;43032:2;43024:6;43020:15;43013:38;42828:230;:::o;43064:237::-;43204:34;43200:1;43192:6;43188:14;43181:58;43273:20;43268:2;43260:6;43256:15;43249:45;43064:237;:::o;43307:225::-;43447:34;43443:1;43435:6;43431:14;43424:58;43516:8;43511:2;43503:6;43499:15;43492:33;43307:225;:::o;43538:182::-;43678:34;43674:1;43666:6;43662:14;43655:58;43538:182;:::o;43726:178::-;43866:30;43862:1;43854:6;43850:14;43843:54;43726:178;:::o;43910:223::-;44050:34;44046:1;44038:6;44034:14;44027:58;44119:6;44114:2;44106:6;44102:15;44095:31;43910:223;:::o;44139:175::-;44279:27;44275:1;44267:6;44263:14;44256:51;44139:175;:::o;44320:181::-;44460:33;44456:1;44448:6;44444:14;44437:57;44320:181;:::o;44507:231::-;44647:34;44643:1;44635:6;44631:14;44624:58;44716:14;44711:2;44703:6;44699:15;44692:39;44507:231;:::o;44744:243::-;44884:34;44880:1;44872:6;44868:14;44861:58;44953:26;44948:2;44940:6;44936:15;44929:51;44744:243;:::o;44993:229::-;45133:34;45129:1;45121:6;45117:14;45110:58;45202:12;45197:2;45189:6;45185:15;45178:37;44993:229;:::o;45228:228::-;45368:34;45364:1;45356:6;45352:14;45345:58;45437:11;45432:2;45424:6;45420:15;45413:36;45228:228;:::o;45462:233::-;45602:34;45598:1;45590:6;45586:14;45579:58;45671:16;45666:2;45658:6;45654:15;45647:41;45462:233;:::o;45701:182::-;45841:34;45837:1;45829:6;45825:14;45818:58;45701:182;:::o;45889:236::-;46029:34;46025:1;46017:6;46013:14;46006:58;46098:19;46093:2;46085:6;46081:15;46074:44;45889:236;:::o;46131:231::-;46271:34;46267:1;46259:6;46255:14;46248:58;46340:14;46335:2;46327:6;46323:15;46316:39;46131:231;:::o;46368:182::-;46508:34;46504:1;46496:6;46492:14;46485:58;46368:182;:::o;46556:228::-;46696:34;46692:1;46684:6;46680:14;46673:58;46765:11;46760:2;46752:6;46748:15;46741:36;46556:228;:::o;46790:234::-;46930:34;46926:1;46918:6;46914:14;46907:58;46999:17;46994:2;46986:6;46982:15;46975:42;46790:234;:::o;47030:221::-;47170:34;47166:1;47158:6;47154:14;47147:58;47239:4;47234:2;47226:6;47222:15;47215:29;47030:221;:::o;47257:220::-;47397:34;47393:1;47385:6;47381:14;47374:58;47466:3;47461:2;47453:6;47449:15;47442:28;47257:220;:::o;47483:177::-;47623:29;47619:1;47611:6;47607:14;47600:53;47483:177;:::o;47666:221::-;47806:34;47802:1;47794:6;47790:14;47783:58;47875:4;47870:2;47862:6;47858:15;47851:29;47666:221;:::o;47893:236::-;48033:34;48029:1;48021:6;48017:14;48010:58;48102:19;48097:2;48089:6;48085:15;48078:44;47893:236;:::o;48135:231::-;48275:34;48271:1;48263:6;48259:14;48252:58;48344:14;48339:2;48331:6;48327:15;48320:39;48135:231;:::o;48372:174::-;48512:26;48508:1;48500:6;48496:14;48489:50;48372:174;:::o;48552:122::-;48625:24;48643:5;48625:24;:::i;:::-;48618:5;48615:35;48605:63;;48664:1;48661;48654:12;48605:63;48552:122;:::o;48680:116::-;48750:21;48765:5;48750:21;:::i;:::-;48743:5;48740:32;48730:60;;48786:1;48783;48776:12;48730:60;48680:116;:::o;48802:120::-;48874:23;48891:5;48874:23;:::i;:::-;48867:5;48864:34;48854:62;;48912:1;48909;48902:12;48854:62;48802:120;:::o;48928:122::-;49001:24;49019:5;49001:24;:::i;:::-;48994:5;48991:35;48981:63;;49040:1;49037;49030:12;48981:63;48928:122;:::o;49056:118::-;49127:22;49143:5;49127:22;:::i;:::-;49120:5;49117:33;49107:61;;49164:1;49161;49154:12;49107:61;49056:118;:::o
Swarm Source
ipfs://745a9cd3a0add13406591f9ef9977050f0ed09fd037b74df0bd94808659f4526
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.