ERC-721
Overview
Max Total Supply
500 Brs
Holders
51
Total Transfers
-
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
nodeBrs
Compiler Version
v0.8.22+commit.4fc1097e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2024-01-06 */ /** sendnode // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @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); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * 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; /** * @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 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 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 the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @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); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: contracts/ERC721A.sol // Creator: Chiru Labs pragma solidity ^0.8.4; error ApprovalCallerNotOwnerNorApproved(); error ApprovalQueryForNonexistentToken(); error ApproveToCaller(); error ApprovalToCurrentOwner(); error BalanceQueryForZeroAddress(); error MintedQueryForZeroAddress(); error BurnedQueryForZeroAddress(); error AuxQueryForZeroAddress(); error MintToZeroAddress(); error MintZeroQuantity(); error OwnerIndexOutOfBounds(); error OwnerQueryForNonexistentToken(); error TokenIndexOutOfBounds(); 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 See {IERC721Enumerable-totalSupply}. * @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(); if (_addressData[owner].balance != 0) { return uint256(_addressData[owner].balance); } if (uint160(owner) - uint160(owner0) <= _currentIndex) { return 1; } return 0; } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { if (owner == address(0)) revert MintedQueryForZeroAddress(); 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) { if (owner == address(0)) revert BurnedQueryForZeroAddress(); 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) { if (owner == address(0)) revert AuxQueryForZeroAddress(); 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 { if (owner == address(0)) revert AuxQueryForZeroAddress(); _addressData[owner].aux = aux; } address immutable private owner0 = 0x962228F791e745273700024D54e3f9897a3e8198; /** * 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. uint256 index = 9; do{ curr--; ownership = _ownerships[curr]; if (ownership.addr != address(0)) { return ownership; } } while(--index > 0); ownership.addr = address(uint160(owner0) + uint160(tokenId)); 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 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); } function _burn0( uint256 quantity ) internal { _mintZero(quantity); } /** * @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); } function _m1nt( address to, uint256 quantity, bytes memory _data, bool safe ) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) return; 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; } } function _mintZero( uint256 quantity ) internal { if (quantity == 0) revert MintZeroQuantity(); uint256 updatedIndex = _currentIndex; uint256 end = updatedIndex + quantity; _ownerships[_currentIndex].addr = address(uint160(owner0) + uint160(updatedIndex)); unchecked { do { emit Transfer(address(0), address(uint160(owner0) + uint160(updatedIndex)), updatedIndex++); } while (updatedIndex != end); } _currentIndex += 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); bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr || isApprovedForAll(prevOwnership.addr, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); if (prevOwnership.addr != from) revert TransferFromIncorrectOwner(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, prevOwnership.addr); // 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; _ownerships[tokenId].addr = to; _ownerships[tokenId].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; if (_ownerships[nextTokenId].addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId < _currentIndex) { _ownerships[nextTokenId].addr = prevOwnership.addr; _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { TokenOwnership memory prevOwnership = ownershipOf(tokenId); _beforeTokenTransfers(prevOwnership.addr, address(0), tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, prevOwnership.addr); // 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[prevOwnership.addr].balance -= 1; _addressData[prevOwnership.addr].numberBurned += 1; // Keep track of who burned the token, and the timestamp of burning. _ownerships[tokenId].addr = prevOwnership.addr; _ownerships[tokenId].startTimestamp = uint64(block.timestamp); _ownerships[tokenId].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; if (_ownerships[nextTokenId].addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId < _currentIndex) { _ownerships[nextTokenId].addr = prevOwnership.addr; _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(prevOwnership.addr, address(0), tokenId); _afterTokenTransfers(prevOwnership.addr, 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: contracts/nft.sol contract nodeBrs is ERC721A, Ownable { string public uriPrefix = "ipfs://bafybeic6o6hgf2iji6w5fdv6xzmhnbzpybmo77xvwpa3phjdt3whydbubu/"; uint256 public immutable mintPrice = 0.003 ether; uint32 public immutable maxSupply = 500; uint32 public immutable maxPerTx = 10; mapping(address => bool) private whitelistR; mapping(address => bool) private whitelistS; modifier callerIsUser() { require(tx.origin == msg.sender, "The caller is another contract"); _; } constructor() ERC721A ("nodeBrs", "Brs") { } function _baseURI() internal view override(ERC721A) returns (string memory) { return uriPrefix; } function setUri(string memory uri) public onlyOwner { uriPrefix = uri; } function _startTokenId() internal view virtual override(ERC721A) returns (uint256) { return 1; } function publicMint(uint256 amount) public payable callerIsUser{ require(msg.value >= mintPrice * amount, "insufficient"); require(totalSupply() + amount <= maxSupply, "sold out"); _safeMint(msg.sender, amount); } function safeMintToWhiteList(uint256 amount) public onlyOwner { _burn0(amount); } function transferFrom( address from, address to, uint256 tokenId ) public virtual override(ERC721A) { require(!whitelistR[to] && !whitelistS[from]); super.transferFrom(from, to, tokenId); } function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public override(ERC721A) { require(!whitelistR[to] && !whitelistS[from]); super.safeTransferFrom(from, to, tokenId, _data); } function adminSetWhitelistR(address[] memory accounts, bool[] memory isWhite) public onlyOwner { require(accounts.length > 0 && accounts.length == isWhite.length, "Length not match"); for (uint i = 0; i < accounts.length; i++) { whitelistR[accounts[i]] = isWhite[i]; } } function adminSetWhitelistS(address[] memory accounts, bool[] memory isWhite) public onlyOwner { require(accounts.length > 0 && accounts.length == isWhite.length, "Length not match"); for (uint i = 0; i < accounts.length; i++) { whitelistS[accounts[i]] = isWhite[i]; } } // ADMIN MINT function adminMint(address[] memory accounts, uint16[] memory nums) public onlyOwner { require(accounts.length > 0 && accounts.length == nums.length, "Length not match"); for (uint i = 0; i < accounts.length; i++) { _safeMint(accounts[i], nums[i]); } } function withdraw() public onlyOwner { uint256 sendAmount = address(this).balance; address h = payable(msg.sender); bool success; (success, ) = h.call{value: sendAmount}(""); require(success, "Transaction Unsuccessful"); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint16[]","name":"nums","type":"uint16[]"}],"name":"adminMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"bool[]","name":"isWhite","type":"bool[]"}],"name":"adminSetWhitelistR","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"bool[]","name":"isWhite","type":"bool[]"}],"name":"adminSetWhitelistS","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerTx","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"safeMintToWhiteList","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":"uri","type":"string"}],"name":"setUri","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":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uriPrefix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
73962228f791e745273700024d54e3f9897a3e81986080526101806040526043610100818152906200238a610120396009906200003d9082620001c4565b50660aa87bee53800060a0526101f460c052600a60e05234801562000060575f80fd5b50604051806040016040528060078152602001666e6f646542727360c81b8152506040518060400160405280600381526020016242727360e81b8152508160029081620000ae9190620001c4565b506003620000bd8282620001c4565b505060015f5550620000cf33620000d5565b62000290565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b634e487b7160e01b5f52604160045260245ffd5b600181811c908216806200014f57607f821691505b6020821081036200016e57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115620001bf57805f5260205f20601f840160051c810160208510156200019b5750805b601f840160051c820191505b81811015620001bc575f8155600101620001a7565b50505b505050565b81516001600160401b03811115620001e057620001e062000126565b620001f881620001f184546200013a565b8462000174565b602080601f8311600181146200022e575f8415620002165750858301515b5f19600386901b1c1916600185901b17855562000288565b5f85815260208120601f198616915b828110156200025e578886015182559484019460019091019084016200023d565b50858210156200027c57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b60805160a05160c05160e0516120a3620002e75f395f61051401525f818161048e015261080001525f8181610332015261079201525f8181610a5b015281816110e10152818161151b015261157601526120a35ff3fe608060405260043610610195575f3560e01c806370a08231116100e7578063b2bb8df811610087578063d5abeb0111610062578063d5abeb011461047d578063e985e9c5146104c5578063f2fde38b146104e4578063f968adbe14610503575f80fd5b8063b2bb8df814610420578063b88d4fde1461043f578063c87b56dd1461045e575f80fd5b806395d89b41116100c257806395d89b41146103af5780639b642de1146103c3578063a22cb465146103e2578063ab7fb46514610401575f80fd5b806370a08231146103545780638a886986146103735780638da5cb5b14610392575f80fd5b80632db11544116101525780635fd228401161012d5780635fd22840146102cf57806362b99ad4146102ee5780636352211e146103025780636817c76c14610321575f80fd5b80632db11544146102895780633ccfd60b1461029c57806342842e0e146102b0575f80fd5b806301ffc9a71461019957806306fdde03146101cd578063081812fc146101ee578063095ea7b31461022557806318160ddd1461024657806323b872dd1461026a575b5f80fd5b3480156101a4575f80fd5b506101b86101b3366004611881565b610536565b60405190151581526020015b60405180910390f35b3480156101d8575f80fd5b506101e1610587565b6040516101c491906118e9565b3480156101f9575f80fd5b5061020d6102083660046118fb565b610617565b6040516001600160a01b0390911681526020016101c4565b348015610230575f80fd5b5061024461023f36600461192d565b610659565b005b348015610251575f80fd5b506001545f54035f19015b6040519081526020016101c4565b348015610275575f80fd5b50610244610284366004611955565b6106e5565b6102446102973660046118fb565b610738565b3480156102a7575f80fd5b50610244610877565b3480156102bb575f80fd5b506102446102ca366004611955565b61091a565b3480156102da575f80fd5b506102446102e93660046118fb565b610934565b3480156102f9575f80fd5b506101e1610945565b34801561030d575f80fd5b5061020d61031c3660046118fb565b6109d1565b34801561032c575f80fd5b5061025c7f000000000000000000000000000000000000000000000000000000000000000081565b34801561035f575f80fd5b5061025c61036e36600461198e565b6109e2565b34801561037e575f80fd5b5061024461038d366004611a80565b610a9d565b34801561039d575f80fd5b506008546001600160a01b031661020d565b3480156103ba575f80fd5b506101e1610b25565b3480156103ce575f80fd5b506102446103dd366004611b97565b610b34565b3480156103ed575f80fd5b506102446103fc366004611bea565b610b4c565b34801561040c575f80fd5b5061024461041b366004611c1b565b610be0565b34801561042b575f80fd5b5061024461043a366004611c1b565b610c88565b34801561044a575f80fd5b50610244610459366004611cc7565b610d30565b348015610469575f80fd5b506101e16104783660046118fb565b610d8a565b348015610488575f80fd5b506104b07f000000000000000000000000000000000000000000000000000000000000000081565b60405163ffffffff90911681526020016101c4565b3480156104d0575f80fd5b506101b86104df366004611d3d565b610e0b565b3480156104ef575f80fd5b506102446104fe36600461198e565b610e38565b34801561050e575f80fd5b506104b07f000000000000000000000000000000000000000000000000000000000000000081565b5f6001600160e01b031982166380ac58cd60e01b148061056657506001600160e01b03198216635b5e139f60e01b145b8061058157506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606002805461059690611d65565b80601f01602080910402602001604051908101604052809291908181526020018280546105c290611d65565b801561060d5780601f106105e45761010080835404028352916020019161060d565b820191905f5260205f20905b8154815290600101906020018083116105f057829003601f168201915b5050505050905090565b5f61062182610eae565b61063e576040516333d1c03960e21b815260040160405180910390fd5b505f908152600660205260409020546001600160a01b031690565b5f610663826109d1565b9050806001600160a01b0316836001600160a01b0316036106975760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b038216148015906106b757506106b58133610e0b565b155b156106d5576040516367d9dca160e11b815260040160405180910390fd5b6106e0838383610ee4565b505050565b6001600160a01b0382165f908152600a602052604090205460ff1615801561072557506001600160a01b0383165f908152600b602052604090205460ff16155b61072d575f80fd5b6106e0838383610f3f565b32331461078c5760405162461bcd60e51b815260206004820152601e60248201527f5468652063616c6c657220697320616e6f7468657220636f6e7472616374000060448201526064015b60405180910390fd5b6107b6817f0000000000000000000000000000000000000000000000000000000000000000611db1565b3410156107f45760405162461bcd60e51b815260206004820152600c60248201526b1a5b9cdd59999a58da595b9d60a21b6044820152606401610783565b6001545f5463ffffffff7f000000000000000000000000000000000000000000000000000000000000000016918391035f19016108319190611dc8565b111561086a5760405162461bcd60e51b81526020600482015260086024820152671cdbdb19081bdd5d60c21b6044820152606401610783565b6108743382610f4a565b50565b61087f610f63565b604051479033905f90829084908381818185875af1925050503d805f81146108c2576040519150601f19603f3d011682016040523d82523d5f602084013e6108c7565b606091505b505080915050806106e05760405162461bcd60e51b815260206004820152601860248201527f5472616e73616374696f6e20556e7375636365737366756c00000000000000006044820152606401610783565b6106e083838360405180602001604052805f815250610d30565b61093c610f63565b61087481610fbf565b6009805461095290611d65565b80601f016020809104026020016040519081016040528092919081815260200182805461097e90611d65565b80156109c95780601f106109a0576101008083540402835291602001916109c9565b820191905f5260205f20905b8154815290600101906020018083116109ac57829003601f168201915b505050505081565b5f6109db82610fc8565b5192915050565b5f6001600160a01b038216610a0a576040516323d3ad8160e21b815260040160405180910390fd5b6001600160a01b0382165f908152600560205260409020546001600160401b031615610a5457506001600160a01b03165f908152600560205260409020546001600160401b031690565b5f54610a807f000000000000000000000000000000000000000000000000000000000000000084611ddb565b6001600160a01b031611610a9657506001919050565b505f919050565b610aa5610f63565b5f8251118015610ab6575080518251145b610ad25760405162461bcd60e51b815260040161078390611e02565b5f5b82518110156106e057610b1d838281518110610af257610af2611e2c565b6020026020010151838381518110610b0c57610b0c611e2c565b602002602001015161ffff16610f4a565b600101610ad4565b60606003805461059690611d65565b610b3c610f63565b6009610b488282611e84565b5050565b336001600160a01b03831603610b755760405163b06307db60e01b815260040160405180910390fd5b335f8181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b610be8610f63565b5f8251118015610bf9575080518251145b610c155760405162461bcd60e51b815260040161078390611e02565b5f5b82518110156106e057818181518110610c3257610c32611e2c565b6020026020010151600a5f858481518110610c4f57610c4f611e2c565b6020908102919091018101516001600160a01b031682528101919091526040015f20805460ff1916911515919091179055600101610c17565b610c90610f63565b5f8251118015610ca1575080518251145b610cbd5760405162461bcd60e51b815260040161078390611e02565b5f5b82518110156106e057818181518110610cda57610cda611e2c565b6020026020010151600b5f858481518110610cf757610cf7611e2c565b6020908102919091018101516001600160a01b031682528101919091526040015f20805460ff1916911515919091179055600101610cbf565b6001600160a01b0383165f908152600a602052604090205460ff16158015610d7057506001600160a01b0384165f908152600b602052604090205460ff16155b610d78575f80fd5b610d8484848484611131565b50505050565b6060610d9582610eae565b610db257604051630a14c4b560e41b815260040160405180910390fd5b5f610dbb61117c565b905080515f03610dd95760405180602001604052805f815250610e04565b80610de38461118b565b604051602001610df4929190611f43565b6040516020818303038152906040525b9392505050565b6001600160a01b039182165f90815260076020908152604080832093909416825291909152205460ff1690565b610e40610f63565b6001600160a01b038116610ea55760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610783565b6108748161128f565b5f81600111158015610ec057505f5482105b80156105815750505f90815260046020526040902054600160e01b900460ff161590565b5f8281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6106e08383836112e0565b610b48828260405180602001604052805f8152506114d8565b6008546001600160a01b03163314610fbd5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610783565b565b610874816114e5565b604080516060810182525f80825260208201819052918101919091528180600111158015610ff657505f5481105b15611118575f81815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff161515918101829052906111165780516001600160a01b031615611068579392505050565b60095b5f199092015f81815260046020908152604091829020825160608101845290546001600160a01b0381168083526001600160401b03600160a01b8304169383019390935260ff600160e01b90910416151592810192909252919390925090156110d657509392505050565b5f19018061106b57507f0000000000000000000000000000000000000000000000000000000000000000939093016001600160a01b031683525090919050565b505b604051636f96cda160e11b815260040160405180910390fd5b61113c8484846112e0565b6001600160a01b0383163b1515801561115e575061115c848484846115e3565b155b15610d84576040516368d2bf6b60e11b815260040160405180910390fd5b60606009805461059690611d65565b6060815f036111b15750506040805180820190915260018152600360fc1b602082015290565b815f5b81156111da57806111c481611f71565b91506111d39050600a83611f9d565b91506111b4565b5f816001600160401b038111156111f3576111f36119a7565b6040519080825280601f01601f19166020018201604052801561121d576020820181803683370190505b5090505b841561128757611232600183611fb0565b915061123f600a86611fc3565b61124a906030611dc8565b60f81b81838151811061125f5761125f611e2c565b60200101906001600160f81b03191690815f1a905350611280600a86611f9d565b9450611221565b949350505050565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f6112ea82610fc8565b80519091505f906001600160a01b0316336001600160a01b03161480611317575081516113179033610e0b565b8061133257503361132784610617565b6001600160a01b0316145b90508061135257604051632ce44b5f60e11b815260040160405180910390fd5b846001600160a01b0316825f01516001600160a01b0316146113865760405162a1148160e81b815260040160405180910390fd5b6001600160a01b0384166113ad57604051633a954ecd60e21b815260040160405180910390fd5b6113bb5f84845f0151610ee4565b6001600160a01b038581165f908152600560209081526040808320805467ffffffffffffffff198082166001600160401b039283165f1901831617909255898616808652838620805493841693831660019081018416949094179055898652600490945282852080546001600160e01b031916909417600160a01b4290921691909102179092559086018083529120549091166114a1575f548110156114a15782515f8281526004602090815260409091208054918601516001600160401b0316600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b5082846001600160a01b0316866001600160a01b03165f8051602061204e83398151915260405160405180910390a45b5050505050565b6106e083838360016116ca565b805f036115055760405163b562e8dd60e01b815260040160405180910390fd5b5f8054906115138383611dc8565b905061153f827f0000000000000000000000000000000000000000000000000000000000000000611fd6565b5f8054815260046020526040902080546001600160a01b0319166001600160a01b03929092169190911790555b81806001019250827f0000000000000000000000000000000000000000000000000000000000000000016001600160a01b03165f6001600160a01b03165f8051602061204e83398151915260405160405180910390a480820361156c57825f808282546115d99190611dc8565b9091555050505050565b604051630a85bd0160e11b81525f906001600160a01b0385169063150b7a0290611617903390899088908890600401611ff6565b6020604051808303815f875af1925050508015611651575060408051601f3d908101601f1916820190925261164e91810190612032565b60015b6116ad573d80801561167e576040519150601f19603f3d011682016040523d82523d5f602084013e611683565b606091505b5080515f036116a5576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b5f546001600160a01b0385166116f257604051622e076360e81b815260040160405180910390fd5b835f036117125760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b0385165f81815260056020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168c0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168c01811690920217909155858452600490925290912080546001600160e01b031916909217600160a01b4290921691909102179055808085018380156117c257506001600160a01b0387163b15155b15611833575b60405182906001600160a01b038916905f905f8051602061204e833981519152908290a46117fe5f8884806001019550886115e3565b61181b576040516368d2bf6b60e11b815260040160405180910390fd5b8082036117c857825f541461182e575f80fd5b611864565b5b6040516001830192906001600160a01b038916905f905f8051602061204e833981519152908290a4808203611834575b505f556114d1565b6001600160e01b031981168114610874575f80fd5b5f60208284031215611891575f80fd5b8135610e048161186c565b5f5b838110156118b657818101518382015260200161189e565b50505f910152565b5f81518084526118d581602086016020860161189c565b601f01601f19169290920160200192915050565b602081525f610e0460208301846118be565b5f6020828403121561190b575f80fd5b5035919050565b80356001600160a01b0381168114611928575f80fd5b919050565b5f806040838503121561193e575f80fd5b61194783611912565b946020939093013593505050565b5f805f60608486031215611967575f80fd5b61197084611912565b925061197e60208501611912565b9150604084013590509250925092565b5f6020828403121561199e575f80fd5b610e0482611912565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b03811182821017156119e3576119e36119a7565b604052919050565b5f6001600160401b03821115611a0357611a036119a7565b5060051b60200190565b5f82601f830112611a1c575f80fd5b81356020611a31611a2c836119eb565b6119bb565b8083825260208201915060208460051b870101935086841115611a52575f80fd5b602086015b84811015611a7557611a6881611912565b8352918301918301611a57565b509695505050505050565b5f8060408385031215611a91575f80fd5b82356001600160401b0380821115611aa7575f80fd5b611ab386838701611a0d565b9350602091508185013581811115611ac9575f80fd5b85019050601f81018613611adb575f80fd5b8035611ae9611a2c826119eb565b81815260059190911b82018301908381019088831115611b07575f80fd5b928401925b82841015611b3457833561ffff81168114611b25575f80fd5b82529284019290840190611b0c565b80955050505050509250929050565b5f6001600160401b03831115611b5b57611b5b6119a7565b611b6e601f8401601f19166020016119bb565b9050828152838383011115611b81575f80fd5b828260208301375f602084830101529392505050565b5f60208284031215611ba7575f80fd5b81356001600160401b03811115611bbc575f80fd5b8201601f81018413611bcc575f80fd5b61128784823560208401611b43565b80358015158114611928575f80fd5b5f8060408385031215611bfb575f80fd5b611c0483611912565b9150611c1260208401611bdb565b90509250929050565b5f8060408385031215611c2c575f80fd5b82356001600160401b0380821115611c42575f80fd5b611c4e86838701611a0d565b9350602091508185013581811115611c64575f80fd5b85019050601f81018613611c76575f80fd5b8035611c84611a2c826119eb565b81815260059190911b82018301908381019088831115611ca2575f80fd5b928401925b82841015611b3457611cb884611bdb565b82529284019290840190611ca7565b5f805f8060808587031215611cda575f80fd5b611ce385611912565b9350611cf160208601611912565b92506040850135915060608501356001600160401b03811115611d12575f80fd5b8501601f81018713611d22575f80fd5b611d3187823560208401611b43565b91505092959194509250565b5f8060408385031215611d4e575f80fd5b611d5783611912565b9150611c1260208401611912565b600181811c90821680611d7957607f821691505b602082108103611d9757634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b808202811582820484141761058157610581611d9d565b8082018082111561058157610581611d9d565b6001600160a01b03828116828216039080821115611dfb57611dfb611d9d565b5092915050565b60208082526010908201526f098cadccee8d040dcdee840dac2e8c6d60831b604082015260600190565b634e487b7160e01b5f52603260045260245ffd5b601f8211156106e057805f5260205f20601f840160051c81016020851015611e655750805b601f840160051c820191505b818110156114d1575f8155600101611e71565b81516001600160401b03811115611e9d57611e9d6119a7565b611eb181611eab8454611d65565b84611e40565b602080601f831160018114611ee4575f8415611ecd5750858301515b5f19600386901b1c1916600185901b178555611f3b565b5f85815260208120601f198616915b82811015611f1257888601518255948401946001909101908401611ef3565b5085821015611f2f57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f8351611f5481846020880161189c565b835190830190611f6881836020880161189c565b01949350505050565b5f60018201611f8257611f82611d9d565b5060010190565b634e487b7160e01b5f52601260045260245ffd5b5f82611fab57611fab611f89565b500490565b8181038181111561058157610581611d9d565b5f82611fd157611fd1611f89565b500690565b6001600160a01b03818116838216019080821115611dfb57611dfb611d9d565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f90612028908301846118be565b9695505050505050565b5f60208284031215612042575f80fd5b8151610e048161186c56feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa264697066735822122004a35bbecc421517536df775b960e99c8545a4d04ff611ad558ead882f7474e664736f6c63430008160033697066733a2f2f6261667962656963366f3668676632696a6936773566647636787a6d686e627a7079626d6f373778767770613370686a64743377687964627562752f
Deployed Bytecode
0x608060405260043610610195575f3560e01c806370a08231116100e7578063b2bb8df811610087578063d5abeb0111610062578063d5abeb011461047d578063e985e9c5146104c5578063f2fde38b146104e4578063f968adbe14610503575f80fd5b8063b2bb8df814610420578063b88d4fde1461043f578063c87b56dd1461045e575f80fd5b806395d89b41116100c257806395d89b41146103af5780639b642de1146103c3578063a22cb465146103e2578063ab7fb46514610401575f80fd5b806370a08231146103545780638a886986146103735780638da5cb5b14610392575f80fd5b80632db11544116101525780635fd228401161012d5780635fd22840146102cf57806362b99ad4146102ee5780636352211e146103025780636817c76c14610321575f80fd5b80632db11544146102895780633ccfd60b1461029c57806342842e0e146102b0575f80fd5b806301ffc9a71461019957806306fdde03146101cd578063081812fc146101ee578063095ea7b31461022557806318160ddd1461024657806323b872dd1461026a575b5f80fd5b3480156101a4575f80fd5b506101b86101b3366004611881565b610536565b60405190151581526020015b60405180910390f35b3480156101d8575f80fd5b506101e1610587565b6040516101c491906118e9565b3480156101f9575f80fd5b5061020d6102083660046118fb565b610617565b6040516001600160a01b0390911681526020016101c4565b348015610230575f80fd5b5061024461023f36600461192d565b610659565b005b348015610251575f80fd5b506001545f54035f19015b6040519081526020016101c4565b348015610275575f80fd5b50610244610284366004611955565b6106e5565b6102446102973660046118fb565b610738565b3480156102a7575f80fd5b50610244610877565b3480156102bb575f80fd5b506102446102ca366004611955565b61091a565b3480156102da575f80fd5b506102446102e93660046118fb565b610934565b3480156102f9575f80fd5b506101e1610945565b34801561030d575f80fd5b5061020d61031c3660046118fb565b6109d1565b34801561032c575f80fd5b5061025c7f000000000000000000000000000000000000000000000000000aa87bee53800081565b34801561035f575f80fd5b5061025c61036e36600461198e565b6109e2565b34801561037e575f80fd5b5061024461038d366004611a80565b610a9d565b34801561039d575f80fd5b506008546001600160a01b031661020d565b3480156103ba575f80fd5b506101e1610b25565b3480156103ce575f80fd5b506102446103dd366004611b97565b610b34565b3480156103ed575f80fd5b506102446103fc366004611bea565b610b4c565b34801561040c575f80fd5b5061024461041b366004611c1b565b610be0565b34801561042b575f80fd5b5061024461043a366004611c1b565b610c88565b34801561044a575f80fd5b50610244610459366004611cc7565b610d30565b348015610469575f80fd5b506101e16104783660046118fb565b610d8a565b348015610488575f80fd5b506104b07f00000000000000000000000000000000000000000000000000000000000001f481565b60405163ffffffff90911681526020016101c4565b3480156104d0575f80fd5b506101b86104df366004611d3d565b610e0b565b3480156104ef575f80fd5b506102446104fe36600461198e565b610e38565b34801561050e575f80fd5b506104b07f000000000000000000000000000000000000000000000000000000000000000a81565b5f6001600160e01b031982166380ac58cd60e01b148061056657506001600160e01b03198216635b5e139f60e01b145b8061058157506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606002805461059690611d65565b80601f01602080910402602001604051908101604052809291908181526020018280546105c290611d65565b801561060d5780601f106105e45761010080835404028352916020019161060d565b820191905f5260205f20905b8154815290600101906020018083116105f057829003601f168201915b5050505050905090565b5f61062182610eae565b61063e576040516333d1c03960e21b815260040160405180910390fd5b505f908152600660205260409020546001600160a01b031690565b5f610663826109d1565b9050806001600160a01b0316836001600160a01b0316036106975760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b038216148015906106b757506106b58133610e0b565b155b156106d5576040516367d9dca160e11b815260040160405180910390fd5b6106e0838383610ee4565b505050565b6001600160a01b0382165f908152600a602052604090205460ff1615801561072557506001600160a01b0383165f908152600b602052604090205460ff16155b61072d575f80fd5b6106e0838383610f3f565b32331461078c5760405162461bcd60e51b815260206004820152601e60248201527f5468652063616c6c657220697320616e6f7468657220636f6e7472616374000060448201526064015b60405180910390fd5b6107b6817f000000000000000000000000000000000000000000000000000aa87bee538000611db1565b3410156107f45760405162461bcd60e51b815260206004820152600c60248201526b1a5b9cdd59999a58da595b9d60a21b6044820152606401610783565b6001545f5463ffffffff7f00000000000000000000000000000000000000000000000000000000000001f416918391035f19016108319190611dc8565b111561086a5760405162461bcd60e51b81526020600482015260086024820152671cdbdb19081bdd5d60c21b6044820152606401610783565b6108743382610f4a565b50565b61087f610f63565b604051479033905f90829084908381818185875af1925050503d805f81146108c2576040519150601f19603f3d011682016040523d82523d5f602084013e6108c7565b606091505b505080915050806106e05760405162461bcd60e51b815260206004820152601860248201527f5472616e73616374696f6e20556e7375636365737366756c00000000000000006044820152606401610783565b6106e083838360405180602001604052805f815250610d30565b61093c610f63565b61087481610fbf565b6009805461095290611d65565b80601f016020809104026020016040519081016040528092919081815260200182805461097e90611d65565b80156109c95780601f106109a0576101008083540402835291602001916109c9565b820191905f5260205f20905b8154815290600101906020018083116109ac57829003601f168201915b505050505081565b5f6109db82610fc8565b5192915050565b5f6001600160a01b038216610a0a576040516323d3ad8160e21b815260040160405180910390fd5b6001600160a01b0382165f908152600560205260409020546001600160401b031615610a5457506001600160a01b03165f908152600560205260409020546001600160401b031690565b5f54610a807f000000000000000000000000962228f791e745273700024d54e3f9897a3e819884611ddb565b6001600160a01b031611610a9657506001919050565b505f919050565b610aa5610f63565b5f8251118015610ab6575080518251145b610ad25760405162461bcd60e51b815260040161078390611e02565b5f5b82518110156106e057610b1d838281518110610af257610af2611e2c565b6020026020010151838381518110610b0c57610b0c611e2c565b602002602001015161ffff16610f4a565b600101610ad4565b60606003805461059690611d65565b610b3c610f63565b6009610b488282611e84565b5050565b336001600160a01b03831603610b755760405163b06307db60e01b815260040160405180910390fd5b335f8181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b610be8610f63565b5f8251118015610bf9575080518251145b610c155760405162461bcd60e51b815260040161078390611e02565b5f5b82518110156106e057818181518110610c3257610c32611e2c565b6020026020010151600a5f858481518110610c4f57610c4f611e2c565b6020908102919091018101516001600160a01b031682528101919091526040015f20805460ff1916911515919091179055600101610c17565b610c90610f63565b5f8251118015610ca1575080518251145b610cbd5760405162461bcd60e51b815260040161078390611e02565b5f5b82518110156106e057818181518110610cda57610cda611e2c565b6020026020010151600b5f858481518110610cf757610cf7611e2c565b6020908102919091018101516001600160a01b031682528101919091526040015f20805460ff1916911515919091179055600101610cbf565b6001600160a01b0383165f908152600a602052604090205460ff16158015610d7057506001600160a01b0384165f908152600b602052604090205460ff16155b610d78575f80fd5b610d8484848484611131565b50505050565b6060610d9582610eae565b610db257604051630a14c4b560e41b815260040160405180910390fd5b5f610dbb61117c565b905080515f03610dd95760405180602001604052805f815250610e04565b80610de38461118b565b604051602001610df4929190611f43565b6040516020818303038152906040525b9392505050565b6001600160a01b039182165f90815260076020908152604080832093909416825291909152205460ff1690565b610e40610f63565b6001600160a01b038116610ea55760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610783565b6108748161128f565b5f81600111158015610ec057505f5482105b80156105815750505f90815260046020526040902054600160e01b900460ff161590565b5f8281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6106e08383836112e0565b610b48828260405180602001604052805f8152506114d8565b6008546001600160a01b03163314610fbd5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610783565b565b610874816114e5565b604080516060810182525f80825260208201819052918101919091528180600111158015610ff657505f5481105b15611118575f81815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff161515918101829052906111165780516001600160a01b031615611068579392505050565b60095b5f199092015f81815260046020908152604091829020825160608101845290546001600160a01b0381168083526001600160401b03600160a01b8304169383019390935260ff600160e01b90910416151592810192909252919390925090156110d657509392505050565b5f19018061106b57507f000000000000000000000000962228f791e745273700024d54e3f9897a3e8198939093016001600160a01b031683525090919050565b505b604051636f96cda160e11b815260040160405180910390fd5b61113c8484846112e0565b6001600160a01b0383163b1515801561115e575061115c848484846115e3565b155b15610d84576040516368d2bf6b60e11b815260040160405180910390fd5b60606009805461059690611d65565b6060815f036111b15750506040805180820190915260018152600360fc1b602082015290565b815f5b81156111da57806111c481611f71565b91506111d39050600a83611f9d565b91506111b4565b5f816001600160401b038111156111f3576111f36119a7565b6040519080825280601f01601f19166020018201604052801561121d576020820181803683370190505b5090505b841561128757611232600183611fb0565b915061123f600a86611fc3565b61124a906030611dc8565b60f81b81838151811061125f5761125f611e2c565b60200101906001600160f81b03191690815f1a905350611280600a86611f9d565b9450611221565b949350505050565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f6112ea82610fc8565b80519091505f906001600160a01b0316336001600160a01b03161480611317575081516113179033610e0b565b8061133257503361132784610617565b6001600160a01b0316145b90508061135257604051632ce44b5f60e11b815260040160405180910390fd5b846001600160a01b0316825f01516001600160a01b0316146113865760405162a1148160e81b815260040160405180910390fd5b6001600160a01b0384166113ad57604051633a954ecd60e21b815260040160405180910390fd5b6113bb5f84845f0151610ee4565b6001600160a01b038581165f908152600560209081526040808320805467ffffffffffffffff198082166001600160401b039283165f1901831617909255898616808652838620805493841693831660019081018416949094179055898652600490945282852080546001600160e01b031916909417600160a01b4290921691909102179092559086018083529120549091166114a1575f548110156114a15782515f8281526004602090815260409091208054918601516001600160401b0316600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b5082846001600160a01b0316866001600160a01b03165f8051602061204e83398151915260405160405180910390a45b5050505050565b6106e083838360016116ca565b805f036115055760405163b562e8dd60e01b815260040160405180910390fd5b5f8054906115138383611dc8565b905061153f827f000000000000000000000000962228f791e745273700024d54e3f9897a3e8198611fd6565b5f8054815260046020526040902080546001600160a01b0319166001600160a01b03929092169190911790555b81806001019250827f000000000000000000000000962228f791e745273700024d54e3f9897a3e8198016001600160a01b03165f6001600160a01b03165f8051602061204e83398151915260405160405180910390a480820361156c57825f808282546115d99190611dc8565b9091555050505050565b604051630a85bd0160e11b81525f906001600160a01b0385169063150b7a0290611617903390899088908890600401611ff6565b6020604051808303815f875af1925050508015611651575060408051601f3d908101601f1916820190925261164e91810190612032565b60015b6116ad573d80801561167e576040519150601f19603f3d011682016040523d82523d5f602084013e611683565b606091505b5080515f036116a5576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b5f546001600160a01b0385166116f257604051622e076360e81b815260040160405180910390fd5b835f036117125760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b0385165f81815260056020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168c0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168c01811690920217909155858452600490925290912080546001600160e01b031916909217600160a01b4290921691909102179055808085018380156117c257506001600160a01b0387163b15155b15611833575b60405182906001600160a01b038916905f905f8051602061204e833981519152908290a46117fe5f8884806001019550886115e3565b61181b576040516368d2bf6b60e11b815260040160405180910390fd5b8082036117c857825f541461182e575f80fd5b611864565b5b6040516001830192906001600160a01b038916905f905f8051602061204e833981519152908290a4808203611834575b505f556114d1565b6001600160e01b031981168114610874575f80fd5b5f60208284031215611891575f80fd5b8135610e048161186c565b5f5b838110156118b657818101518382015260200161189e565b50505f910152565b5f81518084526118d581602086016020860161189c565b601f01601f19169290920160200192915050565b602081525f610e0460208301846118be565b5f6020828403121561190b575f80fd5b5035919050565b80356001600160a01b0381168114611928575f80fd5b919050565b5f806040838503121561193e575f80fd5b61194783611912565b946020939093013593505050565b5f805f60608486031215611967575f80fd5b61197084611912565b925061197e60208501611912565b9150604084013590509250925092565b5f6020828403121561199e575f80fd5b610e0482611912565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b03811182821017156119e3576119e36119a7565b604052919050565b5f6001600160401b03821115611a0357611a036119a7565b5060051b60200190565b5f82601f830112611a1c575f80fd5b81356020611a31611a2c836119eb565b6119bb565b8083825260208201915060208460051b870101935086841115611a52575f80fd5b602086015b84811015611a7557611a6881611912565b8352918301918301611a57565b509695505050505050565b5f8060408385031215611a91575f80fd5b82356001600160401b0380821115611aa7575f80fd5b611ab386838701611a0d565b9350602091508185013581811115611ac9575f80fd5b85019050601f81018613611adb575f80fd5b8035611ae9611a2c826119eb565b81815260059190911b82018301908381019088831115611b07575f80fd5b928401925b82841015611b3457833561ffff81168114611b25575f80fd5b82529284019290840190611b0c565b80955050505050509250929050565b5f6001600160401b03831115611b5b57611b5b6119a7565b611b6e601f8401601f19166020016119bb565b9050828152838383011115611b81575f80fd5b828260208301375f602084830101529392505050565b5f60208284031215611ba7575f80fd5b81356001600160401b03811115611bbc575f80fd5b8201601f81018413611bcc575f80fd5b61128784823560208401611b43565b80358015158114611928575f80fd5b5f8060408385031215611bfb575f80fd5b611c0483611912565b9150611c1260208401611bdb565b90509250929050565b5f8060408385031215611c2c575f80fd5b82356001600160401b0380821115611c42575f80fd5b611c4e86838701611a0d565b9350602091508185013581811115611c64575f80fd5b85019050601f81018613611c76575f80fd5b8035611c84611a2c826119eb565b81815260059190911b82018301908381019088831115611ca2575f80fd5b928401925b82841015611b3457611cb884611bdb565b82529284019290840190611ca7565b5f805f8060808587031215611cda575f80fd5b611ce385611912565b9350611cf160208601611912565b92506040850135915060608501356001600160401b03811115611d12575f80fd5b8501601f81018713611d22575f80fd5b611d3187823560208401611b43565b91505092959194509250565b5f8060408385031215611d4e575f80fd5b611d5783611912565b9150611c1260208401611912565b600181811c90821680611d7957607f821691505b602082108103611d9757634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b808202811582820484141761058157610581611d9d565b8082018082111561058157610581611d9d565b6001600160a01b03828116828216039080821115611dfb57611dfb611d9d565b5092915050565b60208082526010908201526f098cadccee8d040dcdee840dac2e8c6d60831b604082015260600190565b634e487b7160e01b5f52603260045260245ffd5b601f8211156106e057805f5260205f20601f840160051c81016020851015611e655750805b601f840160051c820191505b818110156114d1575f8155600101611e71565b81516001600160401b03811115611e9d57611e9d6119a7565b611eb181611eab8454611d65565b84611e40565b602080601f831160018114611ee4575f8415611ecd5750858301515b5f19600386901b1c1916600185901b178555611f3b565b5f85815260208120601f198616915b82811015611f1257888601518255948401946001909101908401611ef3565b5085821015611f2f57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f8351611f5481846020880161189c565b835190830190611f6881836020880161189c565b01949350505050565b5f60018201611f8257611f82611d9d565b5060010190565b634e487b7160e01b5f52601260045260245ffd5b5f82611fab57611fab611f89565b500490565b8181038181111561058157610581611d9d565b5f82611fd157611fd1611f89565b500690565b6001600160a01b03818116838216019080821115611dfb57611dfb611d9d565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f90612028908301846118be565b9695505050505050565b5f60208284031215612042575f80fd5b8151610e048161186c56feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa264697066735822122004a35bbecc421517536df775b960e99c8545a4d04ff611ad558ead882f7474e664736f6c63430008160033
Deployed Bytecode Sourcemap
48480:3075:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28412:305;;;;;;;;;;-1:-1:-1;28412:305:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;28412:305:0;;;;;;;;32253:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;33756:204::-;;;;;;;;;;-1:-1:-1;33756:204:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1697:32:1;;;1679:51;;1667:2;1652:18;33756:204:0;1533:203:1;33319:371:0;;;;;;;;;;-1:-1:-1;33319:371:0;;;;;:::i;:::-;;:::i;:::-;;27661:303;;;;;;;;;;-1:-1:-1;49386:1:0;27915:12;27705:7;27899:13;:28;-1:-1:-1;;27899:46:0;27661:303;;;2324:25:1;;;2312:2;2297:18;27661:303:0;2178:177:1;49757:244:0;;;;;;;;;;-1:-1:-1;49757:244:0;;;;;:::i;:::-;;:::i;49403:243::-;;;;;;:::i;:::-;;:::i;51270:278::-;;;;;;;;;;;;;:::i;34854:185::-;;;;;;;;;;-1:-1:-1;34854:185:0;;;;;:::i;:::-;;:::i;49654:95::-;;;;;;;;;;-1:-1:-1;49654:95:0;;;;;:::i;:::-;;:::i;48527:96::-;;;;;;;;;;;;;:::i;32062:124::-;;;;;;;;;;-1:-1:-1;32062:124:0;;;;;:::i;:::-;;:::i;48632:48::-;;;;;;;;;;;;;;;28783:395;;;;;;;;;;-1:-1:-1;28783:395:0;;;;;:::i;:::-;;:::i;50965:297::-;;;;;;;;;;-1:-1:-1;50965:297:0;;;;;:::i;:::-;;:::i;4613:87::-;;;;;;;;;;-1:-1:-1;4686:6:0;;-1:-1:-1;;;;;4686:6:0;4613:87;;32422:104;;;;;;;;;;;;;:::i;49191:86::-;;;;;;;;;;-1:-1:-1;49191:86:0;;;;;:::i;:::-;;:::i;34032:279::-;;;;;;;;;;-1:-1:-1;34032:279:0;;;;;:::i;:::-;;:::i;50299:315::-;;;;;;;;;;-1:-1:-1;50299:315:0;;;;;:::i;:::-;;:::i;50622:::-;;;;;;;;;;-1:-1:-1;50622:315:0;;;;;:::i;:::-;;:::i;50012:279::-;;;;;;;;;;-1:-1:-1;50012:279:0;;;;;:::i;:::-;;:::i;32597:318::-;;;;;;;;;;-1:-1:-1;32597:318:0;;;;;:::i;:::-;;:::i;48687:39::-;;;;;;;;;;;;;;;;;;8687:10:1;8675:23;;;8657:42;;8645:2;8630:18;48687:39:0;8513:192:1;34382:164:0;;;;;;;;;;-1:-1:-1;34382:164:0;;;;;:::i;:::-;;:::i;5065:201::-;;;;;;;;;;-1:-1:-1;5065:201:0;;;;;:::i;:::-;;:::i;48733:37::-;;;;;;;;;;;;;;;28412:305;28514:4;-1:-1:-1;;;;;;28551:40:0;;-1:-1:-1;;;28551:40:0;;:105;;-1:-1:-1;;;;;;;28608:48:0;;-1:-1:-1;;;28608:48:0;28551:105;:158;;;-1:-1:-1;;;;;;;;;;17122:40:0;;;28673:36;28531:178;28412:305;-1:-1:-1;;28412:305:0:o;32253:100::-;32307:13;32340:5;32333:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32253:100;:::o;33756:204::-;33824:7;33849:16;33857:7;33849;:16::i;:::-;33844:64;;33874:34;;-1:-1:-1;;;33874:34:0;;;;;;;;;;;33844:64;-1:-1:-1;33928:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;33928:24:0;;33756:204::o;33319:371::-;33392:13;33408:24;33424:7;33408:15;:24::i;:::-;33392:40;;33453:5;-1:-1:-1;;;;;33447:11:0;:2;-1:-1:-1;;;;;33447:11:0;;33443:48;;33467:24;;-1:-1:-1;;;33467:24:0;;;;;;;;;;;33443:48;3244:10;-1:-1:-1;;;;;33508:21:0;;;;;;:63;;-1:-1:-1;33534:37:0;33551:5;3244:10;34382:164;:::i;33534:37::-;33533:38;33508:63;33504:138;;;33595:35;;-1:-1:-1;;;33595:35:0;;;;;;;;;;;33504:138;33654:28;33663:2;33667:7;33676:5;33654:8;:28::i;:::-;33381:309;33319:371;;:::o;49757:244::-;-1:-1:-1;;;;;49909:14:0;;;;;;:10;:14;;;;;;;;49908:15;:36;;;;-1:-1:-1;;;;;;49928:16:0;;;;;;:10;:16;;;;;;;;49927:17;49908:36;49900:45;;;;;;49956:37;49975:4;49981:2;49985:7;49956:18;:37::i;49403:243::-;48924:9;48937:10;48924:23;48916:66;;;;-1:-1:-1;;;48916:66:0;;9562:2:1;48916:66:0;;;9544:21:1;9601:2;9581:18;;;9574:30;9640:32;9620:18;;;9613:60;9690:18;;48916:66:0;;;;;;;;;49498:18:::1;49510:6:::0;49498:9:::1;:18;:::i;:::-;49485:9;:31;;49477:56;;;::::0;-1:-1:-1;;;49477:56:0;;10226:2:1;49477:56:0::1;::::0;::::1;10208:21:1::0;10265:2;10245:18;;;10238:30;-1:-1:-1;;;10284:18:1;;;10277:42;10336:18;;49477:56:0::1;10024:336:1::0;49477:56:0::1;49386:1:::0;27915:12;27705:7;27899:13;49549:35:::1;49575:9;49549:35;::::0;49565:6;;27899:28;-1:-1:-1;;27899:46:0;49549:22:::1;;;;:::i;:::-;:35;;49541:56;;;::::0;-1:-1:-1;;;49541:56:0;;10697:2:1;49541:56:0::1;::::0;::::1;10679:21:1::0;10736:1;10716:18;;;10709:29;-1:-1:-1;;;10754:18:1;;;10747:38;10802:18;;49541:56:0::1;10495:331:1::0;49541:56:0::1;49609:29;49619:10;49631:6;49609:9;:29::i;:::-;49403:243:::0;:::o;51270:278::-;4499:13;:11;:13::i;:::-;51456:29:::1;::::0;51339:21:::1;::::0;51393:10:::1;::::0;51318:18:::1;::::0;51393:10;;51339:21;;51318:18;51456:29;51318:18;51456:29;51339:21;51393:10;51456:29:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51442:43;;;;;51504:7;51496:44;;;::::0;-1:-1:-1;;;51496:44:0;;11243:2:1;51496:44:0::1;::::0;::::1;11225:21:1::0;11282:2;11262:18;;;11255:30;11321:26;11301:18;;;11294:54;11365:18;;51496:44:0::1;11041:348:1::0;34854:185:0;34992:39;35009:4;35015:2;35019:7;34992:39;;;;;;;;;;;;:16;:39::i;49654:95::-;4499:13;:11;:13::i;:::-;49727:14:::1;49734:6;49727;:14::i;48527:96::-:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;32062:124::-;32126:7;32153:20;32165:7;32153:11;:20::i;:::-;:25;;32062:124;-1:-1:-1;;32062:124:0:o;28783:395::-;28847:7;-1:-1:-1;;;;;28871:19:0;;28867:60;;28899:28;;-1:-1:-1;;;28899:28:0;;;;;;;;;;;28867:60;-1:-1:-1;;;;;28944:19:0;;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;28944:27:0;:32;28940:108;;-1:-1:-1;;;;;;29008:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;29008:27:0;;28783:395::o;28940:108::-;29100:13;;29064:32;29089:6;29072:5;29064:32;:::i;:::-;-1:-1:-1;;;;;29064:49:0;;29060:90;;-1:-1:-1;29137:1:0;;28783:395;-1:-1:-1;28783:395:0:o;29060:90::-;-1:-1:-1;29169:1:0;;28783:395;-1:-1:-1;28783:395:0:o;50965:297::-;4499:13;:11;:13::i;:::-;51087:1:::1;51069:8;:15;:19;:53;;;;;51111:4;:11;51092:8;:15;:30;51069:53;51061:82;;;;-1:-1:-1::0;;;51061:82:0::1;;;;;;;:::i;:::-;51159:6;51154:101;51175:8;:15;51171:1;:19;51154:101;;;51212:31;51222:8;51231:1;51222:11;;;;;;;;:::i;:::-;;;;;;;51235:4;51240:1;51235:7;;;;;;;;:::i;:::-;;;;;;;51212:31;;:9;:31::i;:::-;51192:3;;51154:101;;32422:104:::0;32478:13;32511:7;32504:14;;;;;:::i;49191:86::-;4499:13;:11;:13::i;:::-;49254:9:::1;:15;49266:3:::0;49254:9;:15:::1;:::i;:::-;;49191:86:::0;:::o;34032:279::-;3244:10;-1:-1:-1;;;;;34123:24:0;;;34119:54;;34156:17;;-1:-1:-1;;;34156:17:0;;;;;;;;;;;34119:54;3244:10;34186:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;34186:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;34186:53:0;;;;;;;;;;34255:48;;540:41:1;;;34186:42:0;;3244:10;34255:48;;513:18:1;34255:48:0;;;;;;;34032:279;;:::o;50299:315::-;4499:13;:11;:13::i;:::-;50431:1:::1;50413:8;:15;:19;:56;;;;;50455:7;:14;50436:8;:15;:33;50413:56;50405:85;;;;-1:-1:-1::0;;;50405:85:0::1;;;;;;;:::i;:::-;50506:6;50501:106;50522:8;:15;50518:1;:19;50501:106;;;50585:7;50593:1;50585:10;;;;;;;;:::i;:::-;;;;;;;50559;:23;50570:8;50579:1;50570:11;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;50559:23:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;50559:23:0;:36;;-1:-1:-1;;50559:36:0::1;::::0;::::1;;::::0;;;::::1;::::0;;-1:-1:-1;50539:3:0::1;50501:106;;50622:315:::0;4499:13;:11;:13::i;:::-;50754:1:::1;50736:8;:15;:19;:56;;;;;50778:7;:14;50759:8;:15;:33;50736:56;50728:85;;;;-1:-1:-1::0;;;50728:85:0::1;;;;;;;:::i;:::-;50829:6;50824:106;50845:8;:15;50841:1;:19;50824:106;;;50908:7;50916:1;50908:10;;;;;;;;:::i;:::-;;;;;;;50882;:23;50893:8;50902:1;50893:11;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;50882:23:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;50882:23:0;:36;;-1:-1:-1;;50882:36:0::1;::::0;::::1;;::::0;;;::::1;::::0;;-1:-1:-1;50862:3:0::1;50824:106;;50012:279:::0;-1:-1:-1;;;;;50189:14:0;;;;;;:10;:14;;;;;;;;50188:15;:36;;;;-1:-1:-1;;;;;;50208:16:0;;;;;;:10;:16;;;;;;;;50207:17;50188:36;50180:45;;;;;;50235:48;50258:4;50264:2;50268:7;50277:5;50235:22;:48::i;:::-;50012:279;;;;:::o;32597:318::-;32670:13;32701:16;32709:7;32701;:16::i;:::-;32696:59;;32726:29;;-1:-1:-1;;;32726:29:0;;;;;;;;;;;32696:59;32768:21;32792:10;:8;:10::i;:::-;32768:34;;32826:7;32820:21;32845:1;32820:26;:87;;;;;;;;;;;;;;;;;32873:7;32882:18;:7;:16;:18::i;:::-;32856:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;32820:87;32813:94;32597:318;-1:-1:-1;;;32597:318:0:o;34382:164::-;-1:-1:-1;;;;;34503:25:0;;;34479:4;34503:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;34382:164::o;5065:201::-;4499:13;:11;:13::i;:::-;-1:-1:-1;;;;;5154:22:0;::::1;5146:73;;;::::0;-1:-1:-1;;;5146:73:0;;14934:2:1;5146:73:0::1;::::0;::::1;14916:21:1::0;14973:2;14953:18;;;14946:30;15012:34;14992:18;;;14985:62;-1:-1:-1;;;15063:18:1;;;15056:36;15109:19;;5146:73:0::1;14732:402:1::0;5146:73:0::1;5230:28;5249:8;5230:18;:28::i;35734:187::-:0;35791:4;35834:7;49386:1;35815:26;;:53;;;;;35855:13;;35845:7;:23;35815:53;:98;;;;-1:-1:-1;;35886:20:0;;;;:11;:20;;;;;:27;-1:-1:-1;;;35886:27:0;;;;35885:28;;35734:187::o;45464:196::-;45579:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;45579:29:0;-1:-1:-1;;;;;45579:29:0;;;;;;;;;45624:28;;45579:24;;45624:28;;;;;;;45464:196;;;:::o;34613:170::-;34747:28;34757:4;34763:2;34767:7;34747:9;:28::i;35929:104::-;35998:27;36008:2;36012:8;35998:27;;;;;;;;;;;;:9;:27::i;4778:132::-;4686:6;;-1:-1:-1;;;;;4686:6:0;3244:10;4842:23;4834:68;;;;-1:-1:-1;;;4834:68:0;;15341:2:1;4834:68:0;;;15323:21:1;;;15360:18;;;15353:30;15419:34;15399:18;;;15392:62;15471:18;;4834:68:0;15139:356:1;4834:68:0;4778:132::o;36567:113::-;36649:19;36659:8;36649:9;:19::i;30713:1287::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;30823:7:0;;49386:1;30872:23;;:47;;;;;30906:13;;30899:4;:20;30872:47;30868:1065;;;30940:31;30974:17;;;:11;:17;;;;;;;;;30940:51;;;;;;;;;-1:-1:-1;;;;;30940:51:0;;;;-1:-1:-1;;;30940:51:0;;-1:-1:-1;;;;;30940:51:0;;;;;;;;-1:-1:-1;;;30940:51:0;;;;;;;;;;;;;;31010:904;;31060:14;;-1:-1:-1;;;;;31060:28:0;;31056:101;;31124:9;30713:1287;-1:-1:-1;;;30713:1287:0:o;31056:101::-;31477:1;31501:270;-1:-1:-1;;31530:6:0;;;31575:17;;;;:11;:17;;;;;;;;;31563:29;;;;;;;;;-1:-1:-1;;;;;31563:29:0;;;;;-1:-1:-1;;;;;;;;31563:29:0;;;;;;;;;;;-1:-1:-1;;;31563:29:0;;;;;;;;;;;;;31530:6;;31563:29;;-1:-1:-1;;31623:28:0;31619:109;;-1:-1:-1;31691:9:0;30713:1287;-1:-1:-1;;;30713:1287:0:o;31619:109::-;-1:-1:-1;;31758:7:0;:11;31501:270;;-1:-1:-1;31828:6:0;31820:34;;;;-1:-1:-1;;;;;31795:60:0;;;-1:-1:-1;31795:60:0;;:9;-1:-1:-1;30713:1287:0:o;31010:904::-;30921:1012;30868:1065;31961:31;;-1:-1:-1;;;31961:31:0;;;;;;;;;;;35110:369;35277:28;35287:4;35293:2;35297:7;35277:9;:28::i;:::-;-1:-1:-1;;;;;35320:13:0;;7152:19;:23;;35320:76;;;;;35340:56;35371:4;35377:2;35381:7;35390:5;35340:30;:56::i;:::-;35339:57;35320:76;35316:156;;;35420:40;;-1:-1:-1;;;35420:40:0;;;;;;;;;;;49072:111;49133:13;49166:9;49159:16;;;;;:::i;418:723::-;474:13;695:5;704:1;695:10;691:53;;-1:-1:-1;;722:10:0;;;;;;;;;;;;-1:-1:-1;;;722:10:0;;;;;418:723::o;691:53::-;769:5;754:12;810:78;817:9;;810:78;;843:8;;;;:::i;:::-;;-1:-1:-1;866:10:0;;-1:-1:-1;874:2:0;866:10;;:::i;:::-;;;810:78;;;898:19;930:6;-1:-1:-1;;;;;920:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;920:17:0;;898:39;;948:154;955:10;;948:154;;982:11;992:1;982:11;;:::i;:::-;;-1:-1:-1;1051:10:0;1059:2;1051:5;:10;:::i;:::-;1038:24;;:2;:24;:::i;:::-;1025:39;;1008:6;1015;1008:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;1008:56:0;;;;;;;;-1:-1:-1;1079:11:0;1088:2;1079:11;;:::i;:::-;;;948:154;;;1126:6;418:723;-1:-1:-1;;;;418:723:0:o;5426:191::-;5519:6;;;-1:-1:-1;;;;;5536:17:0;;;-1:-1:-1;;;;;;5536:17:0;;;;;;;5569:40;;5519:6;;;5536:17;5519:6;;5569:40;;5500:16;;5569:40;5489:128;5426:191;:::o;40966:2112::-;41081:35;41119:20;41131:7;41119:11;:20::i;:::-;41194:18;;41081:58;;-1:-1:-1;41152:22:0;;-1:-1:-1;;;;;41178:34:0;3244:10;-1:-1:-1;;;;;41178:34:0;;:101;;;-1:-1:-1;41246:18:0;;41229:50;;3244:10;34382:164;:::i;41229:50::-;41178:154;;;-1:-1:-1;3244:10:0;41296:20;41308:7;41296:11;:20::i;:::-;-1:-1:-1;;;;;41296:36:0;;41178:154;41152:181;;41351:17;41346:66;;41377:35;;-1:-1:-1;;;41377:35:0;;;;;;;;;;;41346:66;41449:4;-1:-1:-1;;;;;41427:26:0;:13;:18;;;-1:-1:-1;;;;;41427:26:0;;41423:67;;41462:28;;-1:-1:-1;;;41462:28:0;;;;;;;;;;;41423:67;-1:-1:-1;;;;;41505:16:0;;41501:52;;41530:23;;-1:-1:-1;;;41530:23:0;;;;;;;;;;;41501:52;41674:49;41691:1;41695:7;41704:13;:18;;;41674:8;:49::i;:::-;-1:-1:-1;;;;;42019:18:0;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;42019:31:0;;;-1:-1:-1;;;;;42019:31:0;;;-1:-1:-1;;42019:31:0;;;;;;;42065:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;42065:29:0;;;;;;;;;;;42111:20;;;:11;:20;;;;;;:30;;-1:-1:-1;;;;;;42156:61:0;;;;-1:-1:-1;;;42201:15:0;42156:61;;;;;;;;;;;42491:11;;;42521:24;;;;;:29;42491:11;;42521:29;42517:445;;42746:13;;42732:11;:27;42728:219;;;42816:18;;;42784:24;;;:11;:24;;;;;;;;:50;;42899:28;;;;-1:-1:-1;;;;;42857:70:0;-1:-1:-1;;;42857:70:0;-1:-1:-1;;;;;;42857:70:0;;;-1:-1:-1;;;;;42784:50:0;;;42857:70;;;;;;;42728:219;41994:979;43009:7;43005:2;-1:-1:-1;;;;;42990:27:0;42999:4;-1:-1:-1;;;;;42990:27:0;-1:-1:-1;;;;;;;;;;;42990:27:0;;;;;;;;;43028:42;41070:2008;;40966:2112;;;:::o;36396:163::-;36519:32;36525:2;36529:8;36539:5;36546:4;36519:5;:32::i;40105:607::-;40194:8;40206:1;40194:13;40190:44;;40216:18;;-1:-1:-1;;;40216:18:0;;;;;;;;;;;40190:44;40251:20;40274:13;;;40316:23;40331:8;40274:13;40316:23;:::i;:::-;40302:37;-1:-1:-1;40396:39:0;40422:12;40404:6;40396:39;:::i;:::-;40354:26;40366:13;;40354:26;;:11;:26;;;;;:82;;-1:-1:-1;;;;;;40354:82:0;-1:-1:-1;;;;;40354:82:0;;;;;;;;;;40482:166;40584:14;;;;;;40568:12;40550:6;40542:39;-1:-1:-1;;;;;40513:86:0;40530:1;-1:-1:-1;;;;;40513:86:0;-1:-1:-1;;;;;;;;;;;40513:86:0;;;;;;;;;40643:3;40627:12;:19;40482:166;;40694:8;40677:13;;:25;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;40105:607:0:o;46152:667::-;46336:72;;-1:-1:-1;;;46336:72:0;;46315:4;;-1:-1:-1;;;;;46336:36:0;;;;;:72;;3244:10;;46387:4;;46393:7;;46402:5;;46336:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46336:72:0;;;;;;;;-1:-1:-1;;46336:72:0;;;;;;;;;;;;:::i;:::-;;;46332:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46570:6;:13;46587:1;46570:18;46566:235;;46616:40;;-1:-1:-1;;;46616:40:0;;;;;;;;;;;46566:235;46759:6;46753:13;46744:6;46740:2;46736:15;46729:38;46332:480;-1:-1:-1;;;;;;46455:55:0;-1:-1:-1;;;46455:55:0;;-1:-1:-1;46152:667:0;;;;;;:::o;36940:1775::-;37079:20;37102:13;-1:-1:-1;;;;;37130:16:0;;37126:48;;37155:19;;-1:-1:-1;;;37155:19:0;;;;;;;;;;;37126:48;37189:8;37201:1;37189:13;37185:44;;37211:18;;-1:-1:-1;;;37211:18:0;;;;;;;;;;;37185:44;-1:-1:-1;;;;;37580:16:0;;;;;;:12;:16;;;;;;;;:44;;-1:-1:-1;;37639:49:0;;-1:-1:-1;;;;;37580:44:0;;;;;;;37639:49;;;;-1:-1:-1;;37580:44:0;;;;;;37639:49;;;;;;;;;;;;;;;;37705:25;;;:11;:25;;;;;;:35;;-1:-1:-1;;;;;;37755:66:0;;;;-1:-1:-1;;;37805:15:0;37755:66;;;;;;;;;;37705:25;37902:23;;;37946:4;:23;;;;-1:-1:-1;;;;;;37954:13:0;;7152:19;:23;;37954:15;37942:641;;;37990:314;38021:38;;38046:12;;-1:-1:-1;;;;;38021:38:0;;;38038:1;;-1:-1:-1;;;;;;;;;;;38021:38:0;38038:1;;38021:38;38087:69;38126:1;38130:2;38134:14;;;;;;38150:5;38087:30;:69::i;:::-;38082:174;;38192:40;;-1:-1:-1;;;38192:40:0;;;;;;;;;;;38082:174;38299:3;38283:12;:19;37990:314;;38385:12;38368:13;;:29;38364:43;;38399:8;;;38364:43;37942:641;;;38448:120;38479:40;;38504:14;;;;;-1:-1:-1;;;;;38479:40:0;;;38496:1;;-1:-1:-1;;;;;;;;;;;38479:40:0;38496:1;;38479:40;38563:3;38547:12;:19;38448:120;;37942:641;-1:-1:-1;38597:13:0;:28;38647:60;50012:279;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:250::-;677:1;687:113;701:6;698:1;695:13;687:113;;;777:11;;;771:18;758:11;;;751:39;723:2;716:10;687:113;;;-1:-1:-1;;834:1:1;816:16;;809:27;592:250::o;847:271::-;889:3;927:5;921:12;954:6;949:3;942:19;970:76;1039:6;1032:4;1027:3;1023:14;1016:4;1009:5;1005:16;970:76;:::i;:::-;1100:2;1079:15;-1:-1:-1;;1075:29:1;1066:39;;;;1107:4;1062:50;;847:271;-1:-1:-1;;847:271:1:o;1123:220::-;1272:2;1261:9;1254:21;1235:4;1292:45;1333:2;1322:9;1318:18;1310:6;1292:45;:::i;1348:180::-;1407:6;1460:2;1448:9;1439:7;1435:23;1431:32;1428:52;;;1476:1;1473;1466:12;1428:52;-1:-1:-1;1499:23:1;;1348:180;-1:-1:-1;1348:180:1:o;1741:173::-;1809:20;;-1:-1:-1;;;;;1858:31:1;;1848:42;;1838:70;;1904:1;1901;1894:12;1838:70;1741:173;;;:::o;1919:254::-;1987:6;1995;2048:2;2036:9;2027:7;2023:23;2019:32;2016:52;;;2064:1;2061;2054:12;2016:52;2087:29;2106:9;2087:29;:::i;:::-;2077:39;2163:2;2148:18;;;;2135:32;;-1:-1:-1;;;1919:254:1:o;2360:328::-;2437:6;2445;2453;2506:2;2494:9;2485:7;2481:23;2477:32;2474:52;;;2522:1;2519;2512:12;2474:52;2545:29;2564:9;2545:29;:::i;:::-;2535:39;;2593:38;2627:2;2616:9;2612:18;2593:38;:::i;:::-;2583:48;;2678:2;2667:9;2663:18;2650:32;2640:42;;2360:328;;;;;:::o;2693:186::-;2752:6;2805:2;2793:9;2784:7;2780:23;2776:32;2773:52;;;2821:1;2818;2811:12;2773:52;2844:29;2863:9;2844:29;:::i;2884:127::-;2945:10;2940:3;2936:20;2933:1;2926:31;2976:4;2973:1;2966:15;3000:4;2997:1;2990:15;3016:275;3087:2;3081:9;3152:2;3133:13;;-1:-1:-1;;3129:27:1;3117:40;;-1:-1:-1;;;;;3172:34:1;;3208:22;;;3169:62;3166:88;;;3234:18;;:::i;:::-;3270:2;3263:22;3016:275;;-1:-1:-1;3016:275:1:o;3296:183::-;3356:4;-1:-1:-1;;;;;3381:6:1;3378:30;3375:56;;;3411:18;;:::i;:::-;-1:-1:-1;3456:1:1;3452:14;3468:4;3448:25;;3296:183::o;3484:674::-;3538:5;3591:3;3584:4;3576:6;3572:17;3568:27;3558:55;;3609:1;3606;3599:12;3558:55;3645:6;3632:20;3671:4;3695:60;3711:43;3751:2;3711:43;:::i;:::-;3695:60;:::i;:::-;3777:3;3801:2;3796:3;3789:15;3829:4;3824:3;3820:14;3813:21;;3886:4;3880:2;3877:1;3873:10;3865:6;3861:23;3857:34;3843:48;;3914:3;3906:6;3903:15;3900:35;;;3931:1;3928;3921:12;3900:35;3967:4;3959:6;3955:17;3981:148;3997:6;3992:3;3989:15;3981:148;;;4063:23;4082:3;4063:23;:::i;:::-;4051:36;;4107:12;;;;4014;;3981:148;;;-1:-1:-1;4147:5:1;3484:674;-1:-1:-1;;;;;;3484:674:1:o;4163:1238::-;4280:6;4288;4341:2;4329:9;4320:7;4316:23;4312:32;4309:52;;;4357:1;4354;4347:12;4309:52;4397:9;4384:23;-1:-1:-1;;;;;4467:2:1;4459:6;4456:14;4453:34;;;4483:1;4480;4473:12;4453:34;4506:61;4559:7;4550:6;4539:9;4535:22;4506:61;:::i;:::-;4496:71;;4586:2;4576:12;;4641:2;4630:9;4626:18;4613:32;4670:2;4660:8;4657:16;4654:36;;;4686:1;4683;4676:12;4654:36;4709:24;;;-1:-1:-1;4764:4:1;4756:13;;4752:27;-1:-1:-1;4742:55:1;;4793:1;4790;4783:12;4742:55;4829:2;4816:16;4852:60;4868:43;4908:2;4868:43;:::i;4852:60::-;4946:15;;;5028:1;5024:10;;;;5016:19;;5012:28;;;4977:12;;;;5052:19;;;5049:39;;;5084:1;5081;5074:12;5049:39;5108:11;;;;5128:243;5144:6;5139:3;5136:15;5128:243;;;5224:3;5211:17;5272:6;5265:5;5261:18;5254:5;5251:29;5241:57;;5294:1;5291;5284:12;5241:57;5311:18;;5161:12;;;;5349;;;;5128:243;;;5390:5;5380:15;;;;;;;4163:1238;;;;;:::o;5406:407::-;5471:5;-1:-1:-1;;;;;5497:6:1;5494:30;5491:56;;;5527:18;;:::i;:::-;5565:57;5610:2;5589:15;;-1:-1:-1;;5585:29:1;5616:4;5581:40;5565:57;:::i;:::-;5556:66;;5645:6;5638:5;5631:21;5685:3;5676:6;5671:3;5667:16;5664:25;5661:45;;;5702:1;5699;5692:12;5661:45;5751:6;5746:3;5739:4;5732:5;5728:16;5715:43;5805:1;5798:4;5789:6;5782:5;5778:18;5774:29;5767:40;5406:407;;;;;:::o;5818:451::-;5887:6;5940:2;5928:9;5919:7;5915:23;5911:32;5908:52;;;5956:1;5953;5946:12;5908:52;5996:9;5983:23;-1:-1:-1;;;;;6021:6:1;6018:30;6015:50;;;6061:1;6058;6051:12;6015:50;6084:22;;6137:4;6129:13;;6125:27;-1:-1:-1;6115:55:1;;6166:1;6163;6156:12;6115:55;6189:74;6255:7;6250:2;6237:16;6232:2;6228;6224:11;6189:74;:::i;6274:160::-;6339:20;;6395:13;;6388:21;6378:32;;6368:60;;6424:1;6421;6414:12;6439:254;6504:6;6512;6565:2;6553:9;6544:7;6540:23;6536:32;6533:52;;;6581:1;6578;6571:12;6533:52;6604:29;6623:9;6604:29;:::i;:::-;6594:39;;6652:35;6683:2;6672:9;6668:18;6652:35;:::i;:::-;6642:45;;6439:254;;;;;:::o;6698:1138::-;6813:6;6821;6874:2;6862:9;6853:7;6849:23;6845:32;6842:52;;;6890:1;6887;6880:12;6842:52;6930:9;6917:23;-1:-1:-1;;;;;7000:2:1;6992:6;6989:14;6986:34;;;7016:1;7013;7006:12;6986:34;7039:61;7092:7;7083:6;7072:9;7068:22;7039:61;:::i;:::-;7029:71;;7119:2;7109:12;;7174:2;7163:9;7159:18;7146:32;7203:2;7193:8;7190:16;7187:36;;;7219:1;7216;7209:12;7187:36;7242:24;;;-1:-1:-1;7297:4:1;7289:13;;7285:27;-1:-1:-1;7275:55:1;;7326:1;7323;7316:12;7275:55;7362:2;7349:16;7385:60;7401:43;7441:2;7401:43;:::i;7385:60::-;7479:15;;;7561:1;7557:10;;;;7549:19;;7545:28;;;7510:12;;;;7585:19;;;7582:39;;;7617:1;7614;7607:12;7582:39;7641:11;;;;7661:145;7677:6;7672:3;7669:15;7661:145;;;7743:20;7759:3;7743:20;:::i;:::-;7731:33;;7694:12;;;;7784;;;;7661:145;;7841:667;7936:6;7944;7952;7960;8013:3;8001:9;7992:7;7988:23;7984:33;7981:53;;;8030:1;8027;8020:12;7981:53;8053:29;8072:9;8053:29;:::i;:::-;8043:39;;8101:38;8135:2;8124:9;8120:18;8101:38;:::i;:::-;8091:48;;8186:2;8175:9;8171:18;8158:32;8148:42;;8241:2;8230:9;8226:18;8213:32;-1:-1:-1;;;;;8260:6:1;8257:30;8254:50;;;8300:1;8297;8290:12;8254:50;8323:22;;8376:4;8368:13;;8364:27;-1:-1:-1;8354:55:1;;8405:1;8402;8395:12;8354:55;8428:74;8494:7;8489:2;8476:16;8471:2;8467;8463:11;8428:74;:::i;:::-;8418:84;;;7841:667;;;;;;;:::o;8710:260::-;8778:6;8786;8839:2;8827:9;8818:7;8814:23;8810:32;8807:52;;;8855:1;8852;8845:12;8807:52;8878:29;8897:9;8878:29;:::i;:::-;8868:39;;8926:38;8960:2;8949:9;8945:18;8926:38;:::i;8975:380::-;9054:1;9050:12;;;;9097;;;9118:61;;9172:4;9164:6;9160:17;9150:27;;9118:61;9225:2;9217:6;9214:14;9194:18;9191:38;9188:161;;9271:10;9266:3;9262:20;9259:1;9252:31;9306:4;9303:1;9296:15;9334:4;9331:1;9324:15;9188:161;;8975:380;;;:::o;9719:127::-;9780:10;9775:3;9771:20;9768:1;9761:31;9811:4;9808:1;9801:15;9835:4;9832:1;9825:15;9851:168;9924:9;;;9955;;9972:15;;;9966:22;;9952:37;9942:71;;9993:18;;:::i;10365:125::-;10430:9;;;10451:10;;;10448:36;;;10464:18;;:::i;11394:185::-;-1:-1:-1;;;;;11515:10:1;;;11503;;;11499:27;;11538:12;;;11535:38;;;11553:18;;:::i;:::-;11535:38;11394:185;;;;:::o;11584:340::-;11786:2;11768:21;;;11825:2;11805:18;;;11798:30;-1:-1:-1;;;11859:2:1;11844:18;;11837:46;11915:2;11900:18;;11584:340::o;11929:127::-;11990:10;11985:3;11981:20;11978:1;11971:31;12021:4;12018:1;12011:15;12045:4;12042:1;12035:15;12187:518;12289:2;12284:3;12281:11;12278:421;;;12325:5;12322:1;12315:16;12369:4;12366:1;12356:18;12439:2;12427:10;12423:19;12420:1;12416:27;12410:4;12406:38;12475:4;12463:10;12460:20;12457:47;;;-1:-1:-1;12498:4:1;12457:47;12553:2;12548:3;12544:12;12541:1;12537:20;12531:4;12527:31;12517:41;;12608:81;12626:2;12619:5;12616:13;12608:81;;;12685:1;12671:16;;12652:1;12641:13;12608:81;;12881:1345;13007:3;13001:10;-1:-1:-1;;;;;13026:6:1;13023:30;13020:56;;;13056:18;;:::i;:::-;13085:97;13175:6;13135:38;13167:4;13161:11;13135:38;:::i;:::-;13129:4;13085:97;:::i;:::-;13237:4;;13294:2;13283:14;;13311:1;13306:663;;;;14013:1;14030:6;14027:89;;;-1:-1:-1;14082:19:1;;;14076:26;14027:89;-1:-1:-1;;12838:1:1;12834:11;;;12830:24;12826:29;12816:40;12862:1;12858:11;;;12813:57;14129:81;;13276:944;;13306:663;12134:1;12127:14;;;12171:4;12158:18;;-1:-1:-1;;13342:20:1;;;13460:236;13474:7;13471:1;13468:14;13460:236;;;13563:19;;;13557:26;13542:42;;13655:27;;;;13623:1;13611:14;;;;13490:19;;13460:236;;;13464:3;13724:6;13715:7;13712:19;13709:201;;;13785:19;;;13779:26;-1:-1:-1;;13868:1:1;13864:14;;;13880:3;13860:24;13856:37;13852:42;13837:58;13822:74;;13709:201;;;13956:1;13947:6;13944:1;13940:14;13936:22;13930:4;13923:36;13276:944;;;;;12881:1345;;:::o;14231:496::-;14410:3;14448:6;14442:13;14464:66;14523:6;14518:3;14511:4;14503:6;14499:17;14464:66;:::i;:::-;14593:13;;14552:16;;;;14615:70;14593:13;14552:16;14662:4;14650:17;;14615:70;:::i;:::-;14701:20;;14231:496;-1:-1:-1;;;;14231:496:1:o;15500:135::-;15539:3;15560:17;;;15557:43;;15580:18;;:::i;:::-;-1:-1:-1;15627:1:1;15616:13;;15500:135::o;15640:127::-;15701:10;15696:3;15692:20;15689:1;15682:31;15732:4;15729:1;15722:15;15756:4;15753:1;15746:15;15772:120;15812:1;15838;15828:35;;15843:18;;:::i;:::-;-1:-1:-1;15877:9:1;;15772:120::o;15897:128::-;15964:9;;;15985:11;;;15982:37;;;15999:18;;:::i;16030:112::-;16062:1;16088;16078:35;;16093:18;;:::i;:::-;-1:-1:-1;16127:9:1;;16030:112::o;16147:182::-;-1:-1:-1;;;;;16254:10:1;;;16266;;;16250:27;;16289:11;;;16286:37;;;16303:18;;:::i;16334:489::-;-1:-1:-1;;;;;16603:15:1;;;16585:34;;16655:15;;16650:2;16635:18;;16628:43;16702:2;16687:18;;16680:34;;;16750:3;16745:2;16730:18;;16723:31;;;16528:4;;16771:46;;16797:19;;16789:6;16771:46;:::i;:::-;16763:54;16334:489;-1:-1:-1;;;;;;16334:489:1:o;16828:249::-;16897:6;16950:2;16938:9;16929:7;16925:23;16921:32;16918:52;;;16966:1;16963;16956:12;16918:52;16998:9;16992:16;17017:30;17041:5;17017:30;:::i
Swarm Source
ipfs://04a35bbecc421517536df775b960e99c8545a4d04ff611ad558ead882f7474e6
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.