ERC-721
Overview
Max Total Supply
118 FS360
Holders
108
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 FS360Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Source Code Verified (Exact Match)
Contract Name:
Metanoise
Compiler Version
v0.8.13+commit.abaa5c0e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-05-17 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.13; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File @openzeppelin/contracts/token/ERC721/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File @openzeppelin/contracts/token/ERC721/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File @openzeppelin/contracts/utils/introspection/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) /** * @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 erc721a/contracts/[email protected] // Creator: Chiru Labs error ApprovalCallerNotOwnerNorApproved(); error ApprovalQueryForNonexistentToken(); error ApproveToCaller(); error ApprovalToCurrentOwner(); error BalanceQueryForZeroAddress(); error MintToZeroAddress(); error MintZeroQuantity(); error OwnerQueryForNonexistentToken(); error TransferCallerNotOwnerNorApproved(); error TransferFromIncorrectOwner(); error TransferToNonERC721ReceiverImplementer(); error TransferToZeroAddress(); error URIQueryForNonexistentToken(); /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..). * * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Compiler will pack this into a single 256bit word. struct TokenOwnership { // The address of the owner. address addr; // Keeps track of the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; } // Compiler will pack this into a single 256bit word. struct AddressData { // Realistically, 2**64-1 is more than enough. uint64 balance; // Keeps track of mint count with minimal overhead for tokenomics. uint64 numberMinted; // Keeps track of burn count with minimal overhead for tokenomics. uint64 numberBurned; // For miscellaneous variable(s) pertaining to the address // (e.g. number of whitelist mint slots used). // If there are multiple variables, please pack them into a uint64. uint64 aux; } // The tokenId of the next token to be minted. uint256 internal _currentIndex; // The number of tokens burned. uint256 internal _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. See _ownershipOf implementation for details. mapping(uint256 => TokenOwnership) internal _ownerships; // Mapping owner address to address data mapping(address => AddressData) private _addressData; // 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; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } /** * To change the starting tokenId, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens. */ function totalSupply() public view returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than _currentIndex - _startTokenId() times unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view returns (uint256) { // Counter underflow is impossible as _currentIndex does not decrement, // and it is initialized to _startTokenId() unchecked { return _currentIndex - _startTokenId(); } } /** * @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 override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return uint256(_addressData[owner].balance); } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return uint256(_addressData[owner].numberMinted); } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return uint256(_addressData[owner].numberBurned); } /** * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return _addressData[owner].aux; } /** * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal { _addressData[owner].aux = aux; } /** * Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around in the collection over time. */ function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr && curr < _currentIndex) { TokenOwnership memory ownership = _ownerships[curr]; if (!ownership.burned) { if (ownership.addr != address(0)) { return ownership; } // Invariant: // There will always be an ownership that has an address and is not burned // before an ownership that does not have an address and is not burned. // Hence, curr will not underflow. while (true) { curr--; ownership = _ownerships[curr]; if (ownership.addr != address(0)) { return ownership; } } } } } revert OwnerQueryForNonexistentToken(); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return _ownershipOf(tokenId).addr; } /** * @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) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); 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 override { address owner = ERC721A.ownerOf(tokenId); if (to == owner) revert ApprovalToCurrentOwner(); if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) { revert ApprovalCallerNotOwnerNorApproved(); } _approve(to, tokenId, owner); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { if (operator == _msgSender()) revert ApproveToCaller(); _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 { _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 { _transfer(from, to, tokenId); if (to.isContract() && !_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @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`), */ function _exists(uint256 tokenId) internal view returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && !_ownerships[tokenId].burned; } function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ''); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { _mint(to, quantity, _data, true); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _mint( address to, uint256 quantity, bytes memory _data, bool safe ) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { _addressData[to].balance += uint64(quantity); _addressData[to].numberMinted += uint64(quantity); _ownerships[startTokenId].addr = to; _ownerships[startTokenId].startTimestamp = uint64(block.timestamp); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; if (safe && to.isContract()) { do { emit Transfer(address(0), to, updatedIndex); if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (updatedIndex != end); // Reentrancy protection if (_currentIndex != startTokenId) revert(); } else { do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex != end); } _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Transfers `tokenId` from `from` to `to`. * * 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 ) private { TokenOwnership memory prevOwnership = _ownershipOf(tokenId); if (prevOwnership.addr != from) revert TransferFromIncorrectOwner(); bool isApprovedOrOwner = (_msgSender() == from || isApprovedForAll(from, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, from); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { _addressData[from].balance -= 1; _addressData[to].balance += 1; TokenOwnership storage currSlot = _ownerships[tokenId]; currSlot.addr = to; currSlot.startTimestamp = uint64(block.timestamp); // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; TokenOwnership storage nextSlot = _ownerships[nextTokenId]; if (nextSlot.addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId != _currentIndex) { nextSlot.addr = from; nextSlot.startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev This is equivalent to _burn(tokenId, false) */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { TokenOwnership memory prevOwnership = _ownershipOf(tokenId); address from = prevOwnership.addr; if (approvalCheck) { bool isApprovedOrOwner = (_msgSender() == from || isApprovedForAll(from, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, from); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { AddressData storage addressData = _addressData[from]; addressData.balance -= 1; addressData.numberBurned += 1; // Keep track of who burned the token, and the timestamp of burning. TokenOwnership storage currSlot = _ownerships[tokenId]; currSlot.addr = from; currSlot.startTimestamp = uint64(block.timestamp); currSlot.burned = true; // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; TokenOwnership storage nextSlot = _ownerships[nextTokenId]; if (nextSlot.addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId != _currentIndex) { nextSlot.addr = from; nextSlot.startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve( address to, uint256 tokenId, address owner ) private { _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target 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 _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * And also called before burning one token. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * 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, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes * minting. * And also called after one token has been burned. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} } // File @openzeppelin/contracts/access/[email protected] // OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol) /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {AccessControl-_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) external; /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) external; /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) external; } // File @openzeppelin/contracts/access/[email protected] // OpenZeppelin Contracts (last updated v4.5.0) (access/AccessControl.sol) /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ``` * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ``` * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping(address => bool) members; bytes32 adminRole; } mapping(bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Modifier that checks that an account has a specific role. Reverts * with a standardized message including the required role. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ * * _Available since v4.1._ */ modifier onlyRole(bytes32 role) { _checkRole(role, _msgSender()); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view virtual override returns (bool) { return _roles[role].members[account]; } /** * @dev Revert with a standard message if `account` is missing `role`. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ */ function _checkRole(bytes32 role, address account) internal view virtual { if (!hasRole(role, account)) { revert( string( abi.encodePacked( "AccessControl: account ", Strings.toHexString(uint160(account), 20), " is missing role ", Strings.toHexString(uint256(role), 32) ) ) ); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been revoked `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) public virtual override { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== * * NOTE: This function is deprecated in favor of {_grantRole}. */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { bytes32 previousAdminRole = getRoleAdmin(role); _roles[role].adminRole = adminRole; emit RoleAdminChanged(role, previousAdminRole, adminRole); } /** * @dev Grants `role` to `account`. * * Internal function without access restriction. */ function _grantRole(bytes32 role, address account) internal virtual { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } /** * @dev Revokes `role` from `account`. * * Internal function without access restriction. */ function _revokeRole(bytes32 role, address account) internal virtual { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } // File @openzeppelin/contracts/utils/cryptography/[email protected] // OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/ECDSA.sol) /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS, InvalidSignatureV } function _throwError(RecoverError error) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert("ECDSA: invalid signature"); } else if (error == RecoverError.InvalidSignatureLength) { revert("ECDSA: invalid signature length"); } else if (error == RecoverError.InvalidSignatureS) { revert("ECDSA: invalid signature 's' value"); } else if (error == RecoverError.InvalidSignatureV) { revert("ECDSA: invalid signature 'v' value"); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature` or error string. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { // Check the signature length // - case 65: r,s,v signature (standard) // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._ if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return tryRecover(hash, v, r, s); } else if (signature.length == 64) { bytes32 r; bytes32 vs; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) vs := mload(add(signature, 0x40)) } return tryRecover(hash, r, vs); } else { return (address(0), RecoverError.InvalidSignatureLength); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, signature); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] * * _Available since v4.3._ */ function tryRecover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address, RecoverError) { bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff); uint8 v = uint8((uint256(vs) >> 255) + 27); return tryRecover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately. * * _Available since v4.2._ */ function recover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, r, vs); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `v`, * `r` and `s` signature fields separately. * * _Available since v4.3._ */ function tryRecover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address, RecoverError) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return (address(0), RecoverError.InvalidSignatureS); } if (v != 27 && v != 28) { return (address(0), RecoverError.InvalidSignatureV); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); if (signer == address(0)) { return (address(0), RecoverError.InvalidSignature); } return (signer, RecoverError.NoError); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, v, r, s); _throwError(error); return recovered; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } /** * @dev Returns an Ethereum Signed Message, created from `s`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); } } // File @openzeppelin/contracts/utils/cryptography/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/cryptography/draft-EIP712.sol) /** * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data. * * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible, * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding * they need in their contracts using a combination of `abi.encode` and `keccak256`. * * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA * ({_hashTypedDataV4}). * * The implementation of the domain separator was designed to be as efficient as possible while still properly updating * the chain id to protect against replay attacks on an eventual fork of the chain. * * NOTE: This contract implements the version of the encoding known as "v4", as implemented by the JSON RPC method * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask]. * * _Available since v3.4._ */ abstract contract EIP712 { /* solhint-disable var-name-mixedcase */ // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to // invalidate the cached domain separator if the chain id changes. bytes32 private immutable _CACHED_DOMAIN_SEPARATOR; uint256 private immutable _CACHED_CHAIN_ID; address private immutable _CACHED_THIS; bytes32 private immutable _HASHED_NAME; bytes32 private immutable _HASHED_VERSION; bytes32 private immutable _TYPE_HASH; /* solhint-enable var-name-mixedcase */ /** * @dev Initializes the domain separator and parameter caches. * * The meaning of `name` and `version` is specified in * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]: * * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol. * - `version`: the current major version of the signing domain. * * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart * contract upgrade]. */ constructor(string memory name, string memory version) { bytes32 hashedName = keccak256(bytes(name)); bytes32 hashedVersion = keccak256(bytes(version)); bytes32 typeHash = keccak256( "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)" ); _HASHED_NAME = hashedName; _HASHED_VERSION = hashedVersion; _CACHED_CHAIN_ID = block.chainid; _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion); _CACHED_THIS = address(this); _TYPE_HASH = typeHash; } /** * @dev Returns the domain separator for the current chain. */ function _domainSeparatorV4() internal view returns (bytes32) { if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) { return _CACHED_DOMAIN_SEPARATOR; } else { return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION); } } function _buildDomainSeparator( bytes32 typeHash, bytes32 nameHash, bytes32 versionHash ) private view returns (bytes32) { return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this))); } /** * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this * function returns the hash of the fully encoded EIP712 message for this domain. * * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example: * * ```solidity * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode( * keccak256("Mail(address to,string contents)"), * mailTo, * keccak256(bytes(mailContents)) * ))); * address signer = ECDSA.recover(digest, signature); * ``` */ function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) { return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash); } } // File hardhat/[email protected] library console { address constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67); function _sendLogPayload(bytes memory payload) private view { uint256 payloadLength = payload.length; address consoleAddress = CONSOLE_ADDRESS; assembly { let payloadStart := add(payload, 32) let r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0) } } function log() internal view { _sendLogPayload(abi.encodeWithSignature("log()")); } function logInt(int p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(int)", p0)); } function logUint(uint p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint)", p0)); } function logString(string memory p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); } function logBool(bool p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); } function logAddress(address p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); } function logBytes(bytes memory p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes)", p0)); } function logBytes1(bytes1 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0)); } function logBytes2(bytes2 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0)); } function logBytes3(bytes3 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0)); } function logBytes4(bytes4 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0)); } function logBytes5(bytes5 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0)); } function logBytes6(bytes6 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0)); } function logBytes7(bytes7 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0)); } function logBytes8(bytes8 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0)); } function logBytes9(bytes9 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0)); } function logBytes10(bytes10 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0)); } function logBytes11(bytes11 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0)); } function logBytes12(bytes12 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0)); } function logBytes13(bytes13 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0)); } function logBytes14(bytes14 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0)); } function logBytes15(bytes15 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0)); } function logBytes16(bytes16 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0)); } function logBytes17(bytes17 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0)); } function logBytes18(bytes18 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0)); } function logBytes19(bytes19 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0)); } function logBytes20(bytes20 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0)); } function logBytes21(bytes21 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0)); } function logBytes22(bytes22 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0)); } function logBytes23(bytes23 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0)); } function logBytes24(bytes24 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0)); } function logBytes25(bytes25 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0)); } function logBytes26(bytes26 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0)); } function logBytes27(bytes27 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0)); } function logBytes28(bytes28 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0)); } function logBytes29(bytes29 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0)); } function logBytes30(bytes30 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0)); } function logBytes31(bytes31 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0)); } function logBytes32(bytes32 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0)); } function log(uint p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint)", p0)); } function log(string memory p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); } function log(bool p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); } function log(address p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); } function log(uint p0, uint p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint)", p0, p1)); } function log(uint p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string)", p0, p1)); } function log(uint p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool)", p0, p1)); } function log(uint p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address)", p0, p1)); } function log(string memory p0, uint p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint)", p0, p1)); } function log(string memory p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1)); } function log(string memory p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1)); } function log(string memory p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1)); } function log(bool p0, uint p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint)", p0, p1)); } function log(bool p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1)); } function log(bool p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1)); } function log(bool p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1)); } function log(address p0, uint p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint)", p0, p1)); } function log(address p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1)); } function log(address p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1)); } function log(address p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address)", p0, p1)); } function log(uint p0, uint p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint)", p0, p1, p2)); } function log(uint p0, uint p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string)", p0, p1, p2)); } function log(uint p0, uint p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool)", p0, p1, p2)); } function log(uint p0, uint p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address)", p0, p1, p2)); } function log(uint p0, string memory p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint)", p0, p1, p2)); } function log(uint p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string)", p0, p1, p2)); } function log(uint p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool)", p0, p1, p2)); } function log(uint p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address)", p0, p1, p2)); } function log(uint p0, bool p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint)", p0, p1, p2)); } function log(uint p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string)", p0, p1, p2)); } function log(uint p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool)", p0, p1, p2)); } function log(uint p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address)", p0, p1, p2)); } function log(uint p0, address p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint)", p0, p1, p2)); } function log(uint p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string)", p0, p1, p2)); } function log(uint p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool)", p0, p1, p2)); } function log(uint p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address)", p0, p1, p2)); } function log(string memory p0, uint p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint)", p0, p1, p2)); } function log(string memory p0, uint p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string)", p0, p1, p2)); } function log(string memory p0, uint p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool)", p0, p1, p2)); } function log(string memory p0, uint p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address)", p0, p1, p2)); } function log(string memory p0, string memory p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint)", p0, p1, p2)); } function log(string memory p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2)); } function log(string memory p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2)); } function log(string memory p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2)); } function log(string memory p0, bool p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint)", p0, p1, p2)); } function log(string memory p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2)); } function log(string memory p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2)); } function log(string memory p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2)); } function log(string memory p0, address p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint)", p0, p1, p2)); } function log(string memory p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2)); } function log(string memory p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2)); } function log(string memory p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2)); } function log(bool p0, uint p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint)", p0, p1, p2)); } function log(bool p0, uint p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string)", p0, p1, p2)); } function log(bool p0, uint p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool)", p0, p1, p2)); } function log(bool p0, uint p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address)", p0, p1, p2)); } function log(bool p0, string memory p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint)", p0, p1, p2)); } function log(bool p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2)); } function log(bool p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2)); } function log(bool p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2)); } function log(bool p0, bool p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint)", p0, p1, p2)); } function log(bool p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2)); } function log(bool p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2)); } function log(bool p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2)); } function log(bool p0, address p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint)", p0, p1, p2)); } function log(bool p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2)); } function log(bool p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2)); } function log(bool p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2)); } function log(address p0, uint p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint)", p0, p1, p2)); } function log(address p0, uint p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string)", p0, p1, p2)); } function log(address p0, uint p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool)", p0, p1, p2)); } function log(address p0, uint p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address)", p0, p1, p2)); } function log(address p0, string memory p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint)", p0, p1, p2)); } function log(address p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2)); } function log(address p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2)); } function log(address p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2)); } function log(address p0, bool p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint)", p0, p1, p2)); } function log(address p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2)); } function log(address p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2)); } function log(address p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2)); } function log(address p0, address p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint)", p0, p1, p2)); } function log(address p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2)); } function log(address p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2)); } function log(address p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2)); } function log(uint p0, uint p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,uint)", p0, p1, p2, p3)); } function log(uint p0, uint p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,string)", p0, p1, p2, p3)); } function log(uint p0, uint p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,bool)", p0, p1, p2, p3)); } function log(uint p0, uint p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,address)", p0, p1, p2, p3)); } function log(uint p0, uint p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,uint)", p0, p1, p2, p3)); } function log(uint p0, uint p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,string)", p0, p1, p2, p3)); } function log(uint p0, uint p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,bool)", p0, p1, p2, p3)); } function log(uint p0, uint p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,address)", p0, p1, p2, p3)); } function log(uint p0, uint p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,uint)", p0, p1, p2, p3)); } function log(uint p0, uint p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,string)", p0, p1, p2, p3)); } function log(uint p0, uint p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,bool)", p0, p1, p2, p3)); } function log(uint p0, uint p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,address)", p0, p1, p2, p3)); } function log(uint p0, uint p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,uint)", p0, p1, p2, p3)); } function log(uint p0, uint p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,string)", p0, p1, p2, p3)); } function log(uint p0, uint p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,bool)", p0, p1, p2, p3)); } function log(uint p0, uint p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,address)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,uint)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,string)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,bool)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,address)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,uint)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,string)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,bool)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,address)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,uint)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,string)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,bool)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,address)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,uint)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,string)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,bool)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,address)", p0, p1, p2, p3)); } function log(uint p0, bool p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,uint)", p0, p1, p2, p3)); } function log(uint p0, bool p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,string)", p0, p1, p2, p3)); } function log(uint p0, bool p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,bool)", p0, p1, p2, p3)); } function log(uint p0, bool p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,address)", p0, p1, p2, p3)); } function log(uint p0, bool p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,uint)", p0, p1, p2, p3)); } function log(uint p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,string)", p0, p1, p2, p3)); } function log(uint p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,bool)", p0, p1, p2, p3)); } function log(uint p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,address)", p0, p1, p2, p3)); } function log(uint p0, bool p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,uint)", p0, p1, p2, p3)); } function log(uint p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,string)", p0, p1, p2, p3)); } function log(uint p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,bool)", p0, p1, p2, p3)); } function log(uint p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,address)", p0, p1, p2, p3)); } function log(uint p0, bool p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,uint)", p0, p1, p2, p3)); } function log(uint p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,string)", p0, p1, p2, p3)); } function log(uint p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,bool)", p0, p1, p2, p3)); } function log(uint p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,address)", p0, p1, p2, p3)); } function log(uint p0, address p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,uint)", p0, p1, p2, p3)); } function log(uint p0, address p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,string)", p0, p1, p2, p3)); } function log(uint p0, address p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,bool)", p0, p1, p2, p3)); } function log(uint p0, address p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,address)", p0, p1, p2, p3)); } function log(uint p0, address p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,uint)", p0, p1, p2, p3)); } function log(uint p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,string)", p0, p1, p2, p3)); } function log(uint p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,bool)", p0, p1, p2, p3)); } function log(uint p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,address)", p0, p1, p2, p3)); } function log(uint p0, address p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,uint)", p0, p1, p2, p3)); } function log(uint p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,string)", p0, p1, p2, p3)); } function log(uint p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,bool)", p0, p1, p2, p3)); } function log(uint p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,address)", p0, p1, p2, p3)); } function log(uint p0, address p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,uint)", p0, p1, p2, p3)); } function log(uint p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,string)", p0, p1, p2, p3)); } function log(uint p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,bool)", p0, p1, p2, p3)); } function log(uint p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,address)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,uint)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,string)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,address)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,uint)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,string)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,address)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,uint)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,uint)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,string)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,uint)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,uint)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,uint)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,uint)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,uint)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,uint)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,uint)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,uint)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,uint)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,uint)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,uint)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,uint)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3)); } function log(bool p0, uint p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,uint)", p0, p1, p2, p3)); } function log(bool p0, uint p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,string)", p0, p1, p2, p3)); } function log(bool p0, uint p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,bool)", p0, p1, p2, p3)); } function log(bool p0, uint p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,address)", p0, p1, p2, p3)); } function log(bool p0, uint p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,uint)", p0, p1, p2, p3)); } function log(bool p0, uint p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,string)", p0, p1, p2, p3)); } function log(bool p0, uint p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,bool)", p0, p1, p2, p3)); } function log(bool p0, uint p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,address)", p0, p1, p2, p3)); } function log(bool p0, uint p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,uint)", p0, p1, p2, p3)); } function log(bool p0, uint p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,string)", p0, p1, p2, p3)); } function log(bool p0, uint p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, uint p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,address)", p0, p1, p2, p3)); } function log(bool p0, uint p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,uint)", p0, p1, p2, p3)); } function log(bool p0, uint p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,string)", p0, p1, p2, p3)); } function log(bool p0, uint p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,bool)", p0, p1, p2, p3)); } function log(bool p0, uint p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,uint)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,uint)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,uint)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,uint)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,uint)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,uint)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,uint)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,uint)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3)); } function log(address p0, uint p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,uint)", p0, p1, p2, p3)); } function log(address p0, uint p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,string)", p0, p1, p2, p3)); } function log(address p0, uint p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,bool)", p0, p1, p2, p3)); } function log(address p0, uint p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,address)", p0, p1, p2, p3)); } function log(address p0, uint p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,uint)", p0, p1, p2, p3)); } function log(address p0, uint p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,string)", p0, p1, p2, p3)); } function log(address p0, uint p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,bool)", p0, p1, p2, p3)); } function log(address p0, uint p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,address)", p0, p1, p2, p3)); } function log(address p0, uint p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,uint)", p0, p1, p2, p3)); } function log(address p0, uint p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,string)", p0, p1, p2, p3)); } function log(address p0, uint p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,bool)", p0, p1, p2, p3)); } function log(address p0, uint p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,address)", p0, p1, p2, p3)); } function log(address p0, uint p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,uint)", p0, p1, p2, p3)); } function log(address p0, uint p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,string)", p0, p1, p2, p3)); } function log(address p0, uint p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,bool)", p0, p1, p2, p3)); } function log(address p0, uint p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,uint)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,uint)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,uint)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,uint)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,uint)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,uint)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3)); } function log(address p0, address p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,uint)", p0, p1, p2, p3)); } function log(address p0, address p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,string)", p0, p1, p2, p3)); } function log(address p0, address p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,address)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,uint)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3)); } } // File contracts/Metanoise.sol contract Metanoise is ERC721A, AccessControl, EIP712 { enum State { PublicMint, Paused, SoldOut } //PUBLIC State public STATE; uint256 public MAX_SUPPLY = 360; uint256 public MAX_PER_WALLET = 10; uint256 public MINT_PRICE = 5 ether; //MAPPINGS mapping(bytes32 => address) private _hashes; mapping(address => uint256) private _maxPerWallet; //ROLES bytes32 public constant MINTER_ROLE = keccak256('MINTER_ROLE'); bytes32 public constant OPERATOR_ROLE = keccak256('OPERATOR_ROLE'); bytes32 public constant SIGNER_ROLE = keccak256('SIGNER_ROLE'); bytes32 public constant WITHDRAWER_ROLE = keccak256('WITHDRAWER_ROLE'); //PRIVATE string private baseURI = ''; string private _contractURI; //Errors error StateError(State actual, State expected); error AmountError(); error MaxPerWalletError(); error ValueBelowPriceError(); error MaxSupplyError(); error SignatureError(); error HashAlreadyUsedError(); error ArraySizeError(); error BalanceError(); error WithdrawError(); constructor( string memory name, string memory symbol, string memory version ) ERC721A(name, symbol) EIP712(name, version) { _grantRole(DEFAULT_ADMIN_ROLE, msg.sender); _grantRole(MINTER_ROLE, msg.sender); _grantRole(OPERATOR_ROLE, msg.sender); } function safeMintArray(address[] calldata to, uint256[] calldata amount) external onlyRole(MINTER_ROLE) { if (to.length != amount.length) { revert ArraySizeError(); } for (uint256 i = 0; i < to.length; i++) { _safeMint(to[i], amount[i], ''); } } function safeMint(address to, uint256 amount) external onlyRole(MINTER_ROLE) { _safeMint(to, amount, ''); } function getSigner( address account, uint256 amount, uint256 nonce, bytes calldata signature ) external view returns (address) { bytes32 hash = _hash(account, amount, nonce); return ECDSA.recover(hash, signature); } function getBalance() external view returns (uint256) { return address(this).balance; } function mint( uint256 amount, uint256 nonce, bytes calldata signature ) external payable { if (STATE != State.PublicMint) { revert StateError(STATE, State.PublicMint); } if (amount == 0) { revert AmountError(); } if (msg.value < (MINT_PRICE * amount)) { revert ValueBelowPriceError(); } if (_maxPerWallet[msg.sender] + amount > MAX_PER_WALLET) { revert MaxPerWalletError(); } uint256 currentSupply = totalSupply(); if ((currentSupply + amount) > MAX_SUPPLY) { revert MaxSupplyError(); } bytes32 hash = _hash(msg.sender, amount, nonce); if (!_verify(hash, signature)) { revert SignatureError(); } if (!_verify(hash, signature)) { revert SignatureError(); } if (_hashes[hash] != address(0)) { revert HashAlreadyUsedError(); } _safeMint(msg.sender, amount); _maxPerWallet[msg.sender] = _maxPerWallet[msg.sender] + amount; _hashes[hash] = msg.sender; } function setPrice(uint256 price) external onlyRole(OPERATOR_ROLE) { MINT_PRICE = price; } function setMaxSupply(uint256 maxSupply) external onlyRole(OPERATOR_ROLE) { MAX_SUPPLY = maxSupply; } function getMaxPerWalletPerAccount(address account) external view returns (uint256) { return _maxPerWallet[account]; } function setMaxPerWallet(uint256 maxPerWallet) external onlyRole(OPERATOR_ROLE) { MAX_PER_WALLET = maxPerWallet; } function exists(uint256 tokenId) public view returns (bool) { return super._exists(tokenId); } function _baseURI() internal view override returns (string memory) { return baseURI; } function setBaseURI(string memory _newBaseURI) public onlyRole(OPERATOR_ROLE) { baseURI = _newBaseURI; } function setContractURI(string memory newContractURI) external onlyRole(OPERATOR_ROLE) { _contractURI = newContractURI; } ///Returns the contract URI for OpenSea function contractURI() public view returns (string memory) { return _contractURI; } function _hash( address account, uint256 amount, uint256 nonce ) internal view returns (bytes32) { return _hashTypedDataV4(keccak256(abi.encode(keccak256('NFT(address account,uint256 amount,uint256 nonce)'), account, amount, nonce))); } function _verify(bytes32 digest, bytes memory signature) internal view returns (bool) { return hasRole(SIGNER_ROLE, ECDSA.recover(digest, signature)); } function withdraw() external onlyRole(WITHDRAWER_ROLE) { uint256 balance = address(this).balance; if (balance == 0) { revert BalanceError(); } (bool sent, ) = payable(msg.sender).call{value: balance}(''); if (!sent) { revert WithdrawError(); } } function supportsInterface(bytes4 interfaceId) public view override(ERC721A, AccessControl) returns (bool) { return super.supportsInterface(interfaceId); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"version","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AmountError","type":"error"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"ArraySizeError","type":"error"},{"inputs":[],"name":"BalanceError","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"HashAlreadyUsedError","type":"error"},{"inputs":[],"name":"MaxPerWalletError","type":"error"},{"inputs":[],"name":"MaxSupplyError","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"SignatureError","type":"error"},{"inputs":[{"internalType":"enum Metanoise.State","name":"actual","type":"uint8"},{"internalType":"enum Metanoise.State","name":"expected","type":"uint8"}],"name":"StateError","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ValueBelowPriceError","type":"error"},{"inputs":[],"name":"WithdrawError","type":"error"},{"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":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","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":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PER_WALLET","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":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINT_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OPERATOR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SIGNER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"STATE","outputs":[{"internalType":"enum Metanoise.State","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WITHDRAWER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"getBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getMaxPerWalletPerAccount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"getSigner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","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":"amount","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"safeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"to","type":"address[]"},{"internalType":"uint256[]","name":"amount","type":"uint256[]"}],"name":"safeMintArray","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newContractURI","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxPerWallet","type":"uint256"}],"name":"setMaxPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxSupply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"setPrice","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":"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":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
610140604052610168600a55600a600b55674563918244f40000600c5560405180602001604052806000815250600f9080519060200190620000439291906200039f565b503480156200005157600080fd5b5060405162005681380380620056818339818101604052810190620000779190620005ec565b828184848160029080519060200190620000939291906200039f565b508060039080519060200190620000ac9291906200039f565b50620000bd620001f960201b60201c565b600081905550505060008280519060200120905060008280519060200120905060007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f90508260e081815250508161010081815250504660a081815250506200012e818484620001fe60201b60201c565b608081815250503073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff168152505080610120818152505050505050506200018c6000801b336200023a60201b60201c565b620001be7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6336200023a60201b60201c565b620001f07f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b929336200023a60201b60201c565b505050620007e1565b600090565b600083838346306040516020016200021b95949392919062000720565b6040516020818303038152906040528051906020012090509392505050565b6200024c82826200032c60201b60201c565b620003285760016008600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620002cd6200039760201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b60006008600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600033905090565b828054620003ad90620007ac565b90600052602060002090601f016020900481019282620003d157600085556200041d565b82601f10620003ec57805160ff19168380011785556200041d565b828001600101855582156200041d579182015b828111156200041c578251825591602001919060010190620003ff565b5b5090506200042c919062000430565b5090565b5b808211156200044b57600081600090555060010162000431565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620004b8826200046d565b810181811067ffffffffffffffff82111715620004da57620004d96200047e565b5b80604052505050565b6000620004ef6200044f565b9050620004fd8282620004ad565b919050565b600067ffffffffffffffff82111562000520576200051f6200047e565b5b6200052b826200046d565b9050602081019050919050565b60005b83811015620005585780820151818401526020810190506200053b565b8381111562000568576000848401525b50505050565b6000620005856200057f8462000502565b620004e3565b905082815260208101848484011115620005a457620005a362000468565b5b620005b184828562000538565b509392505050565b600082601f830112620005d157620005d062000463565b5b8151620005e38482602086016200056e565b91505092915050565b60008060006060848603121562000608576200060762000459565b5b600084015167ffffffffffffffff8111156200062957620006286200045e565b5b6200063786828701620005b9565b935050602084015167ffffffffffffffff8111156200065b576200065a6200045e565b5b6200066986828701620005b9565b925050604084015167ffffffffffffffff8111156200068d576200068c6200045e565b5b6200069b86828701620005b9565b9150509250925092565b6000819050919050565b620006ba81620006a5565b82525050565b6000819050919050565b620006d581620006c0565b82525050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200070882620006db565b9050919050565b6200071a81620006fb565b82525050565b600060a082019050620007376000830188620006af565b620007466020830187620006af565b620007556040830186620006af565b620007646060830185620006ca565b6200077360808301846200070f565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620007c557607f821691505b602082108103620007db57620007da6200077d565b5b50919050565b60805160a05160c05160e0516101005161012051614e5062000831600039600061369c015260006136de015260006136bd015260006135f201526000613648015260006136710152614e506000f3fe6080604052600436106102515760003560e01c806385f438c111610139578063c002d23d116100b6578063d53913931161007a578063d5391393146108d9578063d547741f14610904578063e268e4d31461092d578063e8a3d48514610956578063e985e9c514610981578063f5b541a6146109be57610251565b8063c002d23d146107cc578063c486456c146107f7578063c87b56dd14610822578063cb204c5e1461085f578063cd5d49741461089c57610251565b8063a1448194116100fd578063a1448194146106fb578063a1ebf35d14610724578063a217fddf1461074f578063a22cb4651461077a578063b88d4fde146107a357610251565b806385f438c11461061657806391b7f5ed1461064157806391d148541461066a578063938e3d7b146106a757806395d89b41146106d057610251565b80632f2ff15d116101d257806348d6010d1161019657806348d6010d146104e45780634f558e791461050d57806355f804b31461054a5780636352211e146105735780636f8b44b0146105b057806370a08231146105d957610251565b80632f2ff15d1461042757806332cb6b0c1461045057806336568abe1461047b5780633ccfd60b146104a457806342842e0e146104bb57610251565b80630f2cdd6c116102195780630f2cdd6c1461034057806312065fe01461036b57806318160ddd1461039657806323b872dd146103c1578063248a9ca3146103ea57610251565b806301ffc9a71461025657806306fdde0314610293578063081812fc146102be57806308dc9f42146102fb578063095ea7b314610317575b600080fd5b34801561026257600080fd5b5061027d60048036038101906102789190613a32565b6109e9565b60405161028a9190613a7a565b60405180910390f35b34801561029f57600080fd5b506102a86109fb565b6040516102b59190613b2e565b60405180910390f35b3480156102ca57600080fd5b506102e560048036038101906102e09190613b86565b610a8d565b6040516102f29190613bf4565b60405180910390f35b61031560048036038101906103109190613c74565b610b09565b005b34801561032357600080fd5b5061033e60048036038101906103399190613d14565b610f8f565b005b34801561034c57600080fd5b50610355611099565b6040516103629190613d63565b60405180910390f35b34801561037757600080fd5b5061038061109f565b60405161038d9190613d63565b60405180910390f35b3480156103a257600080fd5b506103ab6110a7565b6040516103b89190613d63565b60405180910390f35b3480156103cd57600080fd5b506103e860048036038101906103e39190613d7e565b6110be565b005b3480156103f657600080fd5b50610411600480360381019061040c9190613e07565b6110ce565b60405161041e9190613e43565b60405180910390f35b34801561043357600080fd5b5061044e60048036038101906104499190613e5e565b6110ee565b005b34801561045c57600080fd5b50610465611117565b6040516104729190613d63565b60405180910390f35b34801561048757600080fd5b506104a2600480360381019061049d9190613e5e565b61111d565b005b3480156104b057600080fd5b506104b96111a0565b005b3480156104c757600080fd5b506104e260048036038101906104dd9190613d7e565b6112b9565b005b3480156104f057600080fd5b5061050b60048036038101906105069190613f4a565b6112d9565b005b34801561051957600080fd5b50610534600480360381019061052f9190613b86565b6113cd565b6040516105419190613a7a565b60405180910390f35b34801561055657600080fd5b50610571600480360381019061056c91906140fb565b6113df565b005b34801561057f57600080fd5b5061059a60048036038101906105959190613b86565b61142c565b6040516105a79190613bf4565b60405180910390f35b3480156105bc57600080fd5b506105d760048036038101906105d29190613b86565b611442565b005b3480156105e557600080fd5b5061060060048036038101906105fb9190614144565b61147f565b60405161060d9190613d63565b60405180910390f35b34801561062257600080fd5b5061062b61154e565b6040516106389190613e43565b60405180910390f35b34801561064d57600080fd5b5061066860048036038101906106639190613b86565b611572565b005b34801561067657600080fd5b50610691600480360381019061068c9190613e5e565b6115af565b60405161069e9190613a7a565b60405180910390f35b3480156106b357600080fd5b506106ce60048036038101906106c991906140fb565b61161a565b005b3480156106dc57600080fd5b506106e5611667565b6040516106f29190613b2e565b60405180910390f35b34801561070757600080fd5b50610722600480360381019061071d9190613d14565b6116f9565b005b34801561073057600080fd5b5061073961174a565b6040516107469190613e43565b60405180910390f35b34801561075b57600080fd5b5061076461176e565b6040516107719190613e43565b60405180910390f35b34801561078657600080fd5b506107a1600480360381019061079c919061419d565b611775565b005b3480156107af57600080fd5b506107ca60048036038101906107c5919061427e565b6118ec565b005b3480156107d857600080fd5b506107e1611968565b6040516107ee9190613d63565b60405180910390f35b34801561080357600080fd5b5061080c61196e565b6040516108199190614378565b60405180910390f35b34801561082e57600080fd5b5061084960048036038101906108449190613b86565b611981565b6040516108569190613b2e565b60405180910390f35b34801561086b57600080fd5b5061088660048036038101906108819190614144565b611a1f565b6040516108939190613d63565b60405180910390f35b3480156108a857600080fd5b506108c360048036038101906108be9190614393565b611a68565b6040516108d09190613bf4565b60405180910390f35b3480156108e557600080fd5b506108ee611ad2565b6040516108fb9190613e43565b60405180910390f35b34801561091057600080fd5b5061092b60048036038101906109269190613e5e565b611af6565b005b34801561093957600080fd5b50610954600480360381019061094f9190613b86565b611b1f565b005b34801561096257600080fd5b5061096b611b5c565b6040516109789190613b2e565b60405180910390f35b34801561098d57600080fd5b506109a860048036038101906109a3919061441b565b611bee565b6040516109b59190613a7a565b60405180910390f35b3480156109ca57600080fd5b506109d3611c82565b6040516109e09190613e43565b60405180910390f35b60006109f482611ca6565b9050919050565b606060028054610a0a9061448a565b80601f0160208091040260200160405190810160405280929190818152602001828054610a369061448a565b8015610a835780601f10610a5857610100808354040283529160200191610a83565b820191906000526020600020905b815481529060010190602001808311610a6657829003601f168201915b5050505050905090565b6000610a9882611d20565b610ace576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006002811115610b1d57610b1c614301565b5b600960009054906101000a900460ff166002811115610b3f57610b3e614301565b5b14610b9357600960009054906101000a900460ff1660006040517fca8dc8ed000000000000000000000000000000000000000000000000000000008152600401610b8a9291906144bb565b60405180910390fd5b60008403610bcd576040517f4ff64a9f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83600c54610bdb9190614513565b341015610c14576040517f64975f7000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600b5484600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610c62919061456d565b1115610c9a576040517f916dd30800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610ca46110a7565b9050600a548582610cb5919061456d565b1115610ced576040517ffb72321800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610cfa338787611d6e565b9050610d4a8185858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611dce565b610d80576040517fcd2467c600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610dce8185858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611dce565b610e04576040517fcd2467c600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600d600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610e9d576040517f85ee5abf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ea73387611e0b565b85600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610ef2919061456d565b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555033600d600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050505050565b6000610f9a8261142c565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611001576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16611020611e29565b73ffffffffffffffffffffffffffffffffffffffff161415801561105257506110508161104b611e29565b611bee565b155b15611089576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611094838383611e31565b505050565b600b5481565b600047905090565b60006110b1611ee3565b6001546000540303905090565b6110c9838383611ee8565b505050565b600060086000838152602001908152602001600020600101549050919050565b6110f7826110ce565b61110881611103611e29565b61239c565b6111128383612439565b505050565b600a5481565b611125611e29565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611192576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118990614635565b60405180910390fd5b61119c828261251a565b5050565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e46111d2816111cd611e29565b61239c565b600047905060008103611211576040517fad4ea8a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff168260405161123790614686565b60006040518083038185875af1925050503d8060008114611274576040519150601f19603f3d011682016040523d82523d6000602084013e611279565b606091505b50509050806112b4576040517fd477157400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050565b6112d4838383604051806020016040528060008152506118ec565b505050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a661130b81611306611e29565b61239c565b82829050858590501461134a576040517f7ae8a45c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b858590508110156113c5576113b286868381811061136e5761136d61469b565b5b90506020020160208101906113839190614144565b8585848181106113965761139561469b565b5b90506020020135604051806020016040528060008152506125fc565b80806113bd906146ca565b91505061134d565b505050505050565b60006113d882611d20565b9050919050565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b9296114118161140c611e29565b61239c565b81600f90805190602001906114279291906138e0565b505050565b60006114378261260e565b600001519050919050565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b9296114748161146f611e29565b61239c565b81600a819055505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036114e6576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e481565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b9296115a48161159f611e29565b61239c565b81600c819055505050565b60006008600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b92961164c81611647611e29565b61239c565b81601090805190602001906116629291906138e0565b505050565b6060600380546116769061448a565b80601f01602080910402602001604051908101604052809291908181526020018280546116a29061448a565b80156116ef5780601f106116c4576101008083540402835291602001916116ef565b820191906000526020600020905b8154815290600101906020018083116116d257829003601f168201915b5050505050905090565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a661172b81611726611e29565b61239c565b6117458383604051806020016040528060008152506125fc565b505050565b7fe2f4eaae4a9751e85a3e4a7b9587827a877f29914755229b07a7b2da98285f7081565b6000801b81565b61177d611e29565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036117e1576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006117ee611e29565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661189b611e29565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516118e09190613a7a565b60405180910390a35050565b6118f7848484611ee8565b6119168373ffffffffffffffffffffffffffffffffffffffff1661289d565b801561192b5750611929848484846128c0565b155b15611962576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b600c5481565b600960009054906101000a900460ff1681565b606061198c82611d20565b6119c2576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006119cc612a10565b905060008151036119ec5760405180602001604052806000815250611a17565b806119f684612aa2565b604051602001611a0792919061474e565b6040516020818303038152906040525b915050919050565b6000600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600080611a76878787611d6e565b9050611ac68185858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612c02565b91505095945050505050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b611aff826110ce565b611b1081611b0b611e29565b61239c565b611b1a838361251a565b505050565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b929611b5181611b4c611e29565b61239c565b81600b819055505050565b606060108054611b6b9061448a565b80601f0160208091040260200160405190810160405280929190818152602001828054611b979061448a565b8015611be45780601f10611bb957610100808354040283529160200191611be4565b820191906000526020600020905b815481529060010190602001808311611bc757829003601f168201915b5050505050905090565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b92981565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611d195750611d1882612c29565b5b9050919050565b600081611d2b611ee3565b11158015611d3a575060005482105b8015611d67575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b6000611dc57f9a7c5cc02e83ca93d4cb86c8007b00922a3b7b815c917377d84c06bbd7cf8397858585604051602001611daa9493929190614772565b60405160208183030381529060405280519060200120612d0b565b90509392505050565b6000611e037fe2f4eaae4a9751e85a3e4a7b9587827a877f29914755229b07a7b2da98285f70611dfe8585612c02565b6115af565b905092915050565b611e258282604051806020016040528060008152506125fc565b5050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b6000611ef38261260e565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611f5e576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16611f7f611e29565b73ffffffffffffffffffffffffffffffffffffffff161480611fae5750611fad85611fa8611e29565b611bee565b5b80611ff35750611fbc611e29565b73ffffffffffffffffffffffffffffffffffffffff16611fdb84610a8d565b73ffffffffffffffffffffffffffffffffffffffff16145b90508061202c576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612092576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61209f8585856001612d25565b6120ab60008487611e31565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160361232a57600054821461232957878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46123958585856001612d2b565b5050505050565b6123a682826115af565b612435576123cb8173ffffffffffffffffffffffffffffffffffffffff166014612d31565b6123d98360001c6020612d31565b6040516020016123ea92919061484f565b6040516020818303038152906040526040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242c9190613b2e565b60405180910390fd5b5050565b61244382826115af565b6125165760016008600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506124bb611e29565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b61252482826115af565b156125f85760006008600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061259d611e29565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b6126098383836001612f6d565b505050565b612616613966565b600082905080612624611ee3565b11158015612633575060005481105b15612866576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161286457600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612748578092505050612898565b5b60011561286357818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461285e578092505050612898565b612749565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026128e6611e29565b8786866040518563ffffffff1660e01b815260040161290894939291906148de565b6020604051808303816000875af192505050801561294457506040513d601f19601f82011682018060405250810190612941919061493f565b60015b6129bd573d8060008114612974576040519150601f19603f3d011682016040523d82523d6000602084013e612979565b606091505b5060008151036129b5576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600f8054612a1f9061448a565b80601f0160208091040260200160405190810160405280929190818152602001828054612a4b9061448a565b8015612a985780601f10612a6d57610100808354040283529160200191612a98565b820191906000526020600020905b815481529060010190602001808311612a7b57829003601f168201915b5050505050905090565b606060008203612ae9576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612bfd565b600082905060005b60008214612b1b578080612b04906146ca565b915050600a82612b14919061499b565b9150612af1565b60008167ffffffffffffffff811115612b3757612b36613fd0565b5b6040519080825280601f01601f191660200182016040528015612b695781602001600182028036833780820191505090505b5090505b60008514612bf657600182612b8291906149cc565b9150600a85612b919190614a00565b6030612b9d919061456d565b60f81b818381518110612bb357612bb261469b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612bef919061499b565b9450612b6d565b8093505050505b919050565b6000806000612c118585613337565b91509150612c1e816133b8565b819250505092915050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612cf457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612d045750612d0382613584565b5b9050919050565b6000612d1e612d186135ee565b83613708565b9050919050565b50505050565b50505050565b606060006002836002612d449190614513565b612d4e919061456d565b67ffffffffffffffff811115612d6757612d66613fd0565b5b6040519080825280601f01601f191660200182016040528015612d995781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110612dd157612dd061469b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110612e3557612e3461469b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002612e759190614513565b612e7f919061456d565b90505b6001811115612f1f577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110612ec157612ec061469b565b5b1a60f81b828281518110612ed857612ed761469b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080612f1890614a31565b9050612e82565b5060008414612f63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f5a90614aa6565b60405180910390fd5b8091505092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612fd9576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008403613013576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6130206000868387612d25565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600085820190508380156131ea57506131e98773ffffffffffffffffffffffffffffffffffffffff1661289d565b5b156132af575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461325f60008884806001019550886128c0565b613295576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082036131f05782600054146132aa57600080fd5b61331a565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082036132b0575b8160008190555050506133306000868387612d2b565b5050505050565b60008060418351036133785760008060006020860151925060408601519150606086015160001a905061336c8782858561373b565b945094505050506133b1565b60408351036133a857600080602085015191506040850151905061339d868383613847565b9350935050506133b1565b60006002915091505b9250929050565b600060048111156133cc576133cb614301565b5b8160048111156133df576133de614301565b5b031561358157600160048111156133f9576133f8614301565b5b81600481111561340c5761340b614301565b5b0361344c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161344390614b12565b60405180910390fd5b600260048111156134605761345f614301565b5b81600481111561347357613472614301565b5b036134b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134aa90614b7e565b60405180910390fd5b600360048111156134c7576134c6614301565b5b8160048111156134da576134d9614301565b5b0361351a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161351190614c10565b60405180910390fd5b60048081111561352d5761352c614301565b5b8160048111156135405761353f614301565b5b03613580576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161357790614ca2565b60405180910390fd5b5b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614801561366a57507f000000000000000000000000000000000000000000000000000000000000000046145b15613697577f00000000000000000000000000000000000000000000000000000000000000009050613705565b6137027f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006138a6565b90505b90565b6000828260405160200161371d929190614d2f565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c111561377657600060039150915061383e565b601b8560ff161415801561378e5750601c8560ff1614155b156137a057600060049150915061383e565b6000600187878787604051600081526020016040526040516137c59493929190614d82565b6020604051602081039080840390855afa1580156137e7573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036138355760006001925092505061383e565b80600092509250505b94509492505050565b60008060007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60001b841690506000601b60ff8660001c901c61388a919061456d565b90506138988782888561373b565b935093505050935093915050565b600083838346306040516020016138c1959493929190614dc7565b6040516020818303038152906040528051906020012090509392505050565b8280546138ec9061448a565b90600052602060002090601f01602090048101928261390e5760008555613955565b82601f1061392757805160ff1916838001178555613955565b82800160010185558215613955579182015b82811115613954578251825591602001919060010190613939565b5b50905061396291906139a9565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b808211156139c25760008160009055506001016139aa565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613a0f816139da565b8114613a1a57600080fd5b50565b600081359050613a2c81613a06565b92915050565b600060208284031215613a4857613a476139d0565b5b6000613a5684828501613a1d565b91505092915050565b60008115159050919050565b613a7481613a5f565b82525050565b6000602082019050613a8f6000830184613a6b565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613acf578082015181840152602081019050613ab4565b83811115613ade576000848401525b50505050565b6000601f19601f8301169050919050565b6000613b0082613a95565b613b0a8185613aa0565b9350613b1a818560208601613ab1565b613b2381613ae4565b840191505092915050565b60006020820190508181036000830152613b488184613af5565b905092915050565b6000819050919050565b613b6381613b50565b8114613b6e57600080fd5b50565b600081359050613b8081613b5a565b92915050565b600060208284031215613b9c57613b9b6139d0565b5b6000613baa84828501613b71565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613bde82613bb3565b9050919050565b613bee81613bd3565b82525050565b6000602082019050613c096000830184613be5565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112613c3457613c33613c0f565b5b8235905067ffffffffffffffff811115613c5157613c50613c14565b5b602083019150836001820283011115613c6d57613c6c613c19565b5b9250929050565b60008060008060608587031215613c8e57613c8d6139d0565b5b6000613c9c87828801613b71565b9450506020613cad87828801613b71565b935050604085013567ffffffffffffffff811115613cce57613ccd6139d5565b5b613cda87828801613c1e565b925092505092959194509250565b613cf181613bd3565b8114613cfc57600080fd5b50565b600081359050613d0e81613ce8565b92915050565b60008060408385031215613d2b57613d2a6139d0565b5b6000613d3985828601613cff565b9250506020613d4a85828601613b71565b9150509250929050565b613d5d81613b50565b82525050565b6000602082019050613d786000830184613d54565b92915050565b600080600060608486031215613d9757613d966139d0565b5b6000613da586828701613cff565b9350506020613db686828701613cff565b9250506040613dc786828701613b71565b9150509250925092565b6000819050919050565b613de481613dd1565b8114613def57600080fd5b50565b600081359050613e0181613ddb565b92915050565b600060208284031215613e1d57613e1c6139d0565b5b6000613e2b84828501613df2565b91505092915050565b613e3d81613dd1565b82525050565b6000602082019050613e586000830184613e34565b92915050565b60008060408385031215613e7557613e746139d0565b5b6000613e8385828601613df2565b9250506020613e9485828601613cff565b9150509250929050565b60008083601f840112613eb457613eb3613c0f565b5b8235905067ffffffffffffffff811115613ed157613ed0613c14565b5b602083019150836020820283011115613eed57613eec613c19565b5b9250929050565b60008083601f840112613f0a57613f09613c0f565b5b8235905067ffffffffffffffff811115613f2757613f26613c14565b5b602083019150836020820283011115613f4357613f42613c19565b5b9250929050565b60008060008060408587031215613f6457613f636139d0565b5b600085013567ffffffffffffffff811115613f8257613f816139d5565b5b613f8e87828801613e9e565b9450945050602085013567ffffffffffffffff811115613fb157613fb06139d5565b5b613fbd87828801613ef4565b925092505092959194509250565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61400882613ae4565b810181811067ffffffffffffffff8211171561402757614026613fd0565b5b80604052505050565b600061403a6139c6565b90506140468282613fff565b919050565b600067ffffffffffffffff82111561406657614065613fd0565b5b61406f82613ae4565b9050602081019050919050565b82818337600083830152505050565b600061409e6140998461404b565b614030565b9050828152602081018484840111156140ba576140b9613fcb565b5b6140c584828561407c565b509392505050565b600082601f8301126140e2576140e1613c0f565b5b81356140f284826020860161408b565b91505092915050565b600060208284031215614111576141106139d0565b5b600082013567ffffffffffffffff81111561412f5761412e6139d5565b5b61413b848285016140cd565b91505092915050565b60006020828403121561415a576141596139d0565b5b600061416884828501613cff565b91505092915050565b61417a81613a5f565b811461418557600080fd5b50565b60008135905061419781614171565b92915050565b600080604083850312156141b4576141b36139d0565b5b60006141c285828601613cff565b92505060206141d385828601614188565b9150509250929050565b600067ffffffffffffffff8211156141f8576141f7613fd0565b5b61420182613ae4565b9050602081019050919050565b600061422161421c846141dd565b614030565b90508281526020810184848401111561423d5761423c613fcb565b5b61424884828561407c565b509392505050565b600082601f83011261426557614264613c0f565b5b813561427584826020860161420e565b91505092915050565b60008060008060808587031215614298576142976139d0565b5b60006142a687828801613cff565b94505060206142b787828801613cff565b93505060406142c887828801613b71565b925050606085013567ffffffffffffffff8111156142e9576142e86139d5565b5b6142f587828801614250565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6003811061434157614340614301565b5b50565b600081905061435282614330565b919050565b600061436282614344565b9050919050565b61437281614357565b82525050565b600060208201905061438d6000830184614369565b92915050565b6000806000806000608086880312156143af576143ae6139d0565b5b60006143bd88828901613cff565b95505060206143ce88828901613b71565b94505060406143df88828901613b71565b935050606086013567ffffffffffffffff811115614400576143ff6139d5565b5b61440c88828901613c1e565b92509250509295509295909350565b60008060408385031215614432576144316139d0565b5b600061444085828601613cff565b925050602061445185828601613cff565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806144a257607f821691505b6020821081036144b5576144b461445b565b5b50919050565b60006040820190506144d06000830185614369565b6144dd6020830184614369565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061451e82613b50565b915061452983613b50565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614562576145616144e4565b5b828202905092915050565b600061457882613b50565b915061458383613b50565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156145b8576145b76144e4565b5b828201905092915050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b600061461f602f83613aa0565b915061462a826145c3565b604082019050919050565b6000602082019050818103600083015261464e81614612565b9050919050565b600081905092915050565b50565b6000614670600083614655565b915061467b82614660565b600082019050919050565b600061469182614663565b9150819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006146d582613b50565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614707576147066144e4565b5b600182019050919050565b600081905092915050565b600061472882613a95565b6147328185614712565b9350614742818560208601613ab1565b80840191505092915050565b600061475a828561471d565b9150614766828461471d565b91508190509392505050565b60006080820190506147876000830187613e34565b6147946020830186613be5565b6147a16040830185613d54565b6147ae6060830184613d54565b95945050505050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b60006147ed601783614712565b91506147f8826147b7565b601782019050919050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b6000614839601183614712565b915061484482614803565b601182019050919050565b600061485a826147e0565b9150614866828561471d565b91506148718261482c565b915061487d828461471d565b91508190509392505050565b600081519050919050565b600082825260208201905092915050565b60006148b082614889565b6148ba8185614894565b93506148ca818560208601613ab1565b6148d381613ae4565b840191505092915050565b60006080820190506148f36000830187613be5565b6149006020830186613be5565b61490d6040830185613d54565b818103606083015261491f81846148a5565b905095945050505050565b60008151905061493981613a06565b92915050565b600060208284031215614955576149546139d0565b5b60006149638482850161492a565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006149a682613b50565b91506149b183613b50565b9250826149c1576149c061496c565b5b828204905092915050565b60006149d782613b50565b91506149e283613b50565b9250828210156149f5576149f46144e4565b5b828203905092915050565b6000614a0b82613b50565b9150614a1683613b50565b925082614a2657614a2561496c565b5b828206905092915050565b6000614a3c82613b50565b915060008203614a4f57614a4e6144e4565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b6000614a90602083613aa0565b9150614a9b82614a5a565b602082019050919050565b60006020820190508181036000830152614abf81614a83565b9050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b6000614afc601883613aa0565b9150614b0782614ac6565b602082019050919050565b60006020820190508181036000830152614b2b81614aef565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000614b68601f83613aa0565b9150614b7382614b32565b602082019050919050565b60006020820190508181036000830152614b9781614b5b565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000614bfa602283613aa0565b9150614c0582614b9e565b604082019050919050565b60006020820190508181036000830152614c2981614bed565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000614c8c602283613aa0565b9150614c9782614c30565b604082019050919050565b60006020820190508181036000830152614cbb81614c7f565b9050919050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b6000614cf8600283614712565b9150614d0382614cc2565b600282019050919050565b6000819050919050565b614d29614d2482613dd1565b614d0e565b82525050565b6000614d3a82614ceb565b9150614d468285614d18565b602082019150614d568284614d18565b6020820191508190509392505050565b600060ff82169050919050565b614d7c81614d66565b82525050565b6000608082019050614d976000830187613e34565b614da46020830186614d73565b614db16040830185613e34565b614dbe6060830184613e34565b95945050505050565b600060a082019050614ddc6000830188613e34565b614de96020830187613e34565b614df66040830186613e34565b614e036060830185613d54565b614e106080830184613be5565b969550505050505056fea2646970667358221220a0cf5b986d890096288cc6d9646e47512ea381bf8eea8c8c339d613722dcbafc64736f6c634300080d0033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000094d4554414e4f4953450000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000546533336300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005312e302e30000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106102515760003560e01c806385f438c111610139578063c002d23d116100b6578063d53913931161007a578063d5391393146108d9578063d547741f14610904578063e268e4d31461092d578063e8a3d48514610956578063e985e9c514610981578063f5b541a6146109be57610251565b8063c002d23d146107cc578063c486456c146107f7578063c87b56dd14610822578063cb204c5e1461085f578063cd5d49741461089c57610251565b8063a1448194116100fd578063a1448194146106fb578063a1ebf35d14610724578063a217fddf1461074f578063a22cb4651461077a578063b88d4fde146107a357610251565b806385f438c11461061657806391b7f5ed1461064157806391d148541461066a578063938e3d7b146106a757806395d89b41146106d057610251565b80632f2ff15d116101d257806348d6010d1161019657806348d6010d146104e45780634f558e791461050d57806355f804b31461054a5780636352211e146105735780636f8b44b0146105b057806370a08231146105d957610251565b80632f2ff15d1461042757806332cb6b0c1461045057806336568abe1461047b5780633ccfd60b146104a457806342842e0e146104bb57610251565b80630f2cdd6c116102195780630f2cdd6c1461034057806312065fe01461036b57806318160ddd1461039657806323b872dd146103c1578063248a9ca3146103ea57610251565b806301ffc9a71461025657806306fdde0314610293578063081812fc146102be57806308dc9f42146102fb578063095ea7b314610317575b600080fd5b34801561026257600080fd5b5061027d60048036038101906102789190613a32565b6109e9565b60405161028a9190613a7a565b60405180910390f35b34801561029f57600080fd5b506102a86109fb565b6040516102b59190613b2e565b60405180910390f35b3480156102ca57600080fd5b506102e560048036038101906102e09190613b86565b610a8d565b6040516102f29190613bf4565b60405180910390f35b61031560048036038101906103109190613c74565b610b09565b005b34801561032357600080fd5b5061033e60048036038101906103399190613d14565b610f8f565b005b34801561034c57600080fd5b50610355611099565b6040516103629190613d63565b60405180910390f35b34801561037757600080fd5b5061038061109f565b60405161038d9190613d63565b60405180910390f35b3480156103a257600080fd5b506103ab6110a7565b6040516103b89190613d63565b60405180910390f35b3480156103cd57600080fd5b506103e860048036038101906103e39190613d7e565b6110be565b005b3480156103f657600080fd5b50610411600480360381019061040c9190613e07565b6110ce565b60405161041e9190613e43565b60405180910390f35b34801561043357600080fd5b5061044e60048036038101906104499190613e5e565b6110ee565b005b34801561045c57600080fd5b50610465611117565b6040516104729190613d63565b60405180910390f35b34801561048757600080fd5b506104a2600480360381019061049d9190613e5e565b61111d565b005b3480156104b057600080fd5b506104b96111a0565b005b3480156104c757600080fd5b506104e260048036038101906104dd9190613d7e565b6112b9565b005b3480156104f057600080fd5b5061050b60048036038101906105069190613f4a565b6112d9565b005b34801561051957600080fd5b50610534600480360381019061052f9190613b86565b6113cd565b6040516105419190613a7a565b60405180910390f35b34801561055657600080fd5b50610571600480360381019061056c91906140fb565b6113df565b005b34801561057f57600080fd5b5061059a60048036038101906105959190613b86565b61142c565b6040516105a79190613bf4565b60405180910390f35b3480156105bc57600080fd5b506105d760048036038101906105d29190613b86565b611442565b005b3480156105e557600080fd5b5061060060048036038101906105fb9190614144565b61147f565b60405161060d9190613d63565b60405180910390f35b34801561062257600080fd5b5061062b61154e565b6040516106389190613e43565b60405180910390f35b34801561064d57600080fd5b5061066860048036038101906106639190613b86565b611572565b005b34801561067657600080fd5b50610691600480360381019061068c9190613e5e565b6115af565b60405161069e9190613a7a565b60405180910390f35b3480156106b357600080fd5b506106ce60048036038101906106c991906140fb565b61161a565b005b3480156106dc57600080fd5b506106e5611667565b6040516106f29190613b2e565b60405180910390f35b34801561070757600080fd5b50610722600480360381019061071d9190613d14565b6116f9565b005b34801561073057600080fd5b5061073961174a565b6040516107469190613e43565b60405180910390f35b34801561075b57600080fd5b5061076461176e565b6040516107719190613e43565b60405180910390f35b34801561078657600080fd5b506107a1600480360381019061079c919061419d565b611775565b005b3480156107af57600080fd5b506107ca60048036038101906107c5919061427e565b6118ec565b005b3480156107d857600080fd5b506107e1611968565b6040516107ee9190613d63565b60405180910390f35b34801561080357600080fd5b5061080c61196e565b6040516108199190614378565b60405180910390f35b34801561082e57600080fd5b5061084960048036038101906108449190613b86565b611981565b6040516108569190613b2e565b60405180910390f35b34801561086b57600080fd5b5061088660048036038101906108819190614144565b611a1f565b6040516108939190613d63565b60405180910390f35b3480156108a857600080fd5b506108c360048036038101906108be9190614393565b611a68565b6040516108d09190613bf4565b60405180910390f35b3480156108e557600080fd5b506108ee611ad2565b6040516108fb9190613e43565b60405180910390f35b34801561091057600080fd5b5061092b60048036038101906109269190613e5e565b611af6565b005b34801561093957600080fd5b50610954600480360381019061094f9190613b86565b611b1f565b005b34801561096257600080fd5b5061096b611b5c565b6040516109789190613b2e565b60405180910390f35b34801561098d57600080fd5b506109a860048036038101906109a3919061441b565b611bee565b6040516109b59190613a7a565b60405180910390f35b3480156109ca57600080fd5b506109d3611c82565b6040516109e09190613e43565b60405180910390f35b60006109f482611ca6565b9050919050565b606060028054610a0a9061448a565b80601f0160208091040260200160405190810160405280929190818152602001828054610a369061448a565b8015610a835780601f10610a5857610100808354040283529160200191610a83565b820191906000526020600020905b815481529060010190602001808311610a6657829003601f168201915b5050505050905090565b6000610a9882611d20565b610ace576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006002811115610b1d57610b1c614301565b5b600960009054906101000a900460ff166002811115610b3f57610b3e614301565b5b14610b9357600960009054906101000a900460ff1660006040517fca8dc8ed000000000000000000000000000000000000000000000000000000008152600401610b8a9291906144bb565b60405180910390fd5b60008403610bcd576040517f4ff64a9f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83600c54610bdb9190614513565b341015610c14576040517f64975f7000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600b5484600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610c62919061456d565b1115610c9a576040517f916dd30800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610ca46110a7565b9050600a548582610cb5919061456d565b1115610ced576040517ffb72321800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610cfa338787611d6e565b9050610d4a8185858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611dce565b610d80576040517fcd2467c600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610dce8185858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611dce565b610e04576040517fcd2467c600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600d600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610e9d576040517f85ee5abf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ea73387611e0b565b85600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610ef2919061456d565b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555033600d600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050505050565b6000610f9a8261142c565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611001576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16611020611e29565b73ffffffffffffffffffffffffffffffffffffffff161415801561105257506110508161104b611e29565b611bee565b155b15611089576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611094838383611e31565b505050565b600b5481565b600047905090565b60006110b1611ee3565b6001546000540303905090565b6110c9838383611ee8565b505050565b600060086000838152602001908152602001600020600101549050919050565b6110f7826110ce565b61110881611103611e29565b61239c565b6111128383612439565b505050565b600a5481565b611125611e29565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611192576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118990614635565b60405180910390fd5b61119c828261251a565b5050565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e46111d2816111cd611e29565b61239c565b600047905060008103611211576040517fad4ea8a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff168260405161123790614686565b60006040518083038185875af1925050503d8060008114611274576040519150601f19603f3d011682016040523d82523d6000602084013e611279565b606091505b50509050806112b4576040517fd477157400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050565b6112d4838383604051806020016040528060008152506118ec565b505050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a661130b81611306611e29565b61239c565b82829050858590501461134a576040517f7ae8a45c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b858590508110156113c5576113b286868381811061136e5761136d61469b565b5b90506020020160208101906113839190614144565b8585848181106113965761139561469b565b5b90506020020135604051806020016040528060008152506125fc565b80806113bd906146ca565b91505061134d565b505050505050565b60006113d882611d20565b9050919050565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b9296114118161140c611e29565b61239c565b81600f90805190602001906114279291906138e0565b505050565b60006114378261260e565b600001519050919050565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b9296114748161146f611e29565b61239c565b81600a819055505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036114e6576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e481565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b9296115a48161159f611e29565b61239c565b81600c819055505050565b60006008600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b92961164c81611647611e29565b61239c565b81601090805190602001906116629291906138e0565b505050565b6060600380546116769061448a565b80601f01602080910402602001604051908101604052809291908181526020018280546116a29061448a565b80156116ef5780601f106116c4576101008083540402835291602001916116ef565b820191906000526020600020905b8154815290600101906020018083116116d257829003601f168201915b5050505050905090565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a661172b81611726611e29565b61239c565b6117458383604051806020016040528060008152506125fc565b505050565b7fe2f4eaae4a9751e85a3e4a7b9587827a877f29914755229b07a7b2da98285f7081565b6000801b81565b61177d611e29565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036117e1576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006117ee611e29565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661189b611e29565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516118e09190613a7a565b60405180910390a35050565b6118f7848484611ee8565b6119168373ffffffffffffffffffffffffffffffffffffffff1661289d565b801561192b5750611929848484846128c0565b155b15611962576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b600c5481565b600960009054906101000a900460ff1681565b606061198c82611d20565b6119c2576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006119cc612a10565b905060008151036119ec5760405180602001604052806000815250611a17565b806119f684612aa2565b604051602001611a0792919061474e565b6040516020818303038152906040525b915050919050565b6000600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600080611a76878787611d6e565b9050611ac68185858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612c02565b91505095945050505050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b611aff826110ce565b611b1081611b0b611e29565b61239c565b611b1a838361251a565b505050565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b929611b5181611b4c611e29565b61239c565b81600b819055505050565b606060108054611b6b9061448a565b80601f0160208091040260200160405190810160405280929190818152602001828054611b979061448a565b8015611be45780601f10611bb957610100808354040283529160200191611be4565b820191906000526020600020905b815481529060010190602001808311611bc757829003601f168201915b5050505050905090565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b92981565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611d195750611d1882612c29565b5b9050919050565b600081611d2b611ee3565b11158015611d3a575060005482105b8015611d67575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b6000611dc57f9a7c5cc02e83ca93d4cb86c8007b00922a3b7b815c917377d84c06bbd7cf8397858585604051602001611daa9493929190614772565b60405160208183030381529060405280519060200120612d0b565b90509392505050565b6000611e037fe2f4eaae4a9751e85a3e4a7b9587827a877f29914755229b07a7b2da98285f70611dfe8585612c02565b6115af565b905092915050565b611e258282604051806020016040528060008152506125fc565b5050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b6000611ef38261260e565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611f5e576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16611f7f611e29565b73ffffffffffffffffffffffffffffffffffffffff161480611fae5750611fad85611fa8611e29565b611bee565b5b80611ff35750611fbc611e29565b73ffffffffffffffffffffffffffffffffffffffff16611fdb84610a8d565b73ffffffffffffffffffffffffffffffffffffffff16145b90508061202c576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612092576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61209f8585856001612d25565b6120ab60008487611e31565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160361232a57600054821461232957878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46123958585856001612d2b565b5050505050565b6123a682826115af565b612435576123cb8173ffffffffffffffffffffffffffffffffffffffff166014612d31565b6123d98360001c6020612d31565b6040516020016123ea92919061484f565b6040516020818303038152906040526040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242c9190613b2e565b60405180910390fd5b5050565b61244382826115af565b6125165760016008600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506124bb611e29565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b61252482826115af565b156125f85760006008600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061259d611e29565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b6126098383836001612f6d565b505050565b612616613966565b600082905080612624611ee3565b11158015612633575060005481105b15612866576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161286457600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612748578092505050612898565b5b60011561286357818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461285e578092505050612898565b612749565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026128e6611e29565b8786866040518563ffffffff1660e01b815260040161290894939291906148de565b6020604051808303816000875af192505050801561294457506040513d601f19601f82011682018060405250810190612941919061493f565b60015b6129bd573d8060008114612974576040519150601f19603f3d011682016040523d82523d6000602084013e612979565b606091505b5060008151036129b5576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600f8054612a1f9061448a565b80601f0160208091040260200160405190810160405280929190818152602001828054612a4b9061448a565b8015612a985780601f10612a6d57610100808354040283529160200191612a98565b820191906000526020600020905b815481529060010190602001808311612a7b57829003601f168201915b5050505050905090565b606060008203612ae9576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612bfd565b600082905060005b60008214612b1b578080612b04906146ca565b915050600a82612b14919061499b565b9150612af1565b60008167ffffffffffffffff811115612b3757612b36613fd0565b5b6040519080825280601f01601f191660200182016040528015612b695781602001600182028036833780820191505090505b5090505b60008514612bf657600182612b8291906149cc565b9150600a85612b919190614a00565b6030612b9d919061456d565b60f81b818381518110612bb357612bb261469b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612bef919061499b565b9450612b6d565b8093505050505b919050565b6000806000612c118585613337565b91509150612c1e816133b8565b819250505092915050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612cf457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612d045750612d0382613584565b5b9050919050565b6000612d1e612d186135ee565b83613708565b9050919050565b50505050565b50505050565b606060006002836002612d449190614513565b612d4e919061456d565b67ffffffffffffffff811115612d6757612d66613fd0565b5b6040519080825280601f01601f191660200182016040528015612d995781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110612dd157612dd061469b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110612e3557612e3461469b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002612e759190614513565b612e7f919061456d565b90505b6001811115612f1f577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110612ec157612ec061469b565b5b1a60f81b828281518110612ed857612ed761469b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080612f1890614a31565b9050612e82565b5060008414612f63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f5a90614aa6565b60405180910390fd5b8091505092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612fd9576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008403613013576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6130206000868387612d25565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600085820190508380156131ea57506131e98773ffffffffffffffffffffffffffffffffffffffff1661289d565b5b156132af575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461325f60008884806001019550886128c0565b613295576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082036131f05782600054146132aa57600080fd5b61331a565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082036132b0575b8160008190555050506133306000868387612d2b565b5050505050565b60008060418351036133785760008060006020860151925060408601519150606086015160001a905061336c8782858561373b565b945094505050506133b1565b60408351036133a857600080602085015191506040850151905061339d868383613847565b9350935050506133b1565b60006002915091505b9250929050565b600060048111156133cc576133cb614301565b5b8160048111156133df576133de614301565b5b031561358157600160048111156133f9576133f8614301565b5b81600481111561340c5761340b614301565b5b0361344c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161344390614b12565b60405180910390fd5b600260048111156134605761345f614301565b5b81600481111561347357613472614301565b5b036134b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134aa90614b7e565b60405180910390fd5b600360048111156134c7576134c6614301565b5b8160048111156134da576134d9614301565b5b0361351a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161351190614c10565b60405180910390fd5b60048081111561352d5761352c614301565b5b8160048111156135405761353f614301565b5b03613580576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161357790614ca2565b60405180910390fd5b5b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60007f000000000000000000000000638590d2b73f975a4bb5d9f2f93b69bf3422159c73ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614801561366a57507f000000000000000000000000000000000000000000000000000000000000000146145b15613697577fbdd5ab4952b0c4282ffb41c1716433b0e688108e6e6a5d95783f5c75ed6b1ede9050613705565b6137027f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f5f7a2f72ac220b8a913f2555f054d49aa4e67a91624ca858a955262492280b397f06c015bd22b4c69690933c1058878ebdfef31f9aaae40bbe86d8a09fe1b2972c6138a6565b90505b90565b6000828260405160200161371d929190614d2f565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c111561377657600060039150915061383e565b601b8560ff161415801561378e5750601c8560ff1614155b156137a057600060049150915061383e565b6000600187878787604051600081526020016040526040516137c59493929190614d82565b6020604051602081039080840390855afa1580156137e7573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036138355760006001925092505061383e565b80600092509250505b94509492505050565b60008060007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60001b841690506000601b60ff8660001c901c61388a919061456d565b90506138988782888561373b565b935093505050935093915050565b600083838346306040516020016138c1959493929190614dc7565b6040516020818303038152906040528051906020012090509392505050565b8280546138ec9061448a565b90600052602060002090601f01602090048101928261390e5760008555613955565b82601f1061392757805160ff1916838001178555613955565b82800160010185558215613955579182015b82811115613954578251825591602001919060010190613939565b5b50905061396291906139a9565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b808211156139c25760008160009055506001016139aa565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613a0f816139da565b8114613a1a57600080fd5b50565b600081359050613a2c81613a06565b92915050565b600060208284031215613a4857613a476139d0565b5b6000613a5684828501613a1d565b91505092915050565b60008115159050919050565b613a7481613a5f565b82525050565b6000602082019050613a8f6000830184613a6b565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613acf578082015181840152602081019050613ab4565b83811115613ade576000848401525b50505050565b6000601f19601f8301169050919050565b6000613b0082613a95565b613b0a8185613aa0565b9350613b1a818560208601613ab1565b613b2381613ae4565b840191505092915050565b60006020820190508181036000830152613b488184613af5565b905092915050565b6000819050919050565b613b6381613b50565b8114613b6e57600080fd5b50565b600081359050613b8081613b5a565b92915050565b600060208284031215613b9c57613b9b6139d0565b5b6000613baa84828501613b71565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613bde82613bb3565b9050919050565b613bee81613bd3565b82525050565b6000602082019050613c096000830184613be5565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112613c3457613c33613c0f565b5b8235905067ffffffffffffffff811115613c5157613c50613c14565b5b602083019150836001820283011115613c6d57613c6c613c19565b5b9250929050565b60008060008060608587031215613c8e57613c8d6139d0565b5b6000613c9c87828801613b71565b9450506020613cad87828801613b71565b935050604085013567ffffffffffffffff811115613cce57613ccd6139d5565b5b613cda87828801613c1e565b925092505092959194509250565b613cf181613bd3565b8114613cfc57600080fd5b50565b600081359050613d0e81613ce8565b92915050565b60008060408385031215613d2b57613d2a6139d0565b5b6000613d3985828601613cff565b9250506020613d4a85828601613b71565b9150509250929050565b613d5d81613b50565b82525050565b6000602082019050613d786000830184613d54565b92915050565b600080600060608486031215613d9757613d966139d0565b5b6000613da586828701613cff565b9350506020613db686828701613cff565b9250506040613dc786828701613b71565b9150509250925092565b6000819050919050565b613de481613dd1565b8114613def57600080fd5b50565b600081359050613e0181613ddb565b92915050565b600060208284031215613e1d57613e1c6139d0565b5b6000613e2b84828501613df2565b91505092915050565b613e3d81613dd1565b82525050565b6000602082019050613e586000830184613e34565b92915050565b60008060408385031215613e7557613e746139d0565b5b6000613e8385828601613df2565b9250506020613e9485828601613cff565b9150509250929050565b60008083601f840112613eb457613eb3613c0f565b5b8235905067ffffffffffffffff811115613ed157613ed0613c14565b5b602083019150836020820283011115613eed57613eec613c19565b5b9250929050565b60008083601f840112613f0a57613f09613c0f565b5b8235905067ffffffffffffffff811115613f2757613f26613c14565b5b602083019150836020820283011115613f4357613f42613c19565b5b9250929050565b60008060008060408587031215613f6457613f636139d0565b5b600085013567ffffffffffffffff811115613f8257613f816139d5565b5b613f8e87828801613e9e565b9450945050602085013567ffffffffffffffff811115613fb157613fb06139d5565b5b613fbd87828801613ef4565b925092505092959194509250565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61400882613ae4565b810181811067ffffffffffffffff8211171561402757614026613fd0565b5b80604052505050565b600061403a6139c6565b90506140468282613fff565b919050565b600067ffffffffffffffff82111561406657614065613fd0565b5b61406f82613ae4565b9050602081019050919050565b82818337600083830152505050565b600061409e6140998461404b565b614030565b9050828152602081018484840111156140ba576140b9613fcb565b5b6140c584828561407c565b509392505050565b600082601f8301126140e2576140e1613c0f565b5b81356140f284826020860161408b565b91505092915050565b600060208284031215614111576141106139d0565b5b600082013567ffffffffffffffff81111561412f5761412e6139d5565b5b61413b848285016140cd565b91505092915050565b60006020828403121561415a576141596139d0565b5b600061416884828501613cff565b91505092915050565b61417a81613a5f565b811461418557600080fd5b50565b60008135905061419781614171565b92915050565b600080604083850312156141b4576141b36139d0565b5b60006141c285828601613cff565b92505060206141d385828601614188565b9150509250929050565b600067ffffffffffffffff8211156141f8576141f7613fd0565b5b61420182613ae4565b9050602081019050919050565b600061422161421c846141dd565b614030565b90508281526020810184848401111561423d5761423c613fcb565b5b61424884828561407c565b509392505050565b600082601f83011261426557614264613c0f565b5b813561427584826020860161420e565b91505092915050565b60008060008060808587031215614298576142976139d0565b5b60006142a687828801613cff565b94505060206142b787828801613cff565b93505060406142c887828801613b71565b925050606085013567ffffffffffffffff8111156142e9576142e86139d5565b5b6142f587828801614250565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6003811061434157614340614301565b5b50565b600081905061435282614330565b919050565b600061436282614344565b9050919050565b61437281614357565b82525050565b600060208201905061438d6000830184614369565b92915050565b6000806000806000608086880312156143af576143ae6139d0565b5b60006143bd88828901613cff565b95505060206143ce88828901613b71565b94505060406143df88828901613b71565b935050606086013567ffffffffffffffff811115614400576143ff6139d5565b5b61440c88828901613c1e565b92509250509295509295909350565b60008060408385031215614432576144316139d0565b5b600061444085828601613cff565b925050602061445185828601613cff565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806144a257607f821691505b6020821081036144b5576144b461445b565b5b50919050565b60006040820190506144d06000830185614369565b6144dd6020830184614369565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061451e82613b50565b915061452983613b50565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614562576145616144e4565b5b828202905092915050565b600061457882613b50565b915061458383613b50565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156145b8576145b76144e4565b5b828201905092915050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b600061461f602f83613aa0565b915061462a826145c3565b604082019050919050565b6000602082019050818103600083015261464e81614612565b9050919050565b600081905092915050565b50565b6000614670600083614655565b915061467b82614660565b600082019050919050565b600061469182614663565b9150819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006146d582613b50565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614707576147066144e4565b5b600182019050919050565b600081905092915050565b600061472882613a95565b6147328185614712565b9350614742818560208601613ab1565b80840191505092915050565b600061475a828561471d565b9150614766828461471d565b91508190509392505050565b60006080820190506147876000830187613e34565b6147946020830186613be5565b6147a16040830185613d54565b6147ae6060830184613d54565b95945050505050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b60006147ed601783614712565b91506147f8826147b7565b601782019050919050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b6000614839601183614712565b915061484482614803565b601182019050919050565b600061485a826147e0565b9150614866828561471d565b91506148718261482c565b915061487d828461471d565b91508190509392505050565b600081519050919050565b600082825260208201905092915050565b60006148b082614889565b6148ba8185614894565b93506148ca818560208601613ab1565b6148d381613ae4565b840191505092915050565b60006080820190506148f36000830187613be5565b6149006020830186613be5565b61490d6040830185613d54565b818103606083015261491f81846148a5565b905095945050505050565b60008151905061493981613a06565b92915050565b600060208284031215614955576149546139d0565b5b60006149638482850161492a565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006149a682613b50565b91506149b183613b50565b9250826149c1576149c061496c565b5b828204905092915050565b60006149d782613b50565b91506149e283613b50565b9250828210156149f5576149f46144e4565b5b828203905092915050565b6000614a0b82613b50565b9150614a1683613b50565b925082614a2657614a2561496c565b5b828206905092915050565b6000614a3c82613b50565b915060008203614a4f57614a4e6144e4565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b6000614a90602083613aa0565b9150614a9b82614a5a565b602082019050919050565b60006020820190508181036000830152614abf81614a83565b9050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b6000614afc601883613aa0565b9150614b0782614ac6565b602082019050919050565b60006020820190508181036000830152614b2b81614aef565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000614b68601f83613aa0565b9150614b7382614b32565b602082019050919050565b60006020820190508181036000830152614b9781614b5b565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000614bfa602283613aa0565b9150614c0582614b9e565b604082019050919050565b60006020820190508181036000830152614c2981614bed565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000614c8c602283613aa0565b9150614c9782614c30565b604082019050919050565b60006020820190508181036000830152614cbb81614c7f565b9050919050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b6000614cf8600283614712565b9150614d0382614cc2565b600282019050919050565b6000819050919050565b614d29614d2482613dd1565b614d0e565b82525050565b6000614d3a82614ceb565b9150614d468285614d18565b602082019150614d568284614d18565b6020820191508190509392505050565b600060ff82169050919050565b614d7c81614d66565b82525050565b6000608082019050614d976000830187613e34565b614da46020830186614d73565b614db16040830185613e34565b614dbe6060830184613e34565b95945050505050565b600060a082019050614ddc6000830188613e34565b614de96020830187613e34565b614df66040830186613e34565b614e036060830185613d54565b614e106080830184613be5565b969550505050505056fea2646970667358221220a0cf5b986d890096288cc6d9646e47512ea381bf8eea8c8c339d613722dcbafc64736f6c634300080d0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000094d4554414e4f4953450000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000546533336300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005312e302e30000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : name (string): METANOISE
Arg [1] : symbol (string): FS360
Arg [2] : version (string): 1.0.0
-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000009
Arg [4] : 4d4554414e4f4953450000000000000000000000000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [6] : 4653333630000000000000000000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [8] : 312e302e30000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
131730:5665:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;137223:169;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27321:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28824:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;134050:1195;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28387:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;131949:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;133941:101;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23457:303;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29689:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48980:131;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49373:147;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;131911:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50421:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;136883:332;;;;;;;;;;;;;:::i;:::-;;29930:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;133203:314;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;135763:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;135987:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27129:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;135364:115;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24577:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;132382:70;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;135253:103;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47849:147;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;136113:135;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27490:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;133525:121;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;132313:62;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46940:49;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29100:287;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30186:369;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;131990:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;131886:18;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27665:318;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;135487:132;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;133654:279;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;132171:62;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49765:149;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;135627:128;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;136301:97;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29458:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;132240:66;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;137223:169;137324:4;137348:36;137372:11;137348:23;:36::i;:::-;137341:43;;137223:169;;;:::o;27321:100::-;27375:13;27408:5;27401:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27321:100;:::o;28824:204::-;28892:7;28917:16;28925:7;28917;:16::i;:::-;28912:64;;28942:34;;;;;;;;;;;;;;28912:64;28996:15;:24;29012:7;28996:24;;;;;;;;;;;;;;;;;;;;;28989:31;;28824:204;;;:::o;134050:1195::-;134196:16;134187:25;;;;;;;;:::i;:::-;;:5;;;;;;;;;;;:25;;;;;;;;:::i;:::-;;;134183:100;;134247:5;;;;;;;;;;;134254:16;134236:35;;;;;;;;;;;;:::i;:::-;;;;;;;;134183:100;134309:1;134299:6;:11;134295:64;;134334:13;;;;;;;;;;;;;;134295:64;134401:6;134388:10;;:19;;;;:::i;:::-;134375:9;:33;134371:95;;;134432:22;;;;;;;;;;;;;;134371:95;134519:14;;134510:6;134482:13;:25;134496:10;134482:25;;;;;;;;;;;;;;;;:34;;;;:::i;:::-;:51;134478:110;;;134557:19;;;;;;;;;;;;;;134478:110;134600:21;134624:13;:11;:13::i;:::-;134600:37;;134681:10;;134671:6;134655:13;:22;;;;:::i;:::-;134654:37;134650:93;;;134715:16;;;;;;;;;;;;;;134650:93;134755:12;134770:32;134776:10;134788:6;134796:5;134770;:32::i;:::-;134755:47;;134818:24;134826:4;134832:9;;134818:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:7;:24::i;:::-;134813:81;;134866:16;;;;;;;;;;;;;;134813:81;134911:24;134919:4;134925:9;;134911:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:7;:24::i;:::-;134906:81;;134959:16;;;;;;;;;;;;;;134906:81;135028:1;135003:27;;:7;:13;135011:4;135003:13;;;;;;;;;;;;;;;;;;;;;:27;;;134999:89;;135054:22;;;;;;;;;;;;;;134999:89;135098:29;135108:10;135120:6;135098:9;:29::i;:::-;135194:6;135166:13;:25;135180:10;135166:25;;;;;;;;;;;;;;;;:34;;;;:::i;:::-;135138:13;:25;135152:10;135138:25;;;;;;;;;;;;;;;:62;;;;135227:10;135211:7;:13;135219:4;135211:13;;;;;;;;;;;;:26;;;;;;;;;;;;;;;;;;134172:1073;;134050:1195;;;;:::o;28387:371::-;28460:13;28476:24;28492:7;28476:15;:24::i;:::-;28460:40;;28521:5;28515:11;;:2;:11;;;28511:48;;28535:24;;;;;;;;;;;;;;28511:48;28592:5;28576:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;28602:37;28619:5;28626:12;:10;:12::i;:::-;28602:16;:37::i;:::-;28601:38;28576:63;28572:138;;;28663:35;;;;;;;;;;;;;;28572:138;28722:28;28731:2;28735:7;28744:5;28722:8;:28::i;:::-;28449:309;28387:371;;:::o;131949:34::-;;;;:::o;133941:101::-;133986:7;134013:21;134006:28;;133941:101;:::o;23457:303::-;23501:7;23726:15;:13;:15::i;:::-;23711:12;;23695:13;;:28;:46;23688:53;;23457:303;:::o;29689:170::-;29823:28;29833:4;29839:2;29843:7;29823:9;:28::i;:::-;29689:170;;;:::o;48980:131::-;49054:7;49081:6;:12;49088:4;49081:12;;;;;;;;;;;:22;;;49074:29;;48980:131;;;:::o;49373:147::-;49456:18;49469:4;49456:12;:18::i;:::-;47431:30;47442:4;47448:12;:10;:12::i;:::-;47431:10;:30::i;:::-;49487:25:::1;49498:4;49504:7;49487:10;:25::i;:::-;49373:147:::0;;;:::o;131911:31::-;;;;:::o;50421:218::-;50528:12;:10;:12::i;:::-;50517:23;;:7;:23;;;50509:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;50605:26;50617:4;50623:7;50605:11;:26::i;:::-;50421:218;;:::o;136883:332::-;132424:28;47431:30;47442:4;47448:12;:10;:12::i;:::-;47431:10;:30::i;:::-;136949:15:::1;136967:21;136949:39;;137014:1;137003:7;:12:::0;136999:66:::1;;137039:14;;;;;;;;;;;;;;136999:66;137078:9;137101:10;137093:24;;137125:7;137093:44;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;137077:60;;;137153:4;137148:60;;137181:15;;;;;;;;;;;;;;137148:60;136938:277;;136883:332:::0;:::o;29930:185::-;30068:39;30085:4;30091:2;30095:7;30068:39;;;;;;;;;;;;:16;:39::i;:::-;29930:185;;;:::o;133203:314::-;132209:24;47431:30;47442:4;47448:12;:10;:12::i;:::-;47431:10;:30::i;:::-;133335:6:::1;;:13;;133322:2;;:9;;:26;133318:82;;133372:16;;;;;;;;;;;;;;133318:82;133417:9;133412:98;133436:2;;:9;;133432:1;:13;133412:98;;;133467:31;133477:2;;133480:1;133477:5;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;133484:6;;133491:1;133484:9;;;;;;;:::i;:::-;;;;;;;;133467:31;;;;;;;;;;;::::0;:9:::1;:31::i;:::-;133447:3;;;;;:::i;:::-;;;;133412:98;;;;133203:314:::0;;;;;:::o;135763:108::-;135817:4;135841:22;135855:7;135841:13;:22::i;:::-;135834:29;;135763:108;;;:::o;135987:118::-;132280:26;47431:30;47442:4;47448:12;:10;:12::i;:::-;47431:10;:30::i;:::-;136086:11:::1;136076:7;:21;;;;;;;;;;;;:::i;:::-;;135987:118:::0;;:::o;27129:125::-;27193:7;27220:21;27233:7;27220:12;:21::i;:::-;:26;;;27213:33;;27129:125;;;:::o;135364:115::-;132280:26;47431:30;47442:4;47448:12;:10;:12::i;:::-;47431:10;:30::i;:::-;135462:9:::1;135449:10;:22;;;;135364:115:::0;;:::o;24577:206::-;24641:7;24682:1;24665:19;;:5;:19;;;24661:60;;24693:28;;;;;;;;;;;;;;24661:60;24747:12;:19;24760:5;24747:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;24739:36;;24732:43;;24577:206;;;:::o;132382:70::-;132424:28;132382:70;:::o;135253:103::-;132280:26;47431:30;47442:4;47448:12;:10;:12::i;:::-;47431:10;:30::i;:::-;135343:5:::1;135330:10;:18;;;;135253:103:::0;;:::o;47849:147::-;47935:4;47959:6;:12;47966:4;47959:12;;;;;;;;;;;:20;;:29;47980:7;47959:29;;;;;;;;;;;;;;;;;;;;;;;;;47952:36;;47849:147;;;;:::o;136113:135::-;132280:26;47431:30;47442:4;47448:12;:10;:12::i;:::-;47431:10;:30::i;:::-;136226:14:::1;136211:12;:29;;;;;;;;;;;;:::i;:::-;;136113:135:::0;;:::o;27490:104::-;27546:13;27579:7;27572:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27490:104;:::o;133525:121::-;132209:24;47431:30;47442:4;47448:12;:10;:12::i;:::-;47431:10;:30::i;:::-;133613:25:::1;133623:2;133627:6;133613:25;;;;;;;;;;;::::0;:9:::1;:25::i;:::-;133525:121:::0;;;:::o;132313:62::-;132351:24;132313:62;:::o;46940:49::-;46985:4;46940:49;;;:::o;29100:287::-;29211:12;:10;:12::i;:::-;29199:24;;:8;:24;;;29195:54;;29232:17;;;;;;;;;;;;;;29195:54;29307:8;29262:18;:32;29281:12;:10;:12::i;:::-;29262:32;;;;;;;;;;;;;;;:42;29295:8;29262:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;29360:8;29331:48;;29346:12;:10;:12::i;:::-;29331:48;;;29370:8;29331:48;;;;;;:::i;:::-;;;;;;;;29100:287;;:::o;30186:369::-;30353:28;30363:4;30369:2;30373:7;30353:9;:28::i;:::-;30396:15;:2;:13;;;:15::i;:::-;:76;;;;;30416:56;30447:4;30453:2;30457:7;30466:5;30416:30;:56::i;:::-;30415:57;30396:76;30392:156;;;30496:40;;;;;;;;;;;;;;30392:156;30186:369;;;;:::o;131990:35::-;;;;:::o;131886:18::-;;;;;;;;;;;;;:::o;27665:318::-;27738:13;27769:16;27777:7;27769;:16::i;:::-;27764:59;;27794:29;;;;;;;;;;;;;;27764:59;27836:21;27860:10;:8;:10::i;:::-;27836:34;;27913:1;27894:7;27888:21;:26;:87;;;;;;;;;;;;;;;;;27941:7;27950:18;:7;:16;:18::i;:::-;27924:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;27888:87;27881:94;;;27665:318;;;:::o;135487:132::-;135562:7;135589:13;:22;135603:7;135589:22;;;;;;;;;;;;;;;;135582:29;;135487:132;;;:::o;133654:279::-;133813:7;133833:12;133848:29;133854:7;133863:6;133871:5;133848;:29::i;:::-;133833:44;;133895:30;133909:4;133915:9;;133895:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:13;:30::i;:::-;133888:37;;;133654:279;;;;;;;:::o;132171:62::-;132209:24;132171:62;:::o;49765:149::-;49849:18;49862:4;49849:12;:18::i;:::-;47431:30;47442:4;47448:12;:10;:12::i;:::-;47431:10;:30::i;:::-;49880:26:::1;49892:4;49898:7;49880:11;:26::i;:::-;49765:149:::0;;;:::o;135627:128::-;132280:26;47431:30;47442:4;47448:12;:10;:12::i;:::-;47431:10;:30::i;:::-;135735:12:::1;135718:14;:29;;;;135627:128:::0;;:::o;136301:97::-;136345:13;136378:12;136371:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;136301:97;:::o;29458:164::-;29555:4;29579:18;:25;29598:5;29579:25;;;;;;;;;;;;;;;:35;29605:8;29579:35;;;;;;;;;;;;;;;;;;;;;;;;;29572:42;;29458:164;;;;:::o;132240:66::-;132280:26;132240:66;:::o;47553:204::-;47638:4;47677:32;47662:47;;;:11;:47;;;;:87;;;;47713:36;47737:11;47713:23;:36::i;:::-;47662:87;47655:94;;47553:204;;;:::o;30810:174::-;30867:4;30910:7;30891:15;:13;:15::i;:::-;:26;;:53;;;;;30931:13;;30921:7;:23;30891:53;:85;;;;;30949:11;:20;30961:7;30949:20;;;;;;;;;;;:27;;;;;;;;;;;;30948:28;30891:85;30884:92;;30810:174;;;:::o;136406:295::-;136526:7;136566:127;136604:62;136668:7;136677:6;136685:5;136593:98;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;136583:109;;;;;;136566:16;:127::i;:::-;136546:147;;136406:295;;;;;:::o;136709:166::-;136789:4;136813:54;132351:24;136834:32;136848:6;136856:9;136834:13;:32::i;:::-;136813:7;:54::i;:::-;136806:61;;136709:166;;;;:::o;30992:104::-;31061:27;31071:2;31075:8;31061:27;;;;;;;;;;;;:9;:27::i;:::-;30992:104;;:::o;16620:98::-;16673:7;16700:10;16693:17;;16620:98;:::o;38967:196::-;39109:2;39082:15;:24;39098:7;39082:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;39147:7;39143:2;39127:28;;39136:5;39127:28;;;;;;;;;;;;38967:196;;;:::o;23231:92::-;23287:7;23231:92;:::o;33910:2130::-;34025:35;34063:21;34076:7;34063:12;:21::i;:::-;34025:59;;34123:4;34101:26;;:13;:18;;;:26;;;34097:67;;34136:28;;;;;;;;;;;;;;34097:67;34177:22;34219:4;34203:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;34240:36;34257:4;34263:12;:10;:12::i;:::-;34240:16;:36::i;:::-;34203:73;:126;;;;34317:12;:10;:12::i;:::-;34293:36;;:20;34305:7;34293:11;:20::i;:::-;:36;;;34203:126;34177:153;;34348:17;34343:66;;34374:35;;;;;;;;;;;;;;34343:66;34438:1;34424:16;;:2;:16;;;34420:52;;34449:23;;;;;;;;;;;;;;34420:52;34485:43;34507:4;34513:2;34517:7;34526:1;34485:21;:43::i;:::-;34593:35;34610:1;34614:7;34623:4;34593:8;:35::i;:::-;34954:1;34924:12;:18;34937:4;34924:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34998:1;34970:12;:16;34983:2;34970:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35016:31;35050:11;:20;35062:7;35050:20;;;;;;;;;;;35016:54;;35101:2;35085:8;:13;;;:18;;;;;;;;;;;;;;;;;;35151:15;35118:8;:23;;;:49;;;;;;;;;;;;;;;;;;35419:19;35451:1;35441:7;:11;35419:33;;35467:31;35501:11;:24;35513:11;35501:24;;;;;;;;;;;35467:58;;35569:1;35544:27;;:8;:13;;;;;;;;;;;;:27;;;35540:384;;35754:13;;35739:11;:28;35735:174;;35808:4;35792:8;:13;;;:20;;;;;;;;;;;;;;;;;;35861:13;:28;;;35835:8;:23;;;:54;;;;;;;;;;;;;;;;;;35735:174;35540:384;34899:1036;;;35971:7;35967:2;35952:27;;35961:4;35952:27;;;;;;;;;;;;35990:42;36011:4;36017:2;36021:7;36030:1;35990:20;:42::i;:::-;34014:2026;;33910:2130;;;:::o;48286:505::-;48375:22;48383:4;48389:7;48375;:22::i;:::-;48370:414;;48563:41;48591:7;48563:41;;48601:2;48563:19;:41::i;:::-;48677:38;48705:4;48697:13;;48712:2;48677:19;:38::i;:::-;48468:270;;;;;;;;;:::i;:::-;;;;;;;;;;;;;48414:358;;;;;;;;;;;:::i;:::-;;;;;;;;48370:414;48286:505;;:::o;51922:238::-;52006:22;52014:4;52020:7;52006;:22::i;:::-;52001:152;;52077:4;52045:6;:12;52052:4;52045:12;;;;;;;;;;;:20;;:29;52066:7;52045:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;52128:12;:10;:12::i;:::-;52101:40;;52119:7;52101:40;;52113:4;52101:40;;;;;;;;;;52001:152;51922:238;;:::o;52292:239::-;52376:22;52384:4;52390:7;52376;:22::i;:::-;52372:152;;;52447:5;52415:6;:12;52422:4;52415:12;;;;;;;;;;;:20;;:29;52436:7;52415:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;52499:12;:10;:12::i;:::-;52472:40;;52490:7;52472:40;;52484:4;52472:40;;;;;;;;;;52372:152;52292:239;;:::o;31459:163::-;31582:32;31588:2;31592:8;31602:5;31609:4;31582:5;:32::i;:::-;31459:163;;;:::o;25958:1109::-;26020:21;;:::i;:::-;26054:12;26069:7;26054:22;;26137:4;26118:15;:13;:15::i;:::-;:23;;:47;;;;;26152:13;;26145:4;:20;26118:47;26114:886;;;26186:31;26220:11;:17;26232:4;26220:17;;;;;;;;;;;26186:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26261:9;:16;;;26256:729;;26332:1;26306:28;;:9;:14;;;:28;;;26302:101;;26370:9;26363:16;;;;;;26302:101;26705:261;26712:4;26705:261;;;26745:6;;;;;;;;26790:11;:17;26802:4;26790:17;;;;;;;;;;;26778:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26864:1;26838:28;;:9;:14;;;:28;;;26834:109;;26906:9;26899:16;;;;;;26834:109;26705:261;;;26256:729;26167:833;26114:886;27028:31;;;;;;;;;;;;;;25958:1109;;;;:::o;8686:326::-;8746:4;9003:1;8981:7;:19;;;:23;8974:30;;8686:326;;;:::o;39655:667::-;39818:4;39855:2;39839:36;;;39876:12;:10;:12::i;:::-;39890:4;39896:7;39905:5;39839:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;39835:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40090:1;40073:6;:13;:18;40069:235;;40119:40;;;;;;;;;;;;;;40069:235;40262:6;40256:13;40247:6;40243:2;40239:15;40232:38;39835:480;39968:45;;;39958:55;;;:6;:55;;;;39951:62;;;39655:667;;;;;;:::o;135879:100::-;135931:13;135964:7;135957:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;135879:100;:::o;17184:723::-;17240:13;17470:1;17461:5;:10;17457:53;;17488:10;;;;;;;;;;;;;;;;;;;;;17457:53;17520:12;17535:5;17520:20;;17551:14;17576:78;17591:1;17583:4;:9;17576:78;;17609:8;;;;;:::i;:::-;;;;17640:2;17632:10;;;;;:::i;:::-;;;17576:78;;;17664:19;17696:6;17686:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17664:39;;17714:154;17730:1;17721:5;:10;17714:154;;17758:1;17748:11;;;;;:::i;:::-;;;17825:2;17817:5;:10;;;;:::i;:::-;17804:2;:24;;;;:::i;:::-;17791:39;;17774:6;17781;17774:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;17854:2;17845:11;;;;;:::i;:::-;;;17714:154;;;17892:6;17878:21;;;;;17184:723;;;;:::o;58388:231::-;58466:7;58487:17;58506:18;58528:27;58539:4;58545:9;58528:10;:27::i;:::-;58486:69;;;;58566:18;58578:5;58566:11;:18::i;:::-;58602:9;58595:16;;;;58388:231;;;;:::o;24208:305::-;24310:4;24362:25;24347:40;;;:11;:40;;;;:105;;;;24419:33;24404:48;;;:11;:48;;;;24347:105;:158;;;;24469:36;24493:11;24469:23;:36::i;:::-;24347:158;24327:178;;24208:305;;;:::o;67945:167::-;68022:7;68049:55;68071:20;:18;:20::i;:::-;68093:10;68049:21;:55::i;:::-;68042:62;;67945:167;;;:::o;40970:159::-;;;;;:::o;41788:158::-;;;;;:::o;18485:451::-;18560:13;18586:19;18631:1;18622:6;18618:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;18608:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18586:47;;18644:15;:6;18651:1;18644:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;18670;:6;18677:1;18670:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;18701:9;18726:1;18717:6;18713:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;18701:26;;18696:135;18733:1;18729;:5;18696:135;;;18768:12;18789:3;18781:5;:11;18768:25;;;;;;;:::i;:::-;;;;;18756:6;18763:1;18756:9;;;;;;;;:::i;:::-;;;;;:37;;;;;;;;;;;18818:1;18808:11;;;;;18736:3;;;;:::i;:::-;;;18696:135;;;;18858:1;18849:5;:10;18841:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;18921:6;18907:21;;;18485:451;;;;:::o;31881:1775::-;32020:20;32043:13;;32020:36;;32085:1;32071:16;;:2;:16;;;32067:48;;32096:19;;;;;;;;;;;;;;32067:48;32142:1;32130:8;:13;32126:44;;32152:18;;;;;;;;;;;;;;32126:44;32183:61;32213:1;32217:2;32221:12;32235:8;32183:21;:61::i;:::-;32556:8;32521:12;:16;32534:2;32521:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32620:8;32580:12;:16;32593:2;32580:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32679:2;32646:11;:25;32658:12;32646:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;32746:15;32696:11;:25;32708:12;32696:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;32779:20;32802:12;32779:35;;32829:11;32858:8;32843:12;:23;32829:37;;32887:4;:23;;;;;32895:15;:2;:13;;;:15::i;:::-;32887:23;32883:641;;;32931:314;32987:12;32983:2;32962:38;;32979:1;32962:38;;;;;;;;;;;;33028:69;33067:1;33071:2;33075:14;;;;;;33091:5;33028:30;:69::i;:::-;33023:174;;33133:40;;;;;;;;;;;;;;33023:174;33240:3;33224:12;:19;32931:314;;33326:12;33309:13;;:29;33305:43;;33340:8;;;33305:43;32883:641;;;33389:120;33445:14;;;;;;33441:2;33420:40;;33437:1;33420:40;;;;;;;;;;;;33504:3;33488:12;:19;33389:120;;32883:641;33554:12;33538:13;:28;;;;32496:1082;;33588:60;33617:1;33621:2;33625:12;33639:8;33588:20;:60::i;:::-;32009:1647;31881:1775;;;;:::o;56278:1308::-;56359:7;56368:12;56613:2;56593:9;:16;:22;56589:990;;56632:9;56656;56680:7;56889:4;56878:9;56874:20;56868:27;56863:32;;56939:4;56928:9;56924:20;56918:27;56913:32;;56997:4;56986:9;56982:20;56976:27;56973:1;56968:36;56963:41;;57040:25;57051:4;57057:1;57060;57063;57040:10;:25::i;:::-;57033:32;;;;;;;;;56589:990;57107:2;57087:9;:16;:22;57083:496;;57126:9;57150:10;57362:4;57351:9;57347:20;57341:27;57336:32;;57413:4;57402:9;57398:20;57392:27;57386:33;;57455:23;57466:4;57472:1;57475:2;57455:10;:23::i;:::-;57448:30;;;;;;;;57083:496;57527:1;57531:35;57511:56;;;;56278:1308;;;;;;:::o;54549:643::-;54627:20;54618:29;;;;;;;;:::i;:::-;;:5;:29;;;;;;;;:::i;:::-;;;54614:571;54664:7;54614:571;54725:29;54716:38;;;;;;;;:::i;:::-;;:5;:38;;;;;;;;:::i;:::-;;;54712:473;;54771:34;;;;;;;;;;:::i;:::-;;;;;;;;54712:473;54836:35;54827:44;;;;;;;;:::i;:::-;;:5;:44;;;;;;;;:::i;:::-;;;54823:362;;54888:41;;;;;;;;;;:::i;:::-;;;;;;;;54823:362;54960:30;54951:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;54947:238;;55007:44;;;;;;;;;;:::i;:::-;;;;;;;;54947:238;55082:30;55073:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;55069:116;;55129:44;;;;;;;;;;:::i;:::-;;;;;;;;55069:116;54549:643;;:::o;19791:157::-;19876:4;19915:25;19900:40;;;:11;:40;;;;19893:47;;19791:157;;;:::o;66718:314::-;66771:7;66812:12;66795:29;;66803:4;66795:29;;;:66;;;;;66845:16;66828:13;:33;66795:66;66791:234;;;66885:24;66878:31;;;;66791:234;66949:64;66971:10;66983:12;66997:15;66949:21;:64::i;:::-;66942:71;;66718:314;;:::o;63302:196::-;63395:7;63461:15;63478:10;63432:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;63422:68;;;;;;63415:75;;63302:196;;;;:::o;59840:1632::-;59971:7;59980:12;60905:66;60900:1;60892:10;;:79;60888:163;;;61004:1;61008:30;60988:51;;;;;;60888:163;61070:2;61065:1;:7;;;;:18;;;;;61081:2;61076:1;:7;;;;61065:18;61061:102;;;61116:1;61120:30;61100:51;;;;;;61061:102;61260:14;61277:24;61287:4;61293:1;61296;61299;61277:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61260:41;;61334:1;61316:20;;:6;:20;;;61312:103;;61369:1;61373:29;61353:50;;;;;;;61312:103;61435:6;61443:20;61427:37;;;;;59840:1632;;;;;;;;:::o;58882:344::-;58996:7;59005:12;59030:9;59055:66;59047:75;;59042:2;:80;59030:92;;59133:7;59172:2;59165:3;59158:2;59150:11;;:18;;59149:25;;;;:::i;:::-;59133:42;;59193:25;59204:4;59210:1;59213;59216;59193:10;:25::i;:::-;59186:32;;;;;;58882:344;;;;;;:::o;67040:263::-;67184:7;67232:8;67242;67252:11;67265:13;67288:4;67221:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;67211:84;;;;;;67204:91;;67040:263;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:117::-;4294:1;4291;4284:12;4308:117;4417:1;4414;4407:12;4431:117;4540:1;4537;4530:12;4567:552;4624:8;4634:6;4684:3;4677:4;4669:6;4665:17;4661:27;4651:122;;4692:79;;:::i;:::-;4651:122;4805:6;4792:20;4782:30;;4835:18;4827:6;4824:30;4821:117;;;4857:79;;:::i;:::-;4821:117;4971:4;4963:6;4959:17;4947:29;;5025:3;5017:4;5009:6;5005:17;4995:8;4991:32;4988:41;4985:128;;;5032:79;;:::i;:::-;4985:128;4567:552;;;;;:::o;5125:817::-;5213:6;5221;5229;5237;5286:2;5274:9;5265:7;5261:23;5257:32;5254:119;;;5292:79;;:::i;:::-;5254:119;5412:1;5437:53;5482:7;5473:6;5462:9;5458:22;5437:53;:::i;:::-;5427:63;;5383:117;5539:2;5565:53;5610:7;5601:6;5590:9;5586:22;5565:53;:::i;:::-;5555:63;;5510:118;5695:2;5684:9;5680:18;5667:32;5726:18;5718:6;5715:30;5712:117;;;5748:79;;:::i;:::-;5712:117;5861:64;5917:7;5908:6;5897:9;5893:22;5861:64;:::i;:::-;5843:82;;;;5638:297;5125:817;;;;;;;:::o;5948:122::-;6021:24;6039:5;6021:24;:::i;:::-;6014:5;6011:35;6001:63;;6060:1;6057;6050:12;6001:63;5948:122;:::o;6076:139::-;6122:5;6160:6;6147:20;6138:29;;6176:33;6203:5;6176:33;:::i;:::-;6076:139;;;;:::o;6221:474::-;6289:6;6297;6346:2;6334:9;6325:7;6321:23;6317:32;6314:119;;;6352:79;;:::i;:::-;6314:119;6472:1;6497:53;6542:7;6533:6;6522:9;6518:22;6497:53;:::i;:::-;6487:63;;6443:117;6599:2;6625:53;6670:7;6661:6;6650:9;6646:22;6625:53;:::i;:::-;6615:63;;6570:118;6221:474;;;;;:::o;6701:118::-;6788:24;6806:5;6788:24;:::i;:::-;6783:3;6776:37;6701:118;;:::o;6825:222::-;6918:4;6956:2;6945:9;6941:18;6933:26;;6969:71;7037:1;7026:9;7022:17;7013:6;6969:71;:::i;:::-;6825:222;;;;:::o;7053:619::-;7130:6;7138;7146;7195:2;7183:9;7174:7;7170:23;7166:32;7163:119;;;7201:79;;:::i;:::-;7163:119;7321:1;7346:53;7391:7;7382:6;7371:9;7367:22;7346:53;:::i;:::-;7336:63;;7292:117;7448:2;7474:53;7519:7;7510:6;7499:9;7495:22;7474:53;:::i;:::-;7464:63;;7419:118;7576:2;7602:53;7647:7;7638:6;7627:9;7623:22;7602:53;:::i;:::-;7592:63;;7547:118;7053:619;;;;;:::o;7678:77::-;7715:7;7744:5;7733:16;;7678:77;;;:::o;7761:122::-;7834:24;7852:5;7834:24;:::i;:::-;7827:5;7824:35;7814:63;;7873:1;7870;7863:12;7814:63;7761:122;:::o;7889:139::-;7935:5;7973:6;7960:20;7951:29;;7989:33;8016:5;7989:33;:::i;:::-;7889:139;;;;:::o;8034:329::-;8093:6;8142:2;8130:9;8121:7;8117:23;8113:32;8110:119;;;8148:79;;:::i;:::-;8110:119;8268:1;8293:53;8338:7;8329:6;8318:9;8314:22;8293:53;:::i;:::-;8283:63;;8239:117;8034:329;;;;:::o;8369:118::-;8456:24;8474:5;8456:24;:::i;:::-;8451:3;8444:37;8369:118;;:::o;8493:222::-;8586:4;8624:2;8613:9;8609:18;8601:26;;8637:71;8705:1;8694:9;8690:17;8681:6;8637:71;:::i;:::-;8493:222;;;;:::o;8721:474::-;8789:6;8797;8846:2;8834:9;8825:7;8821:23;8817:32;8814:119;;;8852:79;;:::i;:::-;8814:119;8972:1;8997:53;9042:7;9033:6;9022:9;9018:22;8997:53;:::i;:::-;8987:63;;8943:117;9099:2;9125:53;9170:7;9161:6;9150:9;9146:22;9125:53;:::i;:::-;9115:63;;9070:118;8721:474;;;;;:::o;9218:568::-;9291:8;9301:6;9351:3;9344:4;9336:6;9332:17;9328:27;9318:122;;9359:79;;:::i;:::-;9318:122;9472:6;9459:20;9449:30;;9502:18;9494:6;9491:30;9488:117;;;9524:79;;:::i;:::-;9488:117;9638:4;9630:6;9626:17;9614:29;;9692:3;9684:4;9676:6;9672:17;9662:8;9658:32;9655:41;9652:128;;;9699:79;;:::i;:::-;9652:128;9218:568;;;;;:::o;9809:::-;9882:8;9892:6;9942:3;9935:4;9927:6;9923:17;9919:27;9909:122;;9950:79;;:::i;:::-;9909:122;10063:6;10050:20;10040:30;;10093:18;10085:6;10082:30;10079:117;;;10115:79;;:::i;:::-;10079:117;10229:4;10221:6;10217:17;10205:29;;10283:3;10275:4;10267:6;10263:17;10253:8;10249:32;10246:41;10243:128;;;10290:79;;:::i;:::-;10243:128;9809:568;;;;;:::o;10383:934::-;10505:6;10513;10521;10529;10578:2;10566:9;10557:7;10553:23;10549:32;10546:119;;;10584:79;;:::i;:::-;10546:119;10732:1;10721:9;10717:17;10704:31;10762:18;10754:6;10751:30;10748:117;;;10784:79;;:::i;:::-;10748:117;10897:80;10969:7;10960:6;10949:9;10945:22;10897:80;:::i;:::-;10879:98;;;;10675:312;11054:2;11043:9;11039:18;11026:32;11085:18;11077:6;11074:30;11071:117;;;11107:79;;:::i;:::-;11071:117;11220:80;11292:7;11283:6;11272:9;11268:22;11220:80;:::i;:::-;11202:98;;;;10997:313;10383:934;;;;;;;:::o;11323:117::-;11432:1;11429;11422:12;11446:180;11494:77;11491:1;11484:88;11591:4;11588:1;11581:15;11615:4;11612:1;11605:15;11632:281;11715:27;11737:4;11715:27;:::i;:::-;11707:6;11703:40;11845:6;11833:10;11830:22;11809:18;11797:10;11794:34;11791:62;11788:88;;;11856:18;;:::i;:::-;11788:88;11896:10;11892:2;11885:22;11675:238;11632:281;;:::o;11919:129::-;11953:6;11980:20;;:::i;:::-;11970:30;;12009:33;12037:4;12029:6;12009:33;:::i;:::-;11919:129;;;:::o;12054:308::-;12116:4;12206:18;12198:6;12195:30;12192:56;;;12228:18;;:::i;:::-;12192:56;12266:29;12288:6;12266:29;:::i;:::-;12258:37;;12350:4;12344;12340:15;12332:23;;12054:308;;;:::o;12368:154::-;12452:6;12447:3;12442;12429:30;12514:1;12505:6;12500:3;12496:16;12489:27;12368:154;;;:::o;12528:412::-;12606:5;12631:66;12647:49;12689:6;12647:49;:::i;:::-;12631:66;:::i;:::-;12622:75;;12720:6;12713:5;12706:21;12758:4;12751:5;12747:16;12796:3;12787:6;12782:3;12778:16;12775:25;12772:112;;;12803:79;;:::i;:::-;12772:112;12893:41;12927:6;12922:3;12917;12893:41;:::i;:::-;12612:328;12528:412;;;;;:::o;12960:340::-;13016:5;13065:3;13058:4;13050:6;13046:17;13042:27;13032:122;;13073:79;;:::i;:::-;13032:122;13190:6;13177:20;13215:79;13290:3;13282:6;13275:4;13267:6;13263:17;13215:79;:::i;:::-;13206:88;;13022:278;12960:340;;;;:::o;13306:509::-;13375:6;13424:2;13412:9;13403:7;13399:23;13395:32;13392:119;;;13430:79;;:::i;:::-;13392:119;13578:1;13567:9;13563:17;13550:31;13608:18;13600:6;13597:30;13594:117;;;13630:79;;:::i;:::-;13594:117;13735:63;13790:7;13781:6;13770:9;13766:22;13735:63;:::i;:::-;13725:73;;13521:287;13306:509;;;;:::o;13821:329::-;13880:6;13929:2;13917:9;13908:7;13904:23;13900:32;13897:119;;;13935:79;;:::i;:::-;13897:119;14055:1;14080:53;14125:7;14116:6;14105:9;14101:22;14080:53;:::i;:::-;14070:63;;14026:117;13821:329;;;;:::o;14156:116::-;14226:21;14241:5;14226:21;:::i;:::-;14219:5;14216:32;14206:60;;14262:1;14259;14252:12;14206:60;14156:116;:::o;14278:133::-;14321:5;14359:6;14346:20;14337:29;;14375:30;14399:5;14375:30;:::i;:::-;14278:133;;;;:::o;14417:468::-;14482:6;14490;14539:2;14527:9;14518:7;14514:23;14510:32;14507:119;;;14545:79;;:::i;:::-;14507:119;14665:1;14690:53;14735:7;14726:6;14715:9;14711:22;14690:53;:::i;:::-;14680:63;;14636:117;14792:2;14818:50;14860:7;14851:6;14840:9;14836:22;14818:50;:::i;:::-;14808:60;;14763:115;14417:468;;;;;:::o;14891:307::-;14952:4;15042:18;15034:6;15031:30;15028:56;;;15064:18;;:::i;:::-;15028:56;15102:29;15124:6;15102:29;:::i;:::-;15094:37;;15186:4;15180;15176:15;15168:23;;14891:307;;;:::o;15204:410::-;15281:5;15306:65;15322:48;15363:6;15322:48;:::i;:::-;15306:65;:::i;:::-;15297:74;;15394:6;15387:5;15380:21;15432:4;15425:5;15421:16;15470:3;15461:6;15456:3;15452:16;15449:25;15446:112;;;15477:79;;:::i;:::-;15446:112;15567:41;15601:6;15596:3;15591;15567:41;:::i;:::-;15287:327;15204:410;;;;;:::o;15633:338::-;15688:5;15737:3;15730:4;15722:6;15718:17;15714:27;15704:122;;15745:79;;:::i;:::-;15704:122;15862:6;15849:20;15887:78;15961:3;15953:6;15946:4;15938:6;15934:17;15887:78;:::i;:::-;15878:87;;15694:277;15633:338;;;;:::o;15977:943::-;16072:6;16080;16088;16096;16145:3;16133:9;16124:7;16120:23;16116:33;16113:120;;;16152:79;;:::i;:::-;16113:120;16272:1;16297:53;16342:7;16333:6;16322:9;16318:22;16297:53;:::i;:::-;16287:63;;16243:117;16399:2;16425:53;16470:7;16461:6;16450:9;16446:22;16425:53;:::i;:::-;16415:63;;16370:118;16527:2;16553:53;16598:7;16589:6;16578:9;16574:22;16553:53;:::i;:::-;16543:63;;16498:118;16683:2;16672:9;16668:18;16655:32;16714:18;16706:6;16703:30;16700:117;;;16736:79;;:::i;:::-;16700:117;16841:62;16895:7;16886:6;16875:9;16871:22;16841:62;:::i;:::-;16831:72;;16626:287;15977:943;;;;;;;:::o;16926:180::-;16974:77;16971:1;16964:88;17071:4;17068:1;17061:15;17095:4;17092:1;17085:15;17112:116;17196:1;17189:5;17186:12;17176:46;;17202:18;;:::i;:::-;17176:46;17112:116;:::o;17234:133::-;17282:7;17311:5;17300:16;;17317:44;17355:5;17317:44;:::i;:::-;17234:133;;;:::o;17373:::-;17432:9;17465:35;17494:5;17465:35;:::i;:::-;17452:48;;17373:133;;;:::o;17512:149::-;17608:46;17648:5;17608:46;:::i;:::-;17603:3;17596:59;17512:149;;:::o;17667:240::-;17769:4;17807:2;17796:9;17792:18;17784:26;;17820:80;17897:1;17886:9;17882:17;17873:6;17820:80;:::i;:::-;17667:240;;;;:::o;17913:963::-;18010:6;18018;18026;18034;18042;18091:3;18079:9;18070:7;18066:23;18062:33;18059:120;;;18098:79;;:::i;:::-;18059:120;18218:1;18243:53;18288:7;18279:6;18268:9;18264:22;18243:53;:::i;:::-;18233:63;;18189:117;18345:2;18371:53;18416:7;18407:6;18396:9;18392:22;18371:53;:::i;:::-;18361:63;;18316:118;18473:2;18499:53;18544:7;18535:6;18524:9;18520:22;18499:53;:::i;:::-;18489:63;;18444:118;18629:2;18618:9;18614:18;18601:32;18660:18;18652:6;18649:30;18646:117;;;18682:79;;:::i;:::-;18646:117;18795:64;18851:7;18842:6;18831:9;18827:22;18795:64;:::i;:::-;18777:82;;;;18572:297;17913:963;;;;;;;;:::o;18882:474::-;18950:6;18958;19007:2;18995:9;18986:7;18982:23;18978:32;18975:119;;;19013:79;;:::i;:::-;18975:119;19133:1;19158:53;19203:7;19194:6;19183:9;19179:22;19158:53;:::i;:::-;19148:63;;19104:117;19260:2;19286:53;19331:7;19322:6;19311:9;19307:22;19286:53;:::i;:::-;19276:63;;19231:118;18882:474;;;;;:::o;19362:180::-;19410:77;19407:1;19400:88;19507:4;19504:1;19497:15;19531:4;19528:1;19521:15;19548:320;19592:6;19629:1;19623:4;19619:12;19609:22;;19676:1;19670:4;19666:12;19697:18;19687:81;;19753:4;19745:6;19741:17;19731:27;;19687:81;19815:2;19807:6;19804:14;19784:18;19781:38;19778:84;;19834:18;;:::i;:::-;19778:84;19599:269;19548:320;;;:::o;19874:368::-;20013:4;20051:2;20040:9;20036:18;20028:26;;20064:80;20141:1;20130:9;20126:17;20117:6;20064:80;:::i;:::-;20154:81;20231:2;20220:9;20216:18;20207:6;20154:81;:::i;:::-;19874:368;;;;;:::o;20248:180::-;20296:77;20293:1;20286:88;20393:4;20390:1;20383:15;20417:4;20414:1;20407:15;20434:348;20474:7;20497:20;20515:1;20497:20;:::i;:::-;20492:25;;20531:20;20549:1;20531:20;:::i;:::-;20526:25;;20719:1;20651:66;20647:74;20644:1;20641:81;20636:1;20629:9;20622:17;20618:105;20615:131;;;20726:18;;:::i;:::-;20615:131;20774:1;20771;20767:9;20756:20;;20434:348;;;;:::o;20788:305::-;20828:3;20847:20;20865:1;20847:20;:::i;:::-;20842:25;;20881:20;20899:1;20881:20;:::i;:::-;20876:25;;21035:1;20967:66;20963:74;20960:1;20957:81;20954:107;;;21041:18;;:::i;:::-;20954:107;21085:1;21082;21078:9;21071:16;;20788:305;;;;:::o;21099:234::-;21239:34;21235:1;21227:6;21223:14;21216:58;21308:17;21303:2;21295:6;21291:15;21284:42;21099:234;:::o;21339:366::-;21481:3;21502:67;21566:2;21561:3;21502:67;:::i;:::-;21495:74;;21578:93;21667:3;21578:93;:::i;:::-;21696:2;21691:3;21687:12;21680:19;;21339:366;;;:::o;21711:419::-;21877:4;21915:2;21904:9;21900:18;21892:26;;21964:9;21958:4;21954:20;21950:1;21939:9;21935:17;21928:47;21992:131;22118:4;21992:131;:::i;:::-;21984:139;;21711:419;;;:::o;22136:147::-;22237:11;22274:3;22259:18;;22136:147;;;;:::o;22289:114::-;;:::o;22409:398::-;22568:3;22589:83;22670:1;22665:3;22589:83;:::i;:::-;22582:90;;22681:93;22770:3;22681:93;:::i;:::-;22799:1;22794:3;22790:11;22783:18;;22409:398;;;:::o;22813:379::-;22997:3;23019:147;23162:3;23019:147;:::i;:::-;23012:154;;23183:3;23176:10;;22813:379;;;:::o;23198:180::-;23246:77;23243:1;23236:88;23343:4;23340:1;23333:15;23367:4;23364:1;23357:15;23384:233;23423:3;23446:24;23464:5;23446:24;:::i;:::-;23437:33;;23492:66;23485:5;23482:77;23479:103;;23562:18;;:::i;:::-;23479:103;23609:1;23602:5;23598:13;23591:20;;23384:233;;;:::o;23623:148::-;23725:11;23762:3;23747:18;;23623:148;;;;:::o;23777:377::-;23883:3;23911:39;23944:5;23911:39;:::i;:::-;23966:89;24048:6;24043:3;23966:89;:::i;:::-;23959:96;;24064:52;24109:6;24104:3;24097:4;24090:5;24086:16;24064:52;:::i;:::-;24141:6;24136:3;24132:16;24125:23;;23887:267;23777:377;;;;:::o;24160:435::-;24340:3;24362:95;24453:3;24444:6;24362:95;:::i;:::-;24355:102;;24474:95;24565:3;24556:6;24474:95;:::i;:::-;24467:102;;24586:3;24579:10;;24160:435;;;;;:::o;24601:553::-;24778:4;24816:3;24805:9;24801:19;24793:27;;24830:71;24898:1;24887:9;24883:17;24874:6;24830:71;:::i;:::-;24911:72;24979:2;24968:9;24964:18;24955:6;24911:72;:::i;:::-;24993;25061:2;25050:9;25046:18;25037:6;24993:72;:::i;:::-;25075;25143:2;25132:9;25128:18;25119:6;25075:72;:::i;:::-;24601:553;;;;;;;:::o;25160:173::-;25300:25;25296:1;25288:6;25284:14;25277:49;25160:173;:::o;25339:402::-;25499:3;25520:85;25602:2;25597:3;25520:85;:::i;:::-;25513:92;;25614:93;25703:3;25614:93;:::i;:::-;25732:2;25727:3;25723:12;25716:19;;25339:402;;;:::o;25747:167::-;25887:19;25883:1;25875:6;25871:14;25864:43;25747:167;:::o;25920:402::-;26080:3;26101:85;26183:2;26178:3;26101:85;:::i;:::-;26094:92;;26195:93;26284:3;26195:93;:::i;:::-;26313:2;26308:3;26304:12;26297:19;;25920:402;;;:::o;26328:967::-;26710:3;26732:148;26876:3;26732:148;:::i;:::-;26725:155;;26897:95;26988:3;26979:6;26897:95;:::i;:::-;26890:102;;27009:148;27153:3;27009:148;:::i;:::-;27002:155;;27174:95;27265:3;27256:6;27174:95;:::i;:::-;27167:102;;27286:3;27279:10;;26328:967;;;;;:::o;27301:98::-;27352:6;27386:5;27380:12;27370:22;;27301:98;;;:::o;27405:168::-;27488:11;27522:6;27517:3;27510:19;27562:4;27557:3;27553:14;27538:29;;27405:168;;;;:::o;27579:360::-;27665:3;27693:38;27725:5;27693:38;:::i;:::-;27747:70;27810:6;27805:3;27747:70;:::i;:::-;27740:77;;27826:52;27871:6;27866:3;27859:4;27852:5;27848:16;27826:52;:::i;:::-;27903:29;27925:6;27903:29;:::i;:::-;27898:3;27894:39;27887:46;;27669:270;27579:360;;;;:::o;27945:640::-;28140:4;28178:3;28167:9;28163:19;28155:27;;28192:71;28260:1;28249:9;28245:17;28236:6;28192:71;:::i;:::-;28273:72;28341:2;28330:9;28326:18;28317:6;28273:72;:::i;:::-;28355;28423:2;28412:9;28408:18;28399:6;28355:72;:::i;:::-;28474:9;28468:4;28464:20;28459:2;28448:9;28444:18;28437:48;28502:76;28573:4;28564:6;28502:76;:::i;:::-;28494:84;;27945:640;;;;;;;:::o;28591:141::-;28647:5;28678:6;28672:13;28663:22;;28694:32;28720:5;28694:32;:::i;:::-;28591:141;;;;:::o;28738:349::-;28807:6;28856:2;28844:9;28835:7;28831:23;28827:32;28824:119;;;28862:79;;:::i;:::-;28824:119;28982:1;29007:63;29062:7;29053:6;29042:9;29038:22;29007:63;:::i;:::-;28997:73;;28953:127;28738:349;;;;:::o;29093:180::-;29141:77;29138:1;29131:88;29238:4;29235:1;29228:15;29262:4;29259:1;29252:15;29279:185;29319:1;29336:20;29354:1;29336:20;:::i;:::-;29331:25;;29370:20;29388:1;29370:20;:::i;:::-;29365:25;;29409:1;29399:35;;29414:18;;:::i;:::-;29399:35;29456:1;29453;29449:9;29444:14;;29279:185;;;;:::o;29470:191::-;29510:4;29530:20;29548:1;29530:20;:::i;:::-;29525:25;;29564:20;29582:1;29564:20;:::i;:::-;29559:25;;29603:1;29600;29597:8;29594:34;;;29608:18;;:::i;:::-;29594:34;29653:1;29650;29646:9;29638:17;;29470:191;;;;:::o;29667:176::-;29699:1;29716:20;29734:1;29716:20;:::i;:::-;29711:25;;29750:20;29768:1;29750:20;:::i;:::-;29745:25;;29789:1;29779:35;;29794:18;;:::i;:::-;29779:35;29835:1;29832;29828:9;29823:14;;29667:176;;;;:::o;29849:171::-;29888:3;29911:24;29929:5;29911:24;:::i;:::-;29902:33;;29957:4;29950:5;29947:15;29944:41;;29965:18;;:::i;:::-;29944:41;30012:1;30005:5;30001:13;29994:20;;29849:171;;;:::o;30026:182::-;30166:34;30162:1;30154:6;30150:14;30143:58;30026:182;:::o;30214:366::-;30356:3;30377:67;30441:2;30436:3;30377:67;:::i;:::-;30370:74;;30453:93;30542:3;30453:93;:::i;:::-;30571:2;30566:3;30562:12;30555:19;;30214:366;;;:::o;30586:419::-;30752:4;30790:2;30779:9;30775:18;30767:26;;30839:9;30833:4;30829:20;30825:1;30814:9;30810:17;30803:47;30867:131;30993:4;30867:131;:::i;:::-;30859:139;;30586:419;;;:::o;31011:174::-;31151:26;31147:1;31139:6;31135:14;31128:50;31011:174;:::o;31191:366::-;31333:3;31354:67;31418:2;31413:3;31354:67;:::i;:::-;31347:74;;31430:93;31519:3;31430:93;:::i;:::-;31548:2;31543:3;31539:12;31532:19;;31191:366;;;:::o;31563:419::-;31729:4;31767:2;31756:9;31752:18;31744:26;;31816:9;31810:4;31806:20;31802:1;31791:9;31787:17;31780:47;31844:131;31970:4;31844:131;:::i;:::-;31836:139;;31563:419;;;:::o;31988:181::-;32128:33;32124:1;32116:6;32112:14;32105:57;31988:181;:::o;32175:366::-;32317:3;32338:67;32402:2;32397:3;32338:67;:::i;:::-;32331:74;;32414:93;32503:3;32414:93;:::i;:::-;32532:2;32527:3;32523:12;32516:19;;32175:366;;;:::o;32547:419::-;32713:4;32751:2;32740:9;32736:18;32728:26;;32800:9;32794:4;32790:20;32786:1;32775:9;32771:17;32764:47;32828:131;32954:4;32828:131;:::i;:::-;32820:139;;32547:419;;;:::o;32972:221::-;33112:34;33108:1;33100:6;33096:14;33089:58;33181:4;33176:2;33168:6;33164:15;33157:29;32972:221;:::o;33199:366::-;33341:3;33362:67;33426:2;33421:3;33362:67;:::i;:::-;33355:74;;33438:93;33527:3;33438:93;:::i;:::-;33556:2;33551:3;33547:12;33540:19;;33199:366;;;:::o;33571:419::-;33737:4;33775:2;33764:9;33760:18;33752:26;;33824:9;33818:4;33814:20;33810:1;33799:9;33795:17;33788:47;33852:131;33978:4;33852:131;:::i;:::-;33844:139;;33571:419;;;:::o;33996:221::-;34136:34;34132:1;34124:6;34120:14;34113:58;34205:4;34200:2;34192:6;34188:15;34181:29;33996:221;:::o;34223:366::-;34365:3;34386:67;34450:2;34445:3;34386:67;:::i;:::-;34379:74;;34462:93;34551:3;34462:93;:::i;:::-;34580:2;34575:3;34571:12;34564:19;;34223:366;;;:::o;34595:419::-;34761:4;34799:2;34788:9;34784:18;34776:26;;34848:9;34842:4;34838:20;34834:1;34823:9;34819:17;34812:47;34876:131;35002:4;34876:131;:::i;:::-;34868:139;;34595:419;;;:::o;35020:214::-;35160:66;35156:1;35148:6;35144:14;35137:90;35020:214;:::o;35240:400::-;35400:3;35421:84;35503:1;35498:3;35421:84;:::i;:::-;35414:91;;35514:93;35603:3;35514:93;:::i;:::-;35632:1;35627:3;35623:11;35616:18;;35240:400;;;:::o;35646:79::-;35685:7;35714:5;35703:16;;35646:79;;;:::o;35731:157::-;35836:45;35856:24;35874:5;35856:24;:::i;:::-;35836:45;:::i;:::-;35831:3;35824:58;35731:157;;:::o;35894:663::-;36135:3;36157:148;36301:3;36157:148;:::i;:::-;36150:155;;36315:75;36386:3;36377:6;36315:75;:::i;:::-;36415:2;36410:3;36406:12;36399:19;;36428:75;36499:3;36490:6;36428:75;:::i;:::-;36528:2;36523:3;36519:12;36512:19;;36548:3;36541:10;;35894:663;;;;;:::o;36563:86::-;36598:7;36638:4;36631:5;36627:16;36616:27;;36563:86;;;:::o;36655:112::-;36738:22;36754:5;36738:22;:::i;:::-;36733:3;36726:35;36655:112;;:::o;36773:545::-;36946:4;36984:3;36973:9;36969:19;36961:27;;36998:71;37066:1;37055:9;37051:17;37042:6;36998:71;:::i;:::-;37079:68;37143:2;37132:9;37128:18;37119:6;37079:68;:::i;:::-;37157:72;37225:2;37214:9;37210:18;37201:6;37157:72;:::i;:::-;37239;37307:2;37296:9;37292:18;37283:6;37239:72;:::i;:::-;36773:545;;;;;;;:::o;37324:664::-;37529:4;37567:3;37556:9;37552:19;37544:27;;37581:71;37649:1;37638:9;37634:17;37625:6;37581:71;:::i;:::-;37662:72;37730:2;37719:9;37715:18;37706:6;37662:72;:::i;:::-;37744;37812:2;37801:9;37797:18;37788:6;37744:72;:::i;:::-;37826;37894:2;37883:9;37879:18;37870:6;37826:72;:::i;:::-;37908:73;37976:3;37965:9;37961:19;37952:6;37908:73;:::i;:::-;37324:664;;;;;;;;:::o
Swarm Source
ipfs://a0cf5b986d890096288cc6d9646e47512ea381bf8eea8c8c339d613722dcbafc
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.