ERC-721
Overview
Max Total Supply
1,111 CRYPTOTATS
Holders
304
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
2 CRYPTOTATSLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
CryptoTatz
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-10-25 */ // File: https://github.com/chiru-labs/ERC721A/blob/main/contracts/IERC721A.sol // ERC721A Contracts v4.2.3 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721A. */ interface IERC721A { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the * ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); /** * The `quantity` minted with ERC2309 exceeds the safety limit. */ error MintERC2309QuantityExceedsLimit(); /** * The `extraData` cannot be set on an unintialized ownership slot. */ error OwnershipNotInitializedForExtraData(); // ============================================================= // STRUCTS // ============================================================= struct TokenOwnership { // The address of the owner. address addr; // Stores the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; // Arbitrary data similar to `startTimestamp` that can be set via {_extraData}. uint24 extraData; } // ============================================================= // TOKEN COUNTERS // ============================================================= /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() external view returns (uint256); // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); // ============================================================= // IERC721 // ============================================================= /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables * (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in `owner`'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, * checking first that contract recipients are aware of the ERC721 protocol * to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move * this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external payable; /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external payable; /** * @dev Transfers `tokenId` 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 payable; /** * @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 payable; /** * @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); // ============================================================= // IERC721Metadata // ============================================================= /** * @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); // ============================================================= // IERC2309 // ============================================================= /** * @dev Emitted when tokens in `fromTokenId` to `toTokenId` * (inclusive) is transferred from `from` to `to`, as defined in the * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard. * * See {_mintERC2309} for more details. */ event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to); } // File: https://github.com/chiru-labs/ERC721A/blob/main/contracts/ERC721A.sol // ERC721A Contracts v4.2.3 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721 token receiver. */ interface ERC721A__IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @title ERC721A * * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721) * Non-Fungible Token Standard, including the Metadata extension. * Optimized for lower gas during batch mints. * * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...) * starting from `_startTokenId()`. * * Assumptions: * * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is IERC721A { // Bypass for a `--via-ir` bug (https://github.com/chiru-labs/ERC721A/pull/364). struct TokenApprovalRef { address value; } // ============================================================= // CONSTANTS // ============================================================= // Mask of an entry in packed address data. uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1; // The bit position of `numberMinted` in packed address data. uint256 private constant _BITPOS_NUMBER_MINTED = 64; // The bit position of `numberBurned` in packed address data. uint256 private constant _BITPOS_NUMBER_BURNED = 128; // The bit position of `aux` in packed address data. uint256 private constant _BITPOS_AUX = 192; // Mask of all 256 bits in packed address data except the 64 bits for `aux`. uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1; // The bit position of `startTimestamp` in packed ownership. uint256 private constant _BITPOS_START_TIMESTAMP = 160; // The bit mask of the `burned` bit in packed ownership. uint256 private constant _BITMASK_BURNED = 1 << 224; // The bit position of the `nextInitialized` bit in packed ownership. uint256 private constant _BITPOS_NEXT_INITIALIZED = 225; // The bit mask of the `nextInitialized` bit in packed ownership. uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225; // The bit position of `extraData` in packed ownership. uint256 private constant _BITPOS_EXTRA_DATA = 232; // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`. uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1; // The mask of the lower 160 bits for addresses. uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1; // The maximum `quantity` that can be minted with {_mintERC2309}. // This limit is to prevent overflows on the address data entries. // For a limit of 5000, a total of 3.689e15 calls to {_mintERC2309} // is required to cause an overflow, which is unrealistic. uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000; // The `Transfer` event signature is given by: // `keccak256(bytes("Transfer(address,address,uint256)"))`. bytes32 private constant _TRANSFER_EVENT_SIGNATURE = 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef; // ============================================================= // STORAGE // ============================================================= // The next token ID to be minted. uint256 private _currentIndex; // The number of tokens burned. uint256 private _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 {_packedOwnershipOf} implementation for details. // // Bits Layout: // - [0..159] `addr` // - [160..223] `startTimestamp` // - [224] `burned` // - [225] `nextInitialized` // - [232..255] `extraData` mapping(uint256 => uint256) private _packedOwnerships; // Mapping owner address to address data. // // Bits Layout: // - [0..63] `balance` // - [64..127] `numberMinted` // - [128..191] `numberBurned` // - [192..255] `aux` mapping(address => uint256) private _packedAddressData; // Mapping from token ID to approved address. mapping(uint256 => TokenApprovalRef) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // ============================================================= // CONSTRUCTOR // ============================================================= constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } // ============================================================= // TOKEN COUNTING OPERATIONS // ============================================================= /** * @dev Returns the starting token ID. * To change the starting token ID, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Returns the next token ID to be minted. */ function _nextTokenId() internal view virtual returns (uint256) { return _currentIndex; } /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() public view virtual override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than `_currentIndex - _startTokenId()` times. unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * @dev Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view virtual returns (uint256) { // Counter underflow is impossible as `_currentIndex` does not decrement, // and it is initialized to `_startTokenId()`. unchecked { return _currentIndex - _startTokenId(); } } /** * @dev Returns the total number of tokens burned. */ function _totalBurned() internal view virtual returns (uint256) { return _burnCounter; } // ============================================================= // ADDRESS DATA OPERATIONS // ============================================================= /** * @dev Returns the number of tokens in `owner`'s account. */ function balanceOf(address owner) public view virtual override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_BURNED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return uint64(_packedAddressData[owner] >> _BITPOS_AUX); } /** * Sets the auxiliary 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 virtual { uint256 packed = _packedAddressData[owner]; uint256 auxCasted; // Cast `aux` with assembly to avoid redundant masking. assembly { auxCasted := aux } packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX); _packedAddressData[owner] = packed; } // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { // The interface IDs are constants representing the first 4 bytes // of the XOR of all function selectors in the interface. // See: [ERC165](https://eips.ethereum.org/EIPS/eip-165) // (e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`) return interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165. interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721. interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata. } // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the token collection symbol. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ 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, _toString(tokenId))) : ''; } /** * @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, it can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } // ============================================================= // OWNERSHIPS OPERATIONS // ============================================================= /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @dev Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around over time. */ function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @dev Returns the unpacked `TokenOwnership` struct at `index`. */ function _ownershipAt(uint256 index) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnerships[index]); } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal virtual { if (_packedOwnerships[index] == 0) { _packedOwnerships[index] = _packedOwnershipOf(index); } } /** * Returns the packed ownership data of `tokenId`. */ function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr) if (curr < _currentIndex) { uint256 packed = _packedOwnerships[curr]; // If not burned. if (packed & _BITMASK_BURNED == 0) { // Invariant: // There will always be an initialized ownership slot // (i.e. `ownership.addr != address(0) && ownership.burned == false`) // before an unintialized ownership slot // (i.e. `ownership.addr == address(0) && ownership.burned == false`) // Hence, `curr` will not underflow. // // We can directly compare the packed value. // If the address is zero, packed will be zero. while (packed == 0) { packed = _packedOwnerships[--curr]; } return packed; } } } revert OwnerQueryForNonexistentToken(); } /** * @dev Returns the unpacked `TokenOwnership` struct from `packed`. */ function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) { ownership.addr = address(uint160(packed)); ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP); ownership.burned = packed & _BITMASK_BURNED != 0; ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA); } /** * @dev Packs ownership data into a single uint256. */ function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // `owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags`. result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags)) } } /** * @dev Returns the `nextInitialized` flag set if `quantity` equals 1. */ function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) { // For branchless setting of the `nextInitialized` flag. assembly { // `(quantity == 1) << _BITPOS_NEXT_INITIALIZED`. result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1)) } } // ============================================================= // APPROVAL OPERATIONS // ============================================================= /** * @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) public payable virtual override { address owner = ownerOf(tokenId); if (_msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { revert ApprovalCallerNotOwnerNorApproved(); } _tokenApprovals[tokenId].value = to; emit Approval(owner, to, tokenId); } /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId].value; } /** * @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) public virtual override { _operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), operator, approved); } /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @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. See {_mint}. */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && // If within bounds, _packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned. } /** * @dev Returns whether `msgSender` is equal to `approvedAddress` or `owner`. */ function _isSenderApprovedOrOwner( address approvedAddress, address owner, address msgSender ) private pure returns (bool result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean. msgSender := and(msgSender, _BITMASK_ADDRESS) // `msgSender == owner || msgSender == approvedAddress`. result := or(eq(msgSender, owner), eq(msgSender, approvedAddress)) } } /** * @dev Returns the storage slot and value for the approved address of `tokenId`. */ function _getApprovedSlotAndAddress(uint256 tokenId) private view returns (uint256 approvedAddressSlot, address approvedAddress) { TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId]; // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId].value`. assembly { approvedAddressSlot := tokenApproval.slot approvedAddress := sload(approvedAddressSlot) } } // ============================================================= // TRANSFER OPERATIONS // ============================================================= /** * @dev Transfers `tokenId` from `from` to `to`. * * 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 ) public payable virtual override { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // 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 { // We can directly increment and decrement the balances. --_packedAddressData[from]; // Updates: `balance -= 1`. ++_packedAddressData[to]; // Updates: `balance += 1`. // Updates: // - `address` to the next owner. // - `startTimestamp` to the timestamp of transfering. // - `burned` to `false`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( to, _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public payable virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @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 memory _data ) public payable virtual override { transferFrom(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @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 {} /** * @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * `from` - Previous owner of the given token ID. * `to` - Target address that will receive the token. * `tokenId` - Token ID to be transferred. * `_data` - Optional data to send along with the call. * * Returns whether the call correctly returned the expected magic value. */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns ( bytes4 retval ) { return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } // ============================================================= // MINT OPERATIONS // ============================================================= /** * @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 for each mint. */ function _mint(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // `balance` and `numberMinted` have a maximum limit of 2**64. // `tokenId` has a maximum limit of 2**256. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); uint256 toMasked; uint256 end = startTokenId + quantity; // Use assembly to loop and emit the `Transfer` event for gas savings. // The duplicated `log4` removes an extra check and reduces stack juggling. // The assembly, together with the surrounding Solidity code, have been // delicately arranged to nudge the compiler into producing optimized opcodes. assembly { // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean. toMasked := and(to, _BITMASK_ADDRESS) // Emit the `Transfer` event. log4( 0, // Start of data (0, since no data). 0, // End of data (0, since no data). _TRANSFER_EVENT_SIGNATURE, // Signature. 0, // `address(0)`. toMasked, // `to`. startTokenId // `tokenId`. ) // The `iszero(eq(,))` check ensures that large values of `quantity` // that overflows uint256 will make the loop run out of gas. // The compiler will optimize the `iszero` away for performance. for { let tokenId := add(startTokenId, 1) } iszero(eq(tokenId, end)) { tokenId := add(tokenId, 1) } { // Emit the `Transfer` event. Similar to above. log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId) } } if (toMasked == 0) revert MintToZeroAddress(); _currentIndex = end; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * This function is intended for efficient minting only during contract creation. * * It emits only one {ConsecutiveTransfer} as defined in * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309), * instead of a sequence of {Transfer} event(s). * * Calling this function outside of contract creation WILL make your contract * non-compliant with the ERC721 standard. * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309 * {ConsecutiveTransfer} event is only permissible during contract creation. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {ConsecutiveTransfer} event. */ function _mintERC2309(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are unrealistic due to the above check for `quantity` to be below the limit. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to); _currentIndex = startTokenId + quantity; } _afterTokenTransfers(address(0), to, startTokenId, 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. * * See {_mint}. * * Emits a {Transfer} event for each mint. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal virtual { _mint(to, quantity); unchecked { if (to.code.length != 0) { uint256 end = _currentIndex; uint256 index = end - quantity; do { if (!_checkContractOnERC721Received(address(0), to, index++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (index < end); // Reentrancy protection. if (_currentIndex != end) revert(); } } } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal virtual { _safeMint(to, quantity, ''); } // ============================================================= // BURN OPERATIONS // ============================================================= /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); address from = address(uint160(prevOwnershipPacked)); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); if (approvalCheck) { // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // 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 { // Updates: // - `balance -= 1`. // - `numberBurned += 1`. // // We can directly decrement the balance, and increment the number burned. // This is equivalent to `packed -= 1; packed += 1 << _BITPOS_NUMBER_BURNED;`. _packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1; // Updates: // - `address` to the last owner. // - `startTimestamp` to the timestamp of burning. // - `burned` to `true`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( from, (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } // ============================================================= // EXTRA DATA OPERATIONS // ============================================================= /** * @dev Directly sets the extra data for the ownership data `index`. */ function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual { uint256 packed = _packedOwnerships[index]; if (packed == 0) revert OwnershipNotInitializedForExtraData(); uint256 extraDataCasted; // Cast `extraData` with assembly to avoid redundant masking. assembly { extraDataCasted := extraData } packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA); _packedOwnerships[index] = packed; } /** * @dev Called during each token transfer to set the 24bit `extraData` field. * Intended to be overridden by the cosumer contract. * * `previousExtraData` - the value of `extraData` before transfer. * * 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 _extraData( address from, address to, uint24 previousExtraData ) internal view virtual returns (uint24) {} /** * @dev Returns the next extra data for the packed ownership data. * The returned result is shifted into position. */ function _nextExtraData( address from, address to, uint256 prevOwnershipPacked ) private view returns (uint256) { uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA); return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA; } // ============================================================= // OTHER OPERATIONS // ============================================================= /** * @dev Returns the message sender (defaults to `msg.sender`). * * If you are writing GSN compatible contracts, you need to override this function. */ function _msgSenderERC721A() internal view virtual returns (address) { return msg.sender; } /** * @dev Converts a uint256 to its ASCII string decimal representation. */ function _toString(uint256 value) internal pure virtual returns (string memory str) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), but // we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned. // We will need 1 word for the trailing zeros padding, 1 word for the length, // and 3 words for a maximum of 78 digits. Total: 5 * 0x20 = 0xa0. let m := add(mload(0x40), 0xa0) // Update the free memory pointer to allocate. mstore(0x40, m) // Assign the `str` to the end. str := sub(m, 0x20) // Zeroize the slot after the string. mstore(str, 0) // Cache the end of the memory to calculate the length later. let end := str // We write the string from rightmost digit to leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // prettier-ignore for { let temp := value } 1 {} { str := sub(str, 1) // Write the character to the pointer. // The ASCII index of the '0' character is 48. mstore8(str, add(48, mod(temp, 10))) // Keep dividing `temp` until zero. temp := div(temp, 10) // prettier-ignore if iszero(temp) { break } } let length := sub(end, str) // Move the pointer 32 bytes leftwards to make room for the length. str := sub(str, 0x20) // Store the length. mstore(str, length) } } } // File: https://github.com/chiru-labs/ERC721A/blob/main/contracts/extensions/IERC721AQueryable.sol // ERC721A Contracts v4.2.3 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721AQueryable. */ interface IERC721AQueryable is IERC721A { /** * Invalid query range (`start` >= `stop`). */ error InvalidQueryRange(); /** * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting. * * If the `tokenId` is out of bounds: * * - `addr = address(0)` * - `startTimestamp = 0` * - `burned = false` * - `extraData = 0` * * If the `tokenId` is burned: * * - `addr = <Address of owner before token was burned>` * - `startTimestamp = <Timestamp when token was burned>` * - `burned = true` * - `extraData = <Extra data when token was burned>` * * Otherwise: * * - `addr = <Address of owner>` * - `startTimestamp = <Timestamp of start of ownership>` * - `burned = false` * - `extraData = <Extra data at start of ownership>` */ function explicitOwnershipOf(uint256 tokenId) external view returns (TokenOwnership memory); /** * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order. * See {ERC721AQueryable-explicitOwnershipOf} */ function explicitOwnershipsOf(uint256[] memory tokenIds) external view returns (TokenOwnership[] memory); /** * @dev Returns an array of token IDs owned by `owner`, * in the range [`start`, `stop`) * (i.e. `start <= tokenId < stop`). * * This function allows for tokens to be queried if the collection * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}. * * Requirements: * * - `start < stop` */ function tokensOfOwnerIn( address owner, uint256 start, uint256 stop ) external view returns (uint256[] memory); /** * @dev Returns an array of token IDs owned by `owner`. * * This function scans the ownership mapping and is O(`totalSupply`) in complexity. * It is meant to be called off-chain. * * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into * multiple smaller scans if the collection is large enough to cause * an out-of-gas error (10K collections should be fine). */ function tokensOfOwner(address owner) external view returns (uint256[] memory); } // File: https://github.com/chiru-labs/ERC721A/blob/main/contracts/extensions/ERC721AQueryable.sol // ERC721A Contracts v4.2.3 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @title ERC721AQueryable. * * @dev ERC721A subclass with convenience query functions. */ abstract contract ERC721AQueryable is ERC721A, IERC721AQueryable { /** * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting. * * If the `tokenId` is out of bounds: * * - `addr = address(0)` * - `startTimestamp = 0` * - `burned = false` * - `extraData = 0` * * If the `tokenId` is burned: * * - `addr = <Address of owner before token was burned>` * - `startTimestamp = <Timestamp when token was burned>` * - `burned = true` * - `extraData = <Extra data when token was burned>` * * Otherwise: * * - `addr = <Address of owner>` * - `startTimestamp = <Timestamp of start of ownership>` * - `burned = false` * - `extraData = <Extra data at start of ownership>` */ function explicitOwnershipOf(uint256 tokenId) public view virtual override returns (TokenOwnership memory) { TokenOwnership memory ownership; if (tokenId < _startTokenId() || tokenId >= _nextTokenId()) { return ownership; } ownership = _ownershipAt(tokenId); if (ownership.burned) { return ownership; } return _ownershipOf(tokenId); } /** * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order. * See {ERC721AQueryable-explicitOwnershipOf} */ function explicitOwnershipsOf(uint256[] calldata tokenIds) external view virtual override returns (TokenOwnership[] memory) { unchecked { uint256 tokenIdsLength = tokenIds.length; TokenOwnership[] memory ownerships = new TokenOwnership[](tokenIdsLength); for (uint256 i; i != tokenIdsLength; ++i) { ownerships[i] = explicitOwnershipOf(tokenIds[i]); } return ownerships; } } /** * @dev Returns an array of token IDs owned by `owner`, * in the range [`start`, `stop`) * (i.e. `start <= tokenId < stop`). * * This function allows for tokens to be queried if the collection * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}. * * Requirements: * * - `start < stop` */ function tokensOfOwnerIn( address owner, uint256 start, uint256 stop ) external view virtual override returns (uint256[] memory) { unchecked { if (start >= stop) revert InvalidQueryRange(); uint256 tokenIdsIdx; uint256 stopLimit = _nextTokenId(); // Set `start = max(start, _startTokenId())`. if (start < _startTokenId()) { start = _startTokenId(); } // Set `stop = min(stop, stopLimit)`. if (stop > stopLimit) { stop = stopLimit; } uint256 tokenIdsMaxLength = balanceOf(owner); // Set `tokenIdsMaxLength = min(balanceOf(owner), stop - start)`, // to cater for cases where `balanceOf(owner)` is too big. if (start < stop) { uint256 rangeLength = stop - start; if (rangeLength < tokenIdsMaxLength) { tokenIdsMaxLength = rangeLength; } } else { tokenIdsMaxLength = 0; } uint256[] memory tokenIds = new uint256[](tokenIdsMaxLength); if (tokenIdsMaxLength == 0) { return tokenIds; } // We need to call `explicitOwnershipOf(start)`, // because the slot at `start` may not be initialized. TokenOwnership memory ownership = explicitOwnershipOf(start); address currOwnershipAddr; // If the starting slot exists (i.e. not burned), initialize `currOwnershipAddr`. // `ownership.address` will not be zero, as `start` is clamped to the valid token ID range. if (!ownership.burned) { currOwnershipAddr = ownership.addr; } for (uint256 i = start; i != stop && tokenIdsIdx != tokenIdsMaxLength; ++i) { ownership = _ownershipAt(i); if (ownership.burned) { continue; } if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { tokenIds[tokenIdsIdx++] = i; } } // Downsize the array to fit. assembly { mstore(tokenIds, tokenIdsIdx) } return tokenIds; } } /** * @dev Returns an array of token IDs owned by `owner`. * * This function scans the ownership mapping and is O(`totalSupply`) in complexity. * It is meant to be called off-chain. * * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into * multiple smaller scans if the collection is large enough to cause * an out-of-gas error (10K collections should be fine). */ function tokensOfOwner(address owner) external view virtual override returns (uint256[] memory) { unchecked { uint256 tokenIdsIdx; address currOwnershipAddr; uint256 tokenIdsLength = balanceOf(owner); uint256[] memory tokenIds = new uint256[](tokenIdsLength); TokenOwnership memory ownership; for (uint256 i = _startTokenId(); tokenIdsIdx != tokenIdsLength; ++i) { ownership = _ownershipAt(i); if (ownership.burned) { continue; } if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { tokenIds[tokenIdsIdx++] = i; } } return tokenIds; } } } // 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/interfaces/IERC2981.sol // OpenZeppelin Contracts (last updated v4.6.0) (interfaces/IERC2981.sol) pragma solidity ^0.8.0; /** * @dev Interface for the NFT Royalty Standard. * * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal * support for royalty payments across all NFT marketplaces and ecosystem participants. * * _Available since v4.5._ */ interface IERC2981 is IERC165 { /** * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of * exchange. The royalty amount is denominated and should be paid in that same unit of exchange. */ function royaltyInfo(uint256 tokenId, uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount); } // File: @openzeppelin/contracts/token/common/ERC2981.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/common/ERC2981.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information. * * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first. * * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the * fee is specified in basis points by default. * * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported. * * _Available since v4.5._ */ abstract contract ERC2981 is IERC2981, ERC165 { struct RoyaltyInfo { address receiver; uint96 royaltyFraction; } RoyaltyInfo private _defaultRoyaltyInfo; mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) { return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId); } /** * @inheritdoc IERC2981 */ function royaltyInfo(uint256 _tokenId, uint256 _salePrice) public view virtual override returns (address, uint256) { RoyaltyInfo memory royalty = _tokenRoyaltyInfo[_tokenId]; if (royalty.receiver == address(0)) { royalty = _defaultRoyaltyInfo; } uint256 royaltyAmount = (_salePrice * royalty.royaltyFraction) / _feeDenominator(); return (royalty.receiver, royaltyAmount); } /** * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an * override. */ function _feeDenominator() internal pure virtual returns (uint96) { return 10000; } /** * @dev Sets the royalty information that all ids in this contract will default to. * * Requirements: * * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual { require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice"); require(receiver != address(0), "ERC2981: invalid receiver"); _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Removes default royalty information. */ function _deleteDefaultRoyalty() internal virtual { delete _defaultRoyaltyInfo; } /** * @dev Sets the royalty information for a specific token id, overriding the global default. * * Requirements: * * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setTokenRoyalty( uint256 tokenId, address receiver, uint96 feeNumerator ) internal virtual { require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice"); require(receiver != address(0), "ERC2981: Invalid parameters"); _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Resets royalty information for the token id back to the global default. */ function _resetTokenRoyalty(uint256 tokenId) internal virtual { delete _tokenRoyaltyInfo[tokenId]; } } // File: Contracts/CryptoTatz.sol //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! //!!!!!!!!!!!!!!!!!!!!!!!!!!!!~~~~^^^^::::::^^^^~~~~!!!!!!!!!!!!!!!!!!!!!!!!!!!! //!!!!!!!!!!!!!!!!!!!!!!^:.. ........:::....... ..:^!!!!!!!!!!!!!!!!!!!!!! //!!!!!!!!!!!!!!!!!!!!!^ ..................... ^!!!!!!!!!!!!!!!!!!!!! //!!!!!!!!!!!!!!!!!!!!!. . .:^~!~!7!!77!!7!~!~^:. .!!!!!!!!!!!!!!!!!!!!! //!!!!!!!!!!!!!!!!!!!!! . .~!??7??!J?!JJ7?J!?J7??!~. !!!!!!!!!!!!!!!!!!!!! //!!!!!!!!!!!!!!!!!!!!! . ^7?7??7??7J7JJ7Y7??7??7?7^. !!!!!!!!!!!!!!!!!!!!! //!!!!!!!!!!!!!!!!!!!!! . .~77?77????JJJJJJ????7??7!~. !!!!!!!!!!!!!!!!!!!!! //!!!!!!!!!!!!!!!!!!!!~ : .~!7???!!~^:.....:~!7??77!~. ~!!!!!!!!!!!!!!!!!!!! //!!!!!!!!!!!!!!!!!!!!! : .~!!^.. ~. ..^!!~. !!!!!!!!!!!!!!!!!!!!! //!!!!!!!!!!!!!!!!!!!!! . :!: :^!.. . . :7~: :!:. !!!!!!!!!!!!!!!!!!!!! //!!!!!!!!!!!!!!!!!!!!! . :~7^~JY:.:. .: ~Y?^~7~:. !!!!!!!!!!!!!!!!!!!!! //!!!!!!!!!!!!!!!!!!!!!. :~7?~^!?^:~~^::^!!:~?~^!J7~:. .!!!!!!!!!!!!!!!!!!!!! //!!!!!!!!!!!!!!!!!!!!!: :~7!??!~~~^:^~~^^:~~~7J?77~:. :!!!!!!!!!!!!!!!!!!!!! //!!!!!!!!!!!!!!!!!!!!!^ .^!?77J??77!~~~!!7?J?J77?!^. ^!!!!!!!!!!!!!!!!!!!!! //!!!!!!!!!!!!!!!!!!!!!~ .^~!7?!?J7J??JJ??J7J77?7!~^. ~!!!!!!!!!!!!!!!!!!!!! //!!!!!!!!!!!!!!!!!!!!!!. .^!7!7?!?J!J77?!J?!J7!7!^. .!!!!!!!!!!!!!!!!!!!!!! //!!!!!!!!!!!!!!!!!!!!!!: .:^~!!!?7!J77J!7?!!!~^:. :!!!!!!!!!!!!!!!!!!!!!! //!!!!!!!!!!!!!!!!!!!!!!~. .............. .~!!!!!!!!!!!!!!!!!!!!!! //!!!!!!!!!!!!!!!!!!!!!!!!!~^: :^~!!!!!!!!!!!!!!!!!!!!!!!!! //!!!!!!!!!!!!!!!!!!!!!~~^:....... .......:^~~!!!!!!!!!!!!!!!!!!!!! //!!!!!!!!!!!!!!!!!!~~^~::.::::^^:^:.....:. ..:^:^:::::.:.^^~~^~!!!!!!!!!!!!!!!! //!!!!!!!!!!!!!!!~^^^~!!^~:~:^^:^^~^^^^:.~:.~^^~^^:^^:~:^^!~~^::~!!!!!!!!!!!!!!! //!!!!!!!!!!!!^::^~~^!~!!!~!!^~^^^~~~.::.:::!~^^^^^^^~~~~~~~~^~~^::^!!!!!!!!!!!! //!!!!!!!!!!::.:~~~::^~~~^~~~!!!!~~^:..^::^:::^~~~~~~~^^^~~^:::^~~:.::!!!!!!!!!! //!!!!!!!!~..:.^~!:::.^~..:::^!~^^~~~~^:..:^~~~~^:~~^:::..~:.:::!~^.:..~!!!!!!!! //!!!!!!!!...^.^^~~^^^^~: ..::^~::^^::^::::^::^^::^^::.. :~^^^^^~^^.^...!!!!!!!! //!!!!!!!^...:..^^^^::^^^^......:..:::..::..:::..:......:^^^::^^^^..:...^!!!!!!! //!!!!!!!.....:.:::::..^^^~^. :^^:^^^^:.^^.:^^^^:^^: .^~^^^..:::::.:.....!!!!!!! //!!!!!!!..........::^::^:^~^...:^^^^:..::..:^^^^:...^^^:^::^::..........!!!!!!! //!!!!!!~ ... ..:^::.:^^~~:......:^....^:......:~~^^:.::^:.. ... ~!!!!!! //!!!!!!~ .... .:::::::::^^^^^^^^^^..^^^^^^^^^^:::::::::. .... ~!!!!!! //!!!!!!^ .. .. ..::::::.::::^:::......:::^::::.::::::.. .. .. ^!!!!!! // ~Crypto Tats~ // // By NOMOZ // // w/ Support from the Crazy Carl Collective // // // // Contract by gmgmi.eth // //////////////////////////////////////////////////////////////////////////////// pragma solidity >=0.8.16 <0.9.0; contract CryptoTatz is ERC2981, ERC721AQueryable { //Important Numbers uint public cost = 0.04 ether; uint public nftPerAddressLimit = 32; uint public maxPerTransaction = 10; uint public constant maxSupply = 1111; bool private paused = false; address[4] teamAddresses = [0x13AbB285529729ED8ACeCFf3Da52351e991F650e, 0x0B9db020472EFc722Da08a7dC50f3Abe3BE8bC29, 0x243D550239bcBFe53D1f3f7A811Bf99b6C3d7508, 0x9cF0249F2959b12CBcF8c417EC1c89EfF1A1eB5A]; //Other Important Stuff address private _owner; string public baseURI; //State Machine Flags bool public _isPrePresale = false; bool public _isPresale = false; bool public _isMainsale = false; //Mappings for allowlists mapping(address => uint) public _allowedTokens; //Modifiers modifier onlyOwner { require(msg.sender == _owner); _; } constructor( address royaltyReceiver, string memory name, string memory symbol, string memory _initBaseURI ) ERC721A(name, symbol) { _owner = msg.sender; _setDefaultRoyalty(royaltyReceiver, 500); setBaseURI(_initBaseURI); // Distribute team tokens per ERC721A and ERC2309, // Doing this at contract creation is most efficient // and only during this time it remains compliant w/ // the ERC-721 standard. // https://github.com/chiru-labs/ERC721A/blob/main/contracts/ERC721A.sol // https://eips.ethereum.org/EIPS/eip-2309 _mintERC2309(teamAddresses[0], 20); _mintERC2309(teamAddresses[1], 20); _mintERC2309(teamAddresses[2], 20); _mintERC2309(teamAddresses[3], 20); _mintERC2309(msg.sender, 20); } // LET'S GET TATTED UP! function mint(uint256 _mintAmount) public payable { require(!paused, "Minting is paused and will resume shortly!"); require(_isPrePresale || _isPresale || _isMainsale, "Minting is not active."); uint256 supply = totalSupply(); uint256 ownerMintedCount = balanceOf(msg.sender); uint _allowAmt = _allowedTokens[msg.sender]; require(_mintAmount > 0, "You need to mint at least one!"); require(supply + _mintAmount <= maxSupply, "You've requested more tokens than we have left."); require(_mintAmount <= maxPerTransaction, "You've requested more than the max per transaction"); if (msg.sender != _owner) { require(ownerMintedCount + _mintAmount <= nftPerAddressLimit, "You've hit the token limit for this address."); } if (_isPrePresale || _isPresale) { require(_allowedTokens[msg.sender] == _allowAmt); require(_allowedTokens[msg.sender] > 0, "You will be allowed to mint shortly."); require(_mintAmount <= _allowedTokens[msg.sender], "You've requested more tokens than we set aside for you."); _allowedTokens[msg.sender] -= _mintAmount; } require(msg.value >= cost * _mintAmount, "Please send the recommended amount of ETH to mint."); _safeMint(msg.sender, _mintAmount); } // This function overrides the ERC721 interface // to support EIP-2891 Royalty Standards function supportsInterface( bytes4 interfaceId ) public view virtual override(IERC721A, ERC721A, ERC2981) returns (bool) { return ERC721A.supportsInterface(interfaceId) || ERC2981.supportsInterface(interfaceId); } function withdraw() public payable onlyOwner { (bool _paid, ) = payable(_owner).call{value:address(this).balance}(""); require(_paid); } //Accept the free money event getDonation(address user, uint amount); receive() external payable { emit getDonation(msg.sender, msg.value); } //URI and CID functions function setBaseURI(string memory _newBaseURI) public onlyOwner { baseURI = _newBaseURI; } function _baseURI() internal view virtual override returns (string memory) { return baseURI; } //Minting Utility + State Machine Functions function pause(bool _state) public onlyOwner { paused = _state; } function addToList(address[] memory specialPeople, uint _tokenVol) public onlyOwner { require(specialPeople.length > 0, "You should try actually adding some people."); for (uint i = 0; i < specialPeople.length; i++) { _allowedTokens[specialPeople[i]] += _tokenVol; } } function goEarlyPresale() public onlyOwner { _isPrePresale = true; cost = 0.02 ether; } function goPresale() public onlyOwner { _isPrePresale = false; _isPresale = true; cost = 0.04 ether; maxPerTransaction = 2; } function goMainsale() public onlyOwner { require(!_isPrePresale, "You did not activate the main sale in the correct order."); _isPresale = false; _isMainsale = true; maxPerTransaction = 12; } function turnOffMinting() public onlyOwner { _isPrePresale = false; _isPresale = false; _isMainsale = false; cost = 0.04 ether; } //Contract Utility function remandOwnership(address newOwner) public onlyOwner { bool _check; _check = false; _owner = newOwner; _check = true; require(_check); } function setMax(uint _newMax) public onlyOwner { nftPerAddressLimit = _newMax; } function laserRemoval(uint256 tokenId) public { _burn(tokenId, true); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"royaltyReceiver","type":"address"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"_initBaseURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"InvalidQueryRange","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","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":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"getDonation","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_allowedTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_isMainsale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_isPrePresale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_isPresale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"specialPeople","type":"address[]"},{"internalType":"uint256","name":"_tokenVol","type":"uint256"}],"name":"addToList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"explicitOwnershipOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"explicitOwnershipsOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"goEarlyPresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"goMainsale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"goPresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"laserRemoval","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxPerTransaction","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftPerAddressLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"remandOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"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":"safeTransferFrom","outputs":[],"stateMutability":"payable","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":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMax","type":"uint256"}],"name":"setMax","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":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"stop","type":"uint256"}],"name":"tokensOfOwnerIn","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"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":"payable","type":"function"},{"inputs":[],"name":"turnOffMinting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
6080604052668e1bc9bf040000600a556020600b55600a600c556000600d60006101000a81548160ff02191690831515021790555060405180608001604052807313abb285529729ed8acecff3da52351e991f650e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001730b9db020472efc722da08a7dc50f3abe3be8bc2973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173243d550239bcbfe53d1f3f7a811bf99b6c3d750873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001739cf0249f2959b12cbcf8c417ec1c89eff1a1eb5a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815250600e90600462000167929190620008b0565b506000601460006101000a81548160ff0219169083151502179055506000601460016101000a81548160ff0219169083151502179055506000601460026101000a81548160ff021916908315150217905550348015620001c657600080fd5b5060405162005b9338038062005b938339818101604052810190620001ec919062000b49565b82828160049081620001ff919062000e63565b50806005908162000211919062000e63565b5062000222620003dd60201b60201c565b600281905550505033601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506200027f846101f4620003e260201b60201c565b62000290816200058460201b60201c565b620002dc600e600060048110620002ac57620002ab62000f4a565b5b0160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166014620005f460201b60201c565b62000328600e600160048110620002f857620002f762000f4a565b5b0160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166014620005f460201b60201c565b62000374600e60026004811062000344576200034362000f4a565b5b0160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166014620005f460201b60201c565b620003c0600e60036004811062000390576200038f62000f4a565b5b0160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166014620005f460201b60201c565b620003d3336014620005f460201b60201c565b50505050620010c2565b600090565b620003f26200082660201b60201c565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff16111562000453576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200044a9062001000565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603620004c5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004bc9062001072565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff168152506000808201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614620005df57600080fd5b8060139081620005f0919062000e63565b5050565b60006002549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160362000662576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082036200069d576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388821115620006da576040517f3db1f9af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620006ef60008483856200083060201b60201c565b600160406001901b178202600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506200077e836200076060008660006200083660201b60201c565b62000771856200086660201b60201c565b176200087660201b60201c565b60066000838152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff16827fdeaa91b6123d068f5821d0fb0678463d1a8a6079fe8af5de3ce5e896dcf9133d600186860103604051620007fb9190620010a5565b60405180910390a4818101600281905550620008216000848385620008a160201b60201c565b505050565b6000612710905090565b50505050565b60008060e883901c905060e862000855868684620008a760201b60201c565b62ffffff16901b9150509392505050565b60006001821460e11b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b60009392505050565b82600481019282156200091f579160200282015b828111156200091e5782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190620008c4565b5b5090506200092e919062000932565b5090565b5b808211156200094d57600081600090555060010162000933565b5090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620009928262000965565b9050919050565b620009a48162000985565b8114620009b057600080fd5b50565b600081519050620009c48162000999565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b62000a1f82620009d4565b810181811067ffffffffffffffff8211171562000a415762000a40620009e5565b5b80604052505050565b600062000a5662000951565b905062000a64828262000a14565b919050565b600067ffffffffffffffff82111562000a875762000a86620009e5565b5b62000a9282620009d4565b9050602081019050919050565b60005b8381101562000abf57808201518184015260208101905062000aa2565b60008484015250505050565b600062000ae262000adc8462000a69565b62000a4a565b90508281526020810184848401111562000b015762000b00620009cf565b5b62000b0e84828562000a9f565b509392505050565b600082601f83011262000b2e5762000b2d620009ca565b5b815162000b4084826020860162000acb565b91505092915050565b6000806000806080858703121562000b665762000b656200095b565b5b600062000b7687828801620009b3565b945050602085015167ffffffffffffffff81111562000b9a5762000b9962000960565b5b62000ba88782880162000b16565b935050604085015167ffffffffffffffff81111562000bcc5762000bcb62000960565b5b62000bda8782880162000b16565b925050606085015167ffffffffffffffff81111562000bfe5762000bfd62000960565b5b62000c0c8782880162000b16565b91505092959194509250565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000c6b57607f821691505b60208210810362000c815762000c8062000c23565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830262000ceb7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000cac565b62000cf7868362000cac565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000d4462000d3e62000d388462000d0f565b62000d19565b62000d0f565b9050919050565b6000819050919050565b62000d608362000d23565b62000d7862000d6f8262000d4b565b84845462000cb9565b825550505050565b600090565b62000d8f62000d80565b62000d9c81848462000d55565b505050565b5b8181101562000dc45762000db860008262000d85565b60018101905062000da2565b5050565b601f82111562000e135762000ddd8162000c87565b62000de88462000c9c565b8101602085101562000df8578190505b62000e1062000e078562000c9c565b83018262000da1565b50505b505050565b600082821c905092915050565b600062000e386000198460080262000e18565b1980831691505092915050565b600062000e53838362000e25565b9150826002028217905092915050565b62000e6e8262000c18565b67ffffffffffffffff81111562000e8a5762000e89620009e5565b5b62000e96825462000c52565b62000ea382828562000dc8565b600060209050601f83116001811462000edb576000841562000ec6578287015190505b62000ed2858262000e45565b86555062000f42565b601f19841662000eeb8662000c87565b60005b8281101562000f155784890151825560018201915060208501945060208101905062000eee565b8683101562000f35578489015162000f31601f89168262000e25565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082825260208201905092915050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b600062000fe8602a8362000f79565b915062000ff58262000f8a565b604082019050919050565b600060208201905081810360008301526200101b8162000fd9565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b60006200105a60198362000f79565b9150620010678262001022565b602082019050919050565b600060208201905081810360008301526200108d816200104b565b9050919050565b6200109f8162000d0f565b82525050565b6000602082019050620010bc600083018462001094565b92915050565b614ac180620010d26000396000f3fe60806040526004361061023f5760003560e01c80636c0360eb1161012e578063b88d4fde116100ab578063d5abeb011161006f578063d5abeb0114610878578063e2294dcb146108a3578063e985e9c5146108cc578063f7af3a2914610909578063fe5d0d60146109205761027f565b8063b88d4fde1461078c578063ba7d2c76146107a8578063c23dc68f146107d3578063c2fa89ee14610810578063c87b56dd1461083b5761027f565b806395d89b41116100f257806395d89b41146106a257806399a2557a146106cd578063a0712d681461070a578063a22cb46514610726578063b7660cd31461074f5761027f565b80636c0360eb146105bb57806370a08231146105e6578063735c5acf146106235780638462151c1461063a5780639165932f146106775761027f565b80632a55205a116101bc57806355f804b31161018057806355f804b3146104d85780635b6a8175146105015780635bbb2177146105185780636352211e1461055557806368015c58146105925761027f565b80632a55205a146104205780633cb88e8b1461045e5780633ccfd60b1461048757806342842e0e146104915780634b980d67146104ad5761027f565b806313faede61161020357806313faede61461036e57806318160ddd146103995780631fe9eabc146103c457806323b872dd146103ed57806325cf388e146104095761027f565b806301ffc9a71461028457806302329a29146102c157806306fdde03146102ea578063081812fc14610315578063095ea7b3146103525761027f565b3661027f577f38e48f7098b2d549679a9a0cc0c5eadab76bcae5d340f583d4cde9099ec3163a33346040516102759291906132a6565b60405180910390a1005b600080fd5b34801561029057600080fd5b506102ab60048036038101906102a6919061333b565b61094b565b6040516102b89190613383565b60405180910390f35b3480156102cd57600080fd5b506102e860048036038101906102e391906133ca565b61096d565b005b3480156102f657600080fd5b506102ff6109e4565b60405161030c9190613487565b60405180910390f35b34801561032157600080fd5b5061033c600480360381019061033791906134d5565b610a76565b6040516103499190613502565b60405180910390f35b61036c60048036038101906103679190613549565b610af5565b005b34801561037a57600080fd5b50610383610c39565b6040516103909190613589565b60405180910390f35b3480156103a557600080fd5b506103ae610c3f565b6040516103bb9190613589565b60405180910390f35b3480156103d057600080fd5b506103eb60048036038101906103e691906134d5565b610c56565b005b610407600480360381019061040291906135a4565b610cba565b005b34801561041557600080fd5b5061041e610fdc565b005b34801561042c57600080fd5b50610447600480360381019061044291906135f7565b611084565b6040516104559291906132a6565b60405180910390f35b34801561046a57600080fd5b50610485600480360381019061048091906134d5565b61126e565b005b61048f61127c565b005b6104ab60048036038101906104a691906135a4565b611371565b005b3480156104b957600080fd5b506104c2611391565b6040516104cf9190613589565b60405180910390f35b3480156104e457600080fd5b506104ff60048036038101906104fa919061376c565b611397565b005b34801561050d57600080fd5b50610516611404565b005b34801561052457600080fd5b5061053f600480360381019061053a9190613815565b6114bf565b60405161054c91906139c5565b60405180910390f35b34801561056157600080fd5b5061057c600480360381019061057791906134d5565b611582565b6040516105899190613502565b60405180910390f35b34801561059e57600080fd5b506105b960048036038101906105b49190613aaa565b611594565b005b3480156105c757600080fd5b506105d06116c6565b6040516105dd9190613487565b60405180910390f35b3480156105f257600080fd5b5061060d60048036038101906106089190613b06565b611754565b60405161061a9190613589565b60405180910390f35b34801561062f57600080fd5b5061063861180c565b005b34801561064657600080fd5b50610661600480360381019061065c9190613b06565b611891565b60405161066e9190613bf1565b60405180910390f35b34801561068357600080fd5b5061068c6119d4565b6040516106999190613383565b60405180910390f35b3480156106ae57600080fd5b506106b76119e7565b6040516106c49190613487565b60405180910390f35b3480156106d957600080fd5b506106f460048036038101906106ef9190613c13565b611a79565b6040516107019190613bf1565b60405180910390f35b610724600480360381019061071f91906134d5565b611c85565b005b34801561073257600080fd5b5061074d60048036038101906107489190613c66565b61215f565b005b34801561075b57600080fd5b5061077660048036038101906107719190613b06565b61226a565b6040516107839190613589565b60405180910390f35b6107a660048036038101906107a19190613d47565b612282565b005b3480156107b457600080fd5b506107bd6122f5565b6040516107ca9190613589565b60405180910390f35b3480156107df57600080fd5b506107fa60048036038101906107f591906134d5565b6122fb565b6040516108079190613e1f565b60405180910390f35b34801561081c57600080fd5b50610825612365565b6040516108329190613383565b60405180910390f35b34801561084757600080fd5b50610862600480360381019061085d91906134d5565b612378565b60405161086f9190613487565b60405180910390f35b34801561088457600080fd5b5061088d612416565b60405161089a9190613589565b60405180910390f35b3480156108af57600080fd5b506108ca60048036038101906108c59190613b06565b61241c565b005b3480156108d857600080fd5b506108f360048036038101906108ee9190613e3a565b6124cb565b6040516109009190613383565b60405180910390f35b34801561091557600080fd5b5061091e61255f565b005b34801561092c57600080fd5b50610935612648565b6040516109429190613383565b60405180910390f35b60006109568261265b565b806109665750610965826126ed565b5b9050919050565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146109c757600080fd5b80600d60006101000a81548160ff02191690831515021790555050565b6060600480546109f390613ea9565b80601f0160208091040260200160405190810160405280929190818152602001828054610a1f90613ea9565b8015610a6c5780601f10610a4157610100808354040283529160200191610a6c565b820191906000526020600020905b815481529060010190602001808311610a4f57829003601f168201915b5050505050905090565b6000610a8182612767565b610ab7576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6008600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b0082611582565b90508073ffffffffffffffffffffffffffffffffffffffff16610b216127c6565b73ffffffffffffffffffffffffffffffffffffffff1614610b8457610b4d81610b486127c6565b6124cb565b610b83576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826008600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600a5481565b6000610c496127ce565b6003546002540303905090565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610cb057600080fd5b80600b8190555050565b6000610cc5826127d3565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610d2c576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610d388461289f565b91509150610d4e8187610d496127c6565b6128c6565b610d9a57610d6386610d5e6127c6565b6124cb565b610d99576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603610e00576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e0d868686600161290a565b8015610e1857600082555b600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610ee685610ec2888887612910565b7c020000000000000000000000000000000000000000000000000000000017612938565b600660008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603610f6c5760006001850190506000600660008381526020019081526020016000205403610f6a576002548114610f69578360066000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610fd48686866001612963565b505050505050565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461103657600080fd5b6000601460006101000a81548160ff0219169083151502179055506001601460016101000a81548160ff021916908315150217905550668e1bc9bf040000600a819055506002600c81905550565b6000806000600160008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16036112195760006040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b6000611223612969565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff168661124f9190613f09565b6112599190613f7a565b90508160000151819350935050509250929050565b611279816001612973565b50565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146112d657600080fd5b6000601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff164760405161131e90613fdc565b60006040518083038185875af1925050503d806000811461135b576040519150601f19603f3d011682016040523d82523d6000602084013e611360565b606091505b505090508061136e57600080fd5b50565b61138c83838360405180602001604052806000815250612282565b505050565b600c5481565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146113f157600080fd5b8060139081611400919061419d565b5050565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461145e57600080fd5b6000601460006101000a81548160ff0219169083151502179055506000601460016101000a81548160ff0219169083151502179055506000601460026101000a81548160ff021916908315150217905550668e1bc9bf040000600a81905550565b6060600083839050905060008167ffffffffffffffff8111156114e5576114e4613641565b5b60405190808252806020026020018201604052801561151e57816020015b61150b6131fd565b8152602001906001900390816115035790505b50905060005b8281146115765761154d8686838181106115415761154061426f565b5b905060200201356122fb565b8282815181106115605761155f61426f565b5b6020026020010181905250806001019050611524565b50809250505092915050565b600061158d826127d3565b9050919050565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146115ee57600080fd5b6000825111611632576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162990614310565b60405180910390fd5b60005b82518110156116c15781601560008584815181106116565761165561426f565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546116a79190614330565b9250508190555080806116b990614364565b915050611635565b505050565b601380546116d390613ea9565b80601f01602080910402602001604051908101604052809291908181526020018280546116ff90613ea9565b801561174c5780601f106117215761010080835404028352916020019161174c565b820191906000526020600020905b81548152906001019060200180831161172f57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036117bb576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461186657600080fd5b6001601460006101000a81548160ff02191690831515021790555066470de4df820000600a81905550565b606060008060006118a185611754565b905060008167ffffffffffffffff8111156118bf576118be613641565b5b6040519080825280602002602001820160405280156118ed5781602001602082028036833780820191505090505b5090506118f86131fd565b60006119026127ce565b90505b8386146119c65761191581612bc5565b915081604001516119bb57600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff161461196057816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036119ba57808387806001019850815181106119ad576119ac61426f565b5b6020026020010181815250505b5b806001019050611905565b508195505050505050919050565b601460009054906101000a900460ff1681565b6060600580546119f690613ea9565b80601f0160208091040260200160405190810160405280929190818152602001828054611a2290613ea9565b8015611a6f5780601f10611a4457610100808354040283529160200191611a6f565b820191906000526020600020905b815481529060010190602001808311611a5257829003601f168201915b5050505050905090565b6060818310611ab4576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080611abf612bf0565b9050611ac96127ce565b851015611adb57611ad86127ce565b94505b80841115611ae7578093505b6000611af287611754565b905084861015611b15576000868603905081811015611b0f578091505b50611b1a565b600090505b60008167ffffffffffffffff811115611b3657611b35613641565b5b604051908082528060200260200182016040528015611b645781602001602082028036833780820191505090505b50905060008203611b7b5780945050505050611c7e565b6000611b86886122fb565b905060008160400151611b9b57816000015190505b60008990505b888114158015611bb15750848714155b15611c7057611bbf81612bc5565b92508260400151611c6557600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff1614611c0a57826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611c645780848880600101995081518110611c5757611c5661426f565b5b6020026020010181815250505b5b806001019050611ba1565b508583528296505050505050505b9392505050565b600d60009054906101000a900460ff1615611cd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ccc9061441e565b60405180910390fd5b601460009054906101000a900460ff1680611cfc5750601460019054906101000a900460ff165b80611d135750601460029054906101000a900460ff165b611d52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d499061448a565b60405180910390fd5b6000611d5c610c3f565b90506000611d6933611754565b90506000601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008411611df2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de9906144f6565b60405180910390fd5b6104578484611e019190614330565b1115611e42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3990614588565b60405180910390fd5b600c54841115611e87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7e9061461a565b60405180910390fd5b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611f2d57600b548483611eeb9190614330565b1115611f2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f23906146ac565b60405180910390fd5b5b601460009054906101000a900460ff1680611f545750601460019054906101000a900460ff165b156120ff5780601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414611fa457600080fd5b6000601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411612026576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201d9061473e565b60405180910390fd5b601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548411156120a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209f906147d0565b60405180910390fd5b83601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120f791906147f0565b925050819055505b83600a5461210d9190613f09565b34101561214f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214690614896565b60405180910390fd5b6121593385612bfa565b50505050565b806009600061216c6127c6565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166122196127c6565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161225e9190613383565b60405180910390a35050565b60156020528060005260406000206000915090505481565b61228d848484610cba565b60008373ffffffffffffffffffffffffffffffffffffffff163b146122ef576122b884848484612c18565b6122ee576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b600b5481565b6123036131fd565b61230b6131fd565b6123136127ce565b8310806123275750612323612bf0565b8310155b156123355780915050612360565b61233e83612bc5565b90508060400151156123535780915050612360565b61235c83612d68565b9150505b919050565b601460029054906101000a900460ff1681565b606061238382612767565b6123b9576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006123c3612d88565b905060008151036123e3576040518060200160405280600081525061240e565b806123ed84612e1a565b6040516020016123fe9291906148f2565b6040516020818303038152906040525b915050919050565b61045781565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461247657600080fd5b600081601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060019050806124c757600080fd5b5050565b6000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146125b957600080fd5b601460009054906101000a900460ff1615612609576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161260090614988565b60405180910390fd5b6000601460016101000a81548160ff0219169083151502179055506001601460026101000a81548160ff021916908315150217905550600c8081905550565b601460019054906101000a900460ff1681565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806126b657506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806126e65750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612760575061275f82612e6a565b5b9050919050565b6000816127726127ce565b11158015612781575060025482105b80156127bf575060007c0100000000000000000000000000000000000000000000000000000000600660008581526020019081526020016000205416145b9050919050565b600033905090565b600090565b600080829050806127e26127ce565b11612868576002548110156128675760006006600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603612865575b6000810361285b576006600083600190039350838152602001908152602001600020549050612831565b809250505061289a565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006008600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8612927868684612ed4565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6000612710905090565b600061297e836127d3565b905060008190506000806129918661289f565b9150915084156129fa576129ad81846129a86127c6565b6128c6565b6129f9576129c2836129bd6127c6565b6124cb565b6129f8576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5b612a0883600088600161290a565b8015612a1357600082555b600160806001901b03600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612abb83612a7885600088612910565b7c02000000000000000000000000000000000000000000000000000000007c01000000000000000000000000000000000000000000000000000000001717612938565b600660008881526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000851603612b415760006001870190506000600660008381526020019081526020016000205403612b3f576002548114612b3e578460066000838152602001908152602001600020819055505b5b505b85600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612bab836000886001612963565b600360008154809291906001019190505550505050505050565b612bcd6131fd565b612be96006600084815260200190815260200160002054612edd565b9050919050565b6000600254905090565b612c14828260405180602001604052806000815250612f93565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612c3e6127c6565b8786866040518563ffffffff1660e01b8152600401612c6094939291906149fd565b6020604051808303816000875af1925050508015612c9c57506040513d601f19601f82011682018060405250810190612c999190614a5e565b60015b612d15573d8060008114612ccc576040519150601f19603f3d011682016040523d82523d6000602084013e612cd1565b606091505b506000815103612d0d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b612d706131fd565b612d81612d7c836127d3565b612edd565b9050919050565b606060138054612d9790613ea9565b80601f0160208091040260200160405190810160405280929190818152602001828054612dc390613ea9565b8015612e105780601f10612de557610100808354040283529160200191612e10565b820191906000526020600020905b815481529060010190602001808311612df357829003601f168201915b5050505050905090565b606060a060405101806040526020810391506000825281835b600115612e5557600184039350600a81066030018453600a8104905080612e33575b50828103602084039350808452505050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60009392505050565b612ee56131fd565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b612f9d8383613031565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461302c5760006002549050600083820390505b612fde6000868380600101945086612c18565b613014576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110612fcb57816002541461302957600080fd5b50505b505050565b6000600254905060008203613072576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61307f600084838561290a565b600160406001901b178202600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506130f6836130e76000866000612910565b6130f0856131ed565b17612938565b6006600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461319757808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a460018101905061315c565b50600082036131d2576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060028190555050506131e86000848385612963565b505050565b60006001821460e11b9050919050565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600015158152602001600062ffffff1681525090565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006132778261324c565b9050919050565b6132878161326c565b82525050565b6000819050919050565b6132a08161328d565b82525050565b60006040820190506132bb600083018561327e565b6132c86020830184613297565b9392505050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613318816132e3565b811461332357600080fd5b50565b6000813590506133358161330f565b92915050565b600060208284031215613351576133506132d9565b5b600061335f84828501613326565b91505092915050565b60008115159050919050565b61337d81613368565b82525050565b60006020820190506133986000830184613374565b92915050565b6133a781613368565b81146133b257600080fd5b50565b6000813590506133c48161339e565b92915050565b6000602082840312156133e0576133df6132d9565b5b60006133ee848285016133b5565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613431578082015181840152602081019050613416565b60008484015250505050565b6000601f19601f8301169050919050565b6000613459826133f7565b6134638185613402565b9350613473818560208601613413565b61347c8161343d565b840191505092915050565b600060208201905081810360008301526134a1818461344e565b905092915050565b6134b28161328d565b81146134bd57600080fd5b50565b6000813590506134cf816134a9565b92915050565b6000602082840312156134eb576134ea6132d9565b5b60006134f9848285016134c0565b91505092915050565b6000602082019050613517600083018461327e565b92915050565b6135268161326c565b811461353157600080fd5b50565b6000813590506135438161351d565b92915050565b600080604083850312156135605761355f6132d9565b5b600061356e85828601613534565b925050602061357f858286016134c0565b9150509250929050565b600060208201905061359e6000830184613297565b92915050565b6000806000606084860312156135bd576135bc6132d9565b5b60006135cb86828701613534565b93505060206135dc86828701613534565b92505060406135ed868287016134c0565b9150509250925092565b6000806040838503121561360e5761360d6132d9565b5b600061361c858286016134c0565b925050602061362d858286016134c0565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6136798261343d565b810181811067ffffffffffffffff8211171561369857613697613641565b5b80604052505050565b60006136ab6132cf565b90506136b78282613670565b919050565b600067ffffffffffffffff8211156136d7576136d6613641565b5b6136e08261343d565b9050602081019050919050565b82818337600083830152505050565b600061370f61370a846136bc565b6136a1565b90508281526020810184848401111561372b5761372a61363c565b5b6137368482856136ed565b509392505050565b600082601f83011261375357613752613637565b5b81356137638482602086016136fc565b91505092915050565b600060208284031215613782576137816132d9565b5b600082013567ffffffffffffffff8111156137a05761379f6132de565b5b6137ac8482850161373e565b91505092915050565b600080fd5b600080fd5b60008083601f8401126137d5576137d4613637565b5b8235905067ffffffffffffffff8111156137f2576137f16137b5565b5b60208301915083602082028301111561380e5761380d6137ba565b5b9250929050565b6000806020838503121561382c5761382b6132d9565b5b600083013567ffffffffffffffff81111561384a576138496132de565b5b613856858286016137bf565b92509250509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6138978161326c565b82525050565b600067ffffffffffffffff82169050919050565b6138ba8161389d565b82525050565b6138c981613368565b82525050565b600062ffffff82169050919050565b6138e7816138cf565b82525050565b608082016000820151613903600085018261388e565b50602082015161391660208501826138b1565b50604082015161392960408501826138c0565b50606082015161393c60608501826138de565b50505050565b600061394e83836138ed565b60808301905092915050565b6000602082019050919050565b600061397282613862565b61397c818561386d565b93506139878361387e565b8060005b838110156139b857815161399f8882613942565b97506139aa8361395a565b92505060018101905061398b565b5085935050505092915050565b600060208201905081810360008301526139df8184613967565b905092915050565b600067ffffffffffffffff821115613a0257613a01613641565b5b602082029050602081019050919050565b6000613a26613a21846139e7565b6136a1565b90508083825260208201905060208402830185811115613a4957613a486137ba565b5b835b81811015613a725780613a5e8882613534565b845260208401935050602081019050613a4b565b5050509392505050565b600082601f830112613a9157613a90613637565b5b8135613aa1848260208601613a13565b91505092915050565b60008060408385031215613ac157613ac06132d9565b5b600083013567ffffffffffffffff811115613adf57613ade6132de565b5b613aeb85828601613a7c565b9250506020613afc858286016134c0565b9150509250929050565b600060208284031215613b1c57613b1b6132d9565b5b6000613b2a84828501613534565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613b688161328d565b82525050565b6000613b7a8383613b5f565b60208301905092915050565b6000602082019050919050565b6000613b9e82613b33565b613ba88185613b3e565b9350613bb383613b4f565b8060005b83811015613be4578151613bcb8882613b6e565b9750613bd683613b86565b925050600181019050613bb7565b5085935050505092915050565b60006020820190508181036000830152613c0b8184613b93565b905092915050565b600080600060608486031215613c2c57613c2b6132d9565b5b6000613c3a86828701613534565b9350506020613c4b868287016134c0565b9250506040613c5c868287016134c0565b9150509250925092565b60008060408385031215613c7d57613c7c6132d9565b5b6000613c8b85828601613534565b9250506020613c9c858286016133b5565b9150509250929050565b600067ffffffffffffffff821115613cc157613cc0613641565b5b613cca8261343d565b9050602081019050919050565b6000613cea613ce584613ca6565b6136a1565b905082815260208101848484011115613d0657613d0561363c565b5b613d118482856136ed565b509392505050565b600082601f830112613d2e57613d2d613637565b5b8135613d3e848260208601613cd7565b91505092915050565b60008060008060808587031215613d6157613d606132d9565b5b6000613d6f87828801613534565b9450506020613d8087828801613534565b9350506040613d91878288016134c0565b925050606085013567ffffffffffffffff811115613db257613db16132de565b5b613dbe87828801613d19565b91505092959194509250565b608082016000820151613de0600085018261388e565b506020820151613df360208501826138b1565b506040820151613e0660408501826138c0565b506060820151613e1960608501826138de565b50505050565b6000608082019050613e346000830184613dca565b92915050565b60008060408385031215613e5157613e506132d9565b5b6000613e5f85828601613534565b9250506020613e7085828601613534565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613ec157607f821691505b602082108103613ed457613ed3613e7a565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613f148261328d565b9150613f1f8361328d565b9250828202613f2d8161328d565b91508282048414831517613f4457613f43613eda565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613f858261328d565b9150613f908361328d565b925082613fa057613f9f613f4b565b5b828204905092915050565b600081905092915050565b50565b6000613fc6600083613fab565b9150613fd182613fb6565b600082019050919050565b6000613fe782613fb9565b9150819050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026140537fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614016565b61405d8683614016565b95508019841693508086168417925050509392505050565b6000819050919050565b600061409a6140956140908461328d565b614075565b61328d565b9050919050565b6000819050919050565b6140b48361407f565b6140c86140c0826140a1565b848454614023565b825550505050565b600090565b6140dd6140d0565b6140e88184846140ab565b505050565b5b8181101561410c576141016000826140d5565b6001810190506140ee565b5050565b601f8211156141515761412281613ff1565b61412b84614006565b8101602085101561413a578190505b61414e61414685614006565b8301826140ed565b50505b505050565b600082821c905092915050565b600061417460001984600802614156565b1980831691505092915050565b600061418d8383614163565b9150826002028217905092915050565b6141a6826133f7565b67ffffffffffffffff8111156141bf576141be613641565b5b6141c98254613ea9565b6141d4828285614110565b600060209050601f83116001811461420757600084156141f5578287015190505b6141ff8582614181565b865550614267565b601f19841661421586613ff1565b60005b8281101561423d57848901518255600182019150602085019450602081019050614218565b8683101561425a5784890151614256601f891682614163565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f596f752073686f756c64207472792061637475616c6c7920616464696e67207360008201527f6f6d652070656f706c652e000000000000000000000000000000000000000000602082015250565b60006142fa602b83613402565b91506143058261429e565b604082019050919050565b60006020820190508181036000830152614329816142ed565b9050919050565b600061433b8261328d565b91506143468361328d565b925082820190508082111561435e5761435d613eda565b5b92915050565b600061436f8261328d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036143a1576143a0613eda565b5b600182019050919050565b7f4d696e74696e672069732070617573656420616e642077696c6c20726573756d60008201527f652073686f72746c792100000000000000000000000000000000000000000000602082015250565b6000614408602a83613402565b9150614413826143ac565b604082019050919050565b60006020820190508181036000830152614437816143fb565b9050919050565b7f4d696e74696e67206973206e6f74206163746976652e00000000000000000000600082015250565b6000614474601683613402565b915061447f8261443e565b602082019050919050565b600060208201905081810360008301526144a381614467565b9050919050565b7f596f75206e65656420746f206d696e74206174206c65617374206f6e65210000600082015250565b60006144e0601e83613402565b91506144eb826144aa565b602082019050919050565b6000602082019050818103600083015261450f816144d3565b9050919050565b7f596f7527766520726571756573746564206d6f726520746f6b656e732074686160008201527f6e2077652068617665206c6566742e0000000000000000000000000000000000602082015250565b6000614572602f83613402565b915061457d82614516565b604082019050919050565b600060208201905081810360008301526145a181614565565b9050919050565b7f596f7527766520726571756573746564206d6f7265207468616e20746865206d60008201527f617820706572207472616e73616374696f6e0000000000000000000000000000602082015250565b6000614604603283613402565b915061460f826145a8565b604082019050919050565b60006020820190508181036000830152614633816145f7565b9050919050565b7f596f75277665206869742074686520746f6b656e206c696d697420666f72207460008201527f68697320616464726573732e0000000000000000000000000000000000000000602082015250565b6000614696602c83613402565b91506146a18261463a565b604082019050919050565b600060208201905081810360008301526146c581614689565b9050919050565b7f596f752077696c6c20626520616c6c6f77656420746f206d696e742073686f7260008201527f746c792e00000000000000000000000000000000000000000000000000000000602082015250565b6000614728602483613402565b9150614733826146cc565b604082019050919050565b600060208201905081810360008301526147578161471b565b9050919050565b7f596f7527766520726571756573746564206d6f726520746f6b656e732074686160008201527f6e2077652073657420617369646520666f7220796f752e000000000000000000602082015250565b60006147ba603783613402565b91506147c58261475e565b604082019050919050565b600060208201905081810360008301526147e9816147ad565b9050919050565b60006147fb8261328d565b91506148068361328d565b925082820390508181111561481e5761481d613eda565b5b92915050565b7f506c656173652073656e6420746865207265636f6d6d656e64656420616d6f7560008201527f6e74206f662045544820746f206d696e742e0000000000000000000000000000602082015250565b6000614880603283613402565b915061488b82614824565b604082019050919050565b600060208201905081810360008301526148af81614873565b9050919050565b600081905092915050565b60006148cc826133f7565b6148d681856148b6565b93506148e6818560208601613413565b80840191505092915050565b60006148fe82856148c1565b915061490a82846148c1565b91508190509392505050565b7f596f7520646964206e6f7420616374697661746520746865206d61696e20736160008201527f6c6520696e2074686520636f7272656374206f726465722e0000000000000000602082015250565b6000614972603883613402565b915061497d82614916565b604082019050919050565b600060208201905081810360008301526149a181614965565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006149cf826149a8565b6149d981856149b3565b93506149e9818560208601613413565b6149f28161343d565b840191505092915050565b6000608082019050614a12600083018761327e565b614a1f602083018661327e565b614a2c6040830185613297565b8181036060830152614a3e81846149c4565b905095945050505050565b600081519050614a588161330f565b92915050565b600060208284031215614a7457614a736132d9565b5b6000614a8284828501614a49565b9150509291505056fea2646970667358221220749bf394b19501a14d99e84f6c574203b4d9f085d6e45dcc0a9558f2b4bdf48764736f6c63430008110033000000000000000000000000bd8878298d6c1a62a7ca7632fb3ee897cea85f7c000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000152043727970746f2054617473206279204e4f4d4f5a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000b2043525950544f54415453000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005668747470733a2f2f63727970746f746174732e6d7970696e6174612e636c6f75642f697066732f516d5452576d44615675586b324e7856687a5a36333955437942384e72365a78736e615468706759444b347035312f00000000000000000000
Deployed Bytecode
0x60806040526004361061023f5760003560e01c80636c0360eb1161012e578063b88d4fde116100ab578063d5abeb011161006f578063d5abeb0114610878578063e2294dcb146108a3578063e985e9c5146108cc578063f7af3a2914610909578063fe5d0d60146109205761027f565b8063b88d4fde1461078c578063ba7d2c76146107a8578063c23dc68f146107d3578063c2fa89ee14610810578063c87b56dd1461083b5761027f565b806395d89b41116100f257806395d89b41146106a257806399a2557a146106cd578063a0712d681461070a578063a22cb46514610726578063b7660cd31461074f5761027f565b80636c0360eb146105bb57806370a08231146105e6578063735c5acf146106235780638462151c1461063a5780639165932f146106775761027f565b80632a55205a116101bc57806355f804b31161018057806355f804b3146104d85780635b6a8175146105015780635bbb2177146105185780636352211e1461055557806368015c58146105925761027f565b80632a55205a146104205780633cb88e8b1461045e5780633ccfd60b1461048757806342842e0e146104915780634b980d67146104ad5761027f565b806313faede61161020357806313faede61461036e57806318160ddd146103995780631fe9eabc146103c457806323b872dd146103ed57806325cf388e146104095761027f565b806301ffc9a71461028457806302329a29146102c157806306fdde03146102ea578063081812fc14610315578063095ea7b3146103525761027f565b3661027f577f38e48f7098b2d549679a9a0cc0c5eadab76bcae5d340f583d4cde9099ec3163a33346040516102759291906132a6565b60405180910390a1005b600080fd5b34801561029057600080fd5b506102ab60048036038101906102a6919061333b565b61094b565b6040516102b89190613383565b60405180910390f35b3480156102cd57600080fd5b506102e860048036038101906102e391906133ca565b61096d565b005b3480156102f657600080fd5b506102ff6109e4565b60405161030c9190613487565b60405180910390f35b34801561032157600080fd5b5061033c600480360381019061033791906134d5565b610a76565b6040516103499190613502565b60405180910390f35b61036c60048036038101906103679190613549565b610af5565b005b34801561037a57600080fd5b50610383610c39565b6040516103909190613589565b60405180910390f35b3480156103a557600080fd5b506103ae610c3f565b6040516103bb9190613589565b60405180910390f35b3480156103d057600080fd5b506103eb60048036038101906103e691906134d5565b610c56565b005b610407600480360381019061040291906135a4565b610cba565b005b34801561041557600080fd5b5061041e610fdc565b005b34801561042c57600080fd5b50610447600480360381019061044291906135f7565b611084565b6040516104559291906132a6565b60405180910390f35b34801561046a57600080fd5b50610485600480360381019061048091906134d5565b61126e565b005b61048f61127c565b005b6104ab60048036038101906104a691906135a4565b611371565b005b3480156104b957600080fd5b506104c2611391565b6040516104cf9190613589565b60405180910390f35b3480156104e457600080fd5b506104ff60048036038101906104fa919061376c565b611397565b005b34801561050d57600080fd5b50610516611404565b005b34801561052457600080fd5b5061053f600480360381019061053a9190613815565b6114bf565b60405161054c91906139c5565b60405180910390f35b34801561056157600080fd5b5061057c600480360381019061057791906134d5565b611582565b6040516105899190613502565b60405180910390f35b34801561059e57600080fd5b506105b960048036038101906105b49190613aaa565b611594565b005b3480156105c757600080fd5b506105d06116c6565b6040516105dd9190613487565b60405180910390f35b3480156105f257600080fd5b5061060d60048036038101906106089190613b06565b611754565b60405161061a9190613589565b60405180910390f35b34801561062f57600080fd5b5061063861180c565b005b34801561064657600080fd5b50610661600480360381019061065c9190613b06565b611891565b60405161066e9190613bf1565b60405180910390f35b34801561068357600080fd5b5061068c6119d4565b6040516106999190613383565b60405180910390f35b3480156106ae57600080fd5b506106b76119e7565b6040516106c49190613487565b60405180910390f35b3480156106d957600080fd5b506106f460048036038101906106ef9190613c13565b611a79565b6040516107019190613bf1565b60405180910390f35b610724600480360381019061071f91906134d5565b611c85565b005b34801561073257600080fd5b5061074d60048036038101906107489190613c66565b61215f565b005b34801561075b57600080fd5b5061077660048036038101906107719190613b06565b61226a565b6040516107839190613589565b60405180910390f35b6107a660048036038101906107a19190613d47565b612282565b005b3480156107b457600080fd5b506107bd6122f5565b6040516107ca9190613589565b60405180910390f35b3480156107df57600080fd5b506107fa60048036038101906107f591906134d5565b6122fb565b6040516108079190613e1f565b60405180910390f35b34801561081c57600080fd5b50610825612365565b6040516108329190613383565b60405180910390f35b34801561084757600080fd5b50610862600480360381019061085d91906134d5565b612378565b60405161086f9190613487565b60405180910390f35b34801561088457600080fd5b5061088d612416565b60405161089a9190613589565b60405180910390f35b3480156108af57600080fd5b506108ca60048036038101906108c59190613b06565b61241c565b005b3480156108d857600080fd5b506108f360048036038101906108ee9190613e3a565b6124cb565b6040516109009190613383565b60405180910390f35b34801561091557600080fd5b5061091e61255f565b005b34801561092c57600080fd5b50610935612648565b6040516109429190613383565b60405180910390f35b60006109568261265b565b806109665750610965826126ed565b5b9050919050565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146109c757600080fd5b80600d60006101000a81548160ff02191690831515021790555050565b6060600480546109f390613ea9565b80601f0160208091040260200160405190810160405280929190818152602001828054610a1f90613ea9565b8015610a6c5780601f10610a4157610100808354040283529160200191610a6c565b820191906000526020600020905b815481529060010190602001808311610a4f57829003601f168201915b5050505050905090565b6000610a8182612767565b610ab7576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6008600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b0082611582565b90508073ffffffffffffffffffffffffffffffffffffffff16610b216127c6565b73ffffffffffffffffffffffffffffffffffffffff1614610b8457610b4d81610b486127c6565b6124cb565b610b83576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826008600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600a5481565b6000610c496127ce565b6003546002540303905090565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610cb057600080fd5b80600b8190555050565b6000610cc5826127d3565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610d2c576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610d388461289f565b91509150610d4e8187610d496127c6565b6128c6565b610d9a57610d6386610d5e6127c6565b6124cb565b610d99576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603610e00576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e0d868686600161290a565b8015610e1857600082555b600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610ee685610ec2888887612910565b7c020000000000000000000000000000000000000000000000000000000017612938565b600660008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603610f6c5760006001850190506000600660008381526020019081526020016000205403610f6a576002548114610f69578360066000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610fd48686866001612963565b505050505050565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461103657600080fd5b6000601460006101000a81548160ff0219169083151502179055506001601460016101000a81548160ff021916908315150217905550668e1bc9bf040000600a819055506002600c81905550565b6000806000600160008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16036112195760006040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b6000611223612969565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff168661124f9190613f09565b6112599190613f7a565b90508160000151819350935050509250929050565b611279816001612973565b50565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146112d657600080fd5b6000601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff164760405161131e90613fdc565b60006040518083038185875af1925050503d806000811461135b576040519150601f19603f3d011682016040523d82523d6000602084013e611360565b606091505b505090508061136e57600080fd5b50565b61138c83838360405180602001604052806000815250612282565b505050565b600c5481565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146113f157600080fd5b8060139081611400919061419d565b5050565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461145e57600080fd5b6000601460006101000a81548160ff0219169083151502179055506000601460016101000a81548160ff0219169083151502179055506000601460026101000a81548160ff021916908315150217905550668e1bc9bf040000600a81905550565b6060600083839050905060008167ffffffffffffffff8111156114e5576114e4613641565b5b60405190808252806020026020018201604052801561151e57816020015b61150b6131fd565b8152602001906001900390816115035790505b50905060005b8281146115765761154d8686838181106115415761154061426f565b5b905060200201356122fb565b8282815181106115605761155f61426f565b5b6020026020010181905250806001019050611524565b50809250505092915050565b600061158d826127d3565b9050919050565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146115ee57600080fd5b6000825111611632576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162990614310565b60405180910390fd5b60005b82518110156116c15781601560008584815181106116565761165561426f565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546116a79190614330565b9250508190555080806116b990614364565b915050611635565b505050565b601380546116d390613ea9565b80601f01602080910402602001604051908101604052809291908181526020018280546116ff90613ea9565b801561174c5780601f106117215761010080835404028352916020019161174c565b820191906000526020600020905b81548152906001019060200180831161172f57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036117bb576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461186657600080fd5b6001601460006101000a81548160ff02191690831515021790555066470de4df820000600a81905550565b606060008060006118a185611754565b905060008167ffffffffffffffff8111156118bf576118be613641565b5b6040519080825280602002602001820160405280156118ed5781602001602082028036833780820191505090505b5090506118f86131fd565b60006119026127ce565b90505b8386146119c65761191581612bc5565b915081604001516119bb57600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff161461196057816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036119ba57808387806001019850815181106119ad576119ac61426f565b5b6020026020010181815250505b5b806001019050611905565b508195505050505050919050565b601460009054906101000a900460ff1681565b6060600580546119f690613ea9565b80601f0160208091040260200160405190810160405280929190818152602001828054611a2290613ea9565b8015611a6f5780601f10611a4457610100808354040283529160200191611a6f565b820191906000526020600020905b815481529060010190602001808311611a5257829003601f168201915b5050505050905090565b6060818310611ab4576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080611abf612bf0565b9050611ac96127ce565b851015611adb57611ad86127ce565b94505b80841115611ae7578093505b6000611af287611754565b905084861015611b15576000868603905081811015611b0f578091505b50611b1a565b600090505b60008167ffffffffffffffff811115611b3657611b35613641565b5b604051908082528060200260200182016040528015611b645781602001602082028036833780820191505090505b50905060008203611b7b5780945050505050611c7e565b6000611b86886122fb565b905060008160400151611b9b57816000015190505b60008990505b888114158015611bb15750848714155b15611c7057611bbf81612bc5565b92508260400151611c6557600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff1614611c0a57826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611c645780848880600101995081518110611c5757611c5661426f565b5b6020026020010181815250505b5b806001019050611ba1565b508583528296505050505050505b9392505050565b600d60009054906101000a900460ff1615611cd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ccc9061441e565b60405180910390fd5b601460009054906101000a900460ff1680611cfc5750601460019054906101000a900460ff165b80611d135750601460029054906101000a900460ff165b611d52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d499061448a565b60405180910390fd5b6000611d5c610c3f565b90506000611d6933611754565b90506000601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008411611df2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de9906144f6565b60405180910390fd5b6104578484611e019190614330565b1115611e42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3990614588565b60405180910390fd5b600c54841115611e87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7e9061461a565b60405180910390fd5b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611f2d57600b548483611eeb9190614330565b1115611f2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f23906146ac565b60405180910390fd5b5b601460009054906101000a900460ff1680611f545750601460019054906101000a900460ff165b156120ff5780601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414611fa457600080fd5b6000601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411612026576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201d9061473e565b60405180910390fd5b601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548411156120a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209f906147d0565b60405180910390fd5b83601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120f791906147f0565b925050819055505b83600a5461210d9190613f09565b34101561214f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214690614896565b60405180910390fd5b6121593385612bfa565b50505050565b806009600061216c6127c6565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166122196127c6565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161225e9190613383565b60405180910390a35050565b60156020528060005260406000206000915090505481565b61228d848484610cba565b60008373ffffffffffffffffffffffffffffffffffffffff163b146122ef576122b884848484612c18565b6122ee576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b600b5481565b6123036131fd565b61230b6131fd565b6123136127ce565b8310806123275750612323612bf0565b8310155b156123355780915050612360565b61233e83612bc5565b90508060400151156123535780915050612360565b61235c83612d68565b9150505b919050565b601460029054906101000a900460ff1681565b606061238382612767565b6123b9576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006123c3612d88565b905060008151036123e3576040518060200160405280600081525061240e565b806123ed84612e1a565b6040516020016123fe9291906148f2565b6040516020818303038152906040525b915050919050565b61045781565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461247657600080fd5b600081601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060019050806124c757600080fd5b5050565b6000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146125b957600080fd5b601460009054906101000a900460ff1615612609576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161260090614988565b60405180910390fd5b6000601460016101000a81548160ff0219169083151502179055506001601460026101000a81548160ff021916908315150217905550600c8081905550565b601460019054906101000a900460ff1681565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806126b657506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806126e65750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612760575061275f82612e6a565b5b9050919050565b6000816127726127ce565b11158015612781575060025482105b80156127bf575060007c0100000000000000000000000000000000000000000000000000000000600660008581526020019081526020016000205416145b9050919050565b600033905090565b600090565b600080829050806127e26127ce565b11612868576002548110156128675760006006600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603612865575b6000810361285b576006600083600190039350838152602001908152602001600020549050612831565b809250505061289a565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006008600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8612927868684612ed4565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6000612710905090565b600061297e836127d3565b905060008190506000806129918661289f565b9150915084156129fa576129ad81846129a86127c6565b6128c6565b6129f9576129c2836129bd6127c6565b6124cb565b6129f8576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5b612a0883600088600161290a565b8015612a1357600082555b600160806001901b03600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612abb83612a7885600088612910565b7c02000000000000000000000000000000000000000000000000000000007c01000000000000000000000000000000000000000000000000000000001717612938565b600660008881526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000851603612b415760006001870190506000600660008381526020019081526020016000205403612b3f576002548114612b3e578460066000838152602001908152602001600020819055505b5b505b85600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612bab836000886001612963565b600360008154809291906001019190505550505050505050565b612bcd6131fd565b612be96006600084815260200190815260200160002054612edd565b9050919050565b6000600254905090565b612c14828260405180602001604052806000815250612f93565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612c3e6127c6565b8786866040518563ffffffff1660e01b8152600401612c6094939291906149fd565b6020604051808303816000875af1925050508015612c9c57506040513d601f19601f82011682018060405250810190612c999190614a5e565b60015b612d15573d8060008114612ccc576040519150601f19603f3d011682016040523d82523d6000602084013e612cd1565b606091505b506000815103612d0d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b612d706131fd565b612d81612d7c836127d3565b612edd565b9050919050565b606060138054612d9790613ea9565b80601f0160208091040260200160405190810160405280929190818152602001828054612dc390613ea9565b8015612e105780601f10612de557610100808354040283529160200191612e10565b820191906000526020600020905b815481529060010190602001808311612df357829003601f168201915b5050505050905090565b606060a060405101806040526020810391506000825281835b600115612e5557600184039350600a81066030018453600a8104905080612e33575b50828103602084039350808452505050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60009392505050565b612ee56131fd565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b612f9d8383613031565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461302c5760006002549050600083820390505b612fde6000868380600101945086612c18565b613014576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110612fcb57816002541461302957600080fd5b50505b505050565b6000600254905060008203613072576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61307f600084838561290a565b600160406001901b178202600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506130f6836130e76000866000612910565b6130f0856131ed565b17612938565b6006600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461319757808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a460018101905061315c565b50600082036131d2576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060028190555050506131e86000848385612963565b505050565b60006001821460e11b9050919050565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600015158152602001600062ffffff1681525090565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006132778261324c565b9050919050565b6132878161326c565b82525050565b6000819050919050565b6132a08161328d565b82525050565b60006040820190506132bb600083018561327e565b6132c86020830184613297565b9392505050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613318816132e3565b811461332357600080fd5b50565b6000813590506133358161330f565b92915050565b600060208284031215613351576133506132d9565b5b600061335f84828501613326565b91505092915050565b60008115159050919050565b61337d81613368565b82525050565b60006020820190506133986000830184613374565b92915050565b6133a781613368565b81146133b257600080fd5b50565b6000813590506133c48161339e565b92915050565b6000602082840312156133e0576133df6132d9565b5b60006133ee848285016133b5565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613431578082015181840152602081019050613416565b60008484015250505050565b6000601f19601f8301169050919050565b6000613459826133f7565b6134638185613402565b9350613473818560208601613413565b61347c8161343d565b840191505092915050565b600060208201905081810360008301526134a1818461344e565b905092915050565b6134b28161328d565b81146134bd57600080fd5b50565b6000813590506134cf816134a9565b92915050565b6000602082840312156134eb576134ea6132d9565b5b60006134f9848285016134c0565b91505092915050565b6000602082019050613517600083018461327e565b92915050565b6135268161326c565b811461353157600080fd5b50565b6000813590506135438161351d565b92915050565b600080604083850312156135605761355f6132d9565b5b600061356e85828601613534565b925050602061357f858286016134c0565b9150509250929050565b600060208201905061359e6000830184613297565b92915050565b6000806000606084860312156135bd576135bc6132d9565b5b60006135cb86828701613534565b93505060206135dc86828701613534565b92505060406135ed868287016134c0565b9150509250925092565b6000806040838503121561360e5761360d6132d9565b5b600061361c858286016134c0565b925050602061362d858286016134c0565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6136798261343d565b810181811067ffffffffffffffff8211171561369857613697613641565b5b80604052505050565b60006136ab6132cf565b90506136b78282613670565b919050565b600067ffffffffffffffff8211156136d7576136d6613641565b5b6136e08261343d565b9050602081019050919050565b82818337600083830152505050565b600061370f61370a846136bc565b6136a1565b90508281526020810184848401111561372b5761372a61363c565b5b6137368482856136ed565b509392505050565b600082601f83011261375357613752613637565b5b81356137638482602086016136fc565b91505092915050565b600060208284031215613782576137816132d9565b5b600082013567ffffffffffffffff8111156137a05761379f6132de565b5b6137ac8482850161373e565b91505092915050565b600080fd5b600080fd5b60008083601f8401126137d5576137d4613637565b5b8235905067ffffffffffffffff8111156137f2576137f16137b5565b5b60208301915083602082028301111561380e5761380d6137ba565b5b9250929050565b6000806020838503121561382c5761382b6132d9565b5b600083013567ffffffffffffffff81111561384a576138496132de565b5b613856858286016137bf565b92509250509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6138978161326c565b82525050565b600067ffffffffffffffff82169050919050565b6138ba8161389d565b82525050565b6138c981613368565b82525050565b600062ffffff82169050919050565b6138e7816138cf565b82525050565b608082016000820151613903600085018261388e565b50602082015161391660208501826138b1565b50604082015161392960408501826138c0565b50606082015161393c60608501826138de565b50505050565b600061394e83836138ed565b60808301905092915050565b6000602082019050919050565b600061397282613862565b61397c818561386d565b93506139878361387e565b8060005b838110156139b857815161399f8882613942565b97506139aa8361395a565b92505060018101905061398b565b5085935050505092915050565b600060208201905081810360008301526139df8184613967565b905092915050565b600067ffffffffffffffff821115613a0257613a01613641565b5b602082029050602081019050919050565b6000613a26613a21846139e7565b6136a1565b90508083825260208201905060208402830185811115613a4957613a486137ba565b5b835b81811015613a725780613a5e8882613534565b845260208401935050602081019050613a4b565b5050509392505050565b600082601f830112613a9157613a90613637565b5b8135613aa1848260208601613a13565b91505092915050565b60008060408385031215613ac157613ac06132d9565b5b600083013567ffffffffffffffff811115613adf57613ade6132de565b5b613aeb85828601613a7c565b9250506020613afc858286016134c0565b9150509250929050565b600060208284031215613b1c57613b1b6132d9565b5b6000613b2a84828501613534565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613b688161328d565b82525050565b6000613b7a8383613b5f565b60208301905092915050565b6000602082019050919050565b6000613b9e82613b33565b613ba88185613b3e565b9350613bb383613b4f565b8060005b83811015613be4578151613bcb8882613b6e565b9750613bd683613b86565b925050600181019050613bb7565b5085935050505092915050565b60006020820190508181036000830152613c0b8184613b93565b905092915050565b600080600060608486031215613c2c57613c2b6132d9565b5b6000613c3a86828701613534565b9350506020613c4b868287016134c0565b9250506040613c5c868287016134c0565b9150509250925092565b60008060408385031215613c7d57613c7c6132d9565b5b6000613c8b85828601613534565b9250506020613c9c858286016133b5565b9150509250929050565b600067ffffffffffffffff821115613cc157613cc0613641565b5b613cca8261343d565b9050602081019050919050565b6000613cea613ce584613ca6565b6136a1565b905082815260208101848484011115613d0657613d0561363c565b5b613d118482856136ed565b509392505050565b600082601f830112613d2e57613d2d613637565b5b8135613d3e848260208601613cd7565b91505092915050565b60008060008060808587031215613d6157613d606132d9565b5b6000613d6f87828801613534565b9450506020613d8087828801613534565b9350506040613d91878288016134c0565b925050606085013567ffffffffffffffff811115613db257613db16132de565b5b613dbe87828801613d19565b91505092959194509250565b608082016000820151613de0600085018261388e565b506020820151613df360208501826138b1565b506040820151613e0660408501826138c0565b506060820151613e1960608501826138de565b50505050565b6000608082019050613e346000830184613dca565b92915050565b60008060408385031215613e5157613e506132d9565b5b6000613e5f85828601613534565b9250506020613e7085828601613534565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613ec157607f821691505b602082108103613ed457613ed3613e7a565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613f148261328d565b9150613f1f8361328d565b9250828202613f2d8161328d565b91508282048414831517613f4457613f43613eda565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613f858261328d565b9150613f908361328d565b925082613fa057613f9f613f4b565b5b828204905092915050565b600081905092915050565b50565b6000613fc6600083613fab565b9150613fd182613fb6565b600082019050919050565b6000613fe782613fb9565b9150819050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026140537fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614016565b61405d8683614016565b95508019841693508086168417925050509392505050565b6000819050919050565b600061409a6140956140908461328d565b614075565b61328d565b9050919050565b6000819050919050565b6140b48361407f565b6140c86140c0826140a1565b848454614023565b825550505050565b600090565b6140dd6140d0565b6140e88184846140ab565b505050565b5b8181101561410c576141016000826140d5565b6001810190506140ee565b5050565b601f8211156141515761412281613ff1565b61412b84614006565b8101602085101561413a578190505b61414e61414685614006565b8301826140ed565b50505b505050565b600082821c905092915050565b600061417460001984600802614156565b1980831691505092915050565b600061418d8383614163565b9150826002028217905092915050565b6141a6826133f7565b67ffffffffffffffff8111156141bf576141be613641565b5b6141c98254613ea9565b6141d4828285614110565b600060209050601f83116001811461420757600084156141f5578287015190505b6141ff8582614181565b865550614267565b601f19841661421586613ff1565b60005b8281101561423d57848901518255600182019150602085019450602081019050614218565b8683101561425a5784890151614256601f891682614163565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f596f752073686f756c64207472792061637475616c6c7920616464696e67207360008201527f6f6d652070656f706c652e000000000000000000000000000000000000000000602082015250565b60006142fa602b83613402565b91506143058261429e565b604082019050919050565b60006020820190508181036000830152614329816142ed565b9050919050565b600061433b8261328d565b91506143468361328d565b925082820190508082111561435e5761435d613eda565b5b92915050565b600061436f8261328d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036143a1576143a0613eda565b5b600182019050919050565b7f4d696e74696e672069732070617573656420616e642077696c6c20726573756d60008201527f652073686f72746c792100000000000000000000000000000000000000000000602082015250565b6000614408602a83613402565b9150614413826143ac565b604082019050919050565b60006020820190508181036000830152614437816143fb565b9050919050565b7f4d696e74696e67206973206e6f74206163746976652e00000000000000000000600082015250565b6000614474601683613402565b915061447f8261443e565b602082019050919050565b600060208201905081810360008301526144a381614467565b9050919050565b7f596f75206e65656420746f206d696e74206174206c65617374206f6e65210000600082015250565b60006144e0601e83613402565b91506144eb826144aa565b602082019050919050565b6000602082019050818103600083015261450f816144d3565b9050919050565b7f596f7527766520726571756573746564206d6f726520746f6b656e732074686160008201527f6e2077652068617665206c6566742e0000000000000000000000000000000000602082015250565b6000614572602f83613402565b915061457d82614516565b604082019050919050565b600060208201905081810360008301526145a181614565565b9050919050565b7f596f7527766520726571756573746564206d6f7265207468616e20746865206d60008201527f617820706572207472616e73616374696f6e0000000000000000000000000000602082015250565b6000614604603283613402565b915061460f826145a8565b604082019050919050565b60006020820190508181036000830152614633816145f7565b9050919050565b7f596f75277665206869742074686520746f6b656e206c696d697420666f72207460008201527f68697320616464726573732e0000000000000000000000000000000000000000602082015250565b6000614696602c83613402565b91506146a18261463a565b604082019050919050565b600060208201905081810360008301526146c581614689565b9050919050565b7f596f752077696c6c20626520616c6c6f77656420746f206d696e742073686f7260008201527f746c792e00000000000000000000000000000000000000000000000000000000602082015250565b6000614728602483613402565b9150614733826146cc565b604082019050919050565b600060208201905081810360008301526147578161471b565b9050919050565b7f596f7527766520726571756573746564206d6f726520746f6b656e732074686160008201527f6e2077652073657420617369646520666f7220796f752e000000000000000000602082015250565b60006147ba603783613402565b91506147c58261475e565b604082019050919050565b600060208201905081810360008301526147e9816147ad565b9050919050565b60006147fb8261328d565b91506148068361328d565b925082820390508181111561481e5761481d613eda565b5b92915050565b7f506c656173652073656e6420746865207265636f6d6d656e64656420616d6f7560008201527f6e74206f662045544820746f206d696e742e0000000000000000000000000000602082015250565b6000614880603283613402565b915061488b82614824565b604082019050919050565b600060208201905081810360008301526148af81614873565b9050919050565b600081905092915050565b60006148cc826133f7565b6148d681856148b6565b93506148e6818560208601613413565b80840191505092915050565b60006148fe82856148c1565b915061490a82846148c1565b91508190509392505050565b7f596f7520646964206e6f7420616374697661746520746865206d61696e20736160008201527f6c6520696e2074686520636f7272656374206f726465722e0000000000000000602082015250565b6000614972603883613402565b915061497d82614916565b604082019050919050565b600060208201905081810360008301526149a181614965565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006149cf826149a8565b6149d981856149b3565b93506149e9818560208601613413565b6149f28161343d565b840191505092915050565b6000608082019050614a12600083018761327e565b614a1f602083018661327e565b614a2c6040830185613297565b8181036060830152614a3e81846149c4565b905095945050505050565b600081519050614a588161330f565b92915050565b600060208284031215614a7457614a736132d9565b5b6000614a8284828501614a49565b9150509291505056fea2646970667358221220749bf394b19501a14d99e84f6c574203b4d9f085d6e45dcc0a9558f2b4bdf48764736f6c63430008110033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000bd8878298d6c1a62a7ca7632fb3ee897cea85f7c000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000152043727970746f2054617473206279204e4f4d4f5a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000b2043525950544f54415453000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005668747470733a2f2f63727970746f746174732e6d7970696e6174612e636c6f75642f697066732f516d5452576d44615675586b324e7856687a5a36333955437942384e72365a78736e615468706759444b347035312f00000000000000000000
-----Decoded View---------------
Arg [0] : royaltyReceiver (address): 0xBD8878298D6c1a62a7ca7632fB3eE897ceA85f7C
Arg [1] : name (string): Crypto Tats by NOMOZ
Arg [2] : symbol (string): CRYPTOTATS
Arg [3] : _initBaseURI (string): https://cryptotats.mypinata.cloud/ipfs/QmTRWmDaVuXk2NxVhzZ639UCyB8Nr6ZxsnaThpgYDK4p51/
-----Encoded View---------------
12 Constructor Arguments found :
Arg [0] : 000000000000000000000000bd8878298d6c1a62a7ca7632fb3ee897cea85f7c
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000015
Arg [5] : 2043727970746f2054617473206279204e4f4d4f5a0000000000000000000000
Arg [6] : 000000000000000000000000000000000000000000000000000000000000000b
Arg [7] : 2043525950544f54415453000000000000000000000000000000000000000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000056
Arg [9] : 68747470733a2f2f63727970746f746174732e6d7970696e6174612e636c6f75
Arg [10] : 642f697066732f516d5452576d44615675586b324e7856687a5a363339554379
Arg [11] : 42384e72365a78736e615468706759444b347035312f00000000000000000000
Deployed Bytecode Sourcemap
71256:5978:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75359:34;75371:10;75383:9;75359:34;;;;;;;:::i;:::-;;;;;;;;71256:5978;;;;;74764:279;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75714:77;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19386:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25877:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25310:408;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71341:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15137:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77046:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29516:2825;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76244:158;;;;;;;;;;;;;:::i;:::-;;65070:442;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;77146:85;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75051:155;;;:::i;:::-;;32437:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71419:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75439:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76651:162;;;;;;;;;;;;;:::i;:::-;;55787:528;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20779:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75799:319;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71915:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16321:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76130:106;;;;;;;;;;;;;:::i;:::-;;59663:900;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71974:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19562:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56703:2513;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73178:1469;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26435:234;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72128:46;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33228:407;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71377:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55200:428;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72051:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19772:318;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71460:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76845:193;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26826:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76410:233;;;;;;;;;;;;;:::i;:::-;;72014:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74764:279;74912:4;74938:38;74964:11;74938:25;:38::i;:::-;:97;;;;74997:38;75023:11;74997:25;:38::i;:::-;74938:97;74931:104;;74764:279;;;:::o;75714:77::-;72252:6;;;;;;;;;;;72238:20;;:10;:20;;;72230:29;;;;;;75777:6:::1;75768;;:15;;;;;;;;;;;;;;;;;;75714:77:::0;:::o;19386:100::-;19440:13;19473:5;19466:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19386:100;:::o;25877:218::-;25953:7;25978:16;25986:7;25978;:16::i;:::-;25973:64;;26003:34;;;;;;;;;;;;;;25973:64;26057:15;:24;26073:7;26057:24;;;;;;;;;;;:30;;;;;;;;;;;;26050:37;;25877:218;;;:::o;25310:408::-;25399:13;25415:16;25423:7;25415;:16::i;:::-;25399:32;;25471:5;25448:28;;:19;:17;:19::i;:::-;:28;;;25444:175;;25496:44;25513:5;25520:19;:17;:19::i;:::-;25496:16;:44::i;:::-;25491:128;;25568:35;;;;;;;;;;;;;;25491:128;25444:175;25664:2;25631:15;:24;25647:7;25631:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;25702:7;25698:2;25682:28;;25691:5;25682:28;;;;;;;;;;;;25388:330;25310:408;;:::o;71341:29::-;;;;:::o;15137:323::-;15198:7;15426:15;:13;:15::i;:::-;15411:12;;15395:13;;:28;:46;15388:53;;15137:323;:::o;77046:92::-;72252:6;;;;;;;;;;;72238:20;;:10;:20;;;72230:29;;;;;;77123:7:::1;77102:18;:28;;;;77046:92:::0;:::o;29516:2825::-;29658:27;29688;29707:7;29688:18;:27::i;:::-;29658:57;;29773:4;29732:45;;29748:19;29732:45;;;29728:86;;29786:28;;;;;;;;;;;;;;29728:86;29828:27;29857:23;29884:35;29911:7;29884:26;:35::i;:::-;29827:92;;;;30019:68;30044:15;30061:4;30067:19;:17;:19::i;:::-;30019:24;:68::i;:::-;30014:180;;30107:43;30124:4;30130:19;:17;:19::i;:::-;30107:16;:43::i;:::-;30102:92;;30159:35;;;;;;;;;;;;;;30102:92;30014:180;30225:1;30211:16;;:2;:16;;;30207:52;;30236:23;;;;;;;;;;;;;;30207:52;30272:43;30294:4;30300:2;30304:7;30313:1;30272:21;:43::i;:::-;30408:15;30405:160;;;30548:1;30527:19;30520:30;30405:160;30945:18;:24;30964:4;30945:24;;;;;;;;;;;;;;;;30943:26;;;;;;;;;;;;31014:18;:22;31033:2;31014:22;;;;;;;;;;;;;;;;31012:24;;;;;;;;;;;31336:146;31373:2;31422:45;31437:4;31443:2;31447:19;31422:14;:45::i;:::-;11536:8;31394:73;31336:18;:146::i;:::-;31307:17;:26;31325:7;31307:26;;;;;;;;;;;:175;;;;31653:1;11536:8;31602:19;:47;:52;31598:627;;31675:19;31707:1;31697:7;:11;31675:33;;31864:1;31830:17;:30;31848:11;31830:30;;;;;;;;;;;;:35;31826:384;;31968:13;;31953:11;:28;31949:242;;32148:19;32115:17;:30;32133:11;32115:30;;;;;;;;;;;:52;;;;31949:242;31826:384;31656:569;31598:627;32272:7;32268:2;32253:27;;32262:4;32253:27;;;;;;;;;;;;32291:42;32312:4;32318:2;32322:7;32331:1;32291:20;:42::i;:::-;29647:2694;;;29516:2825;;;:::o;76244:158::-;72252:6;;;;;;;;;;;72238:20;;:10;:20;;;72230:29;;;;;;76307:5:::1;76291:13;;:21;;;;;;;;;;;;;;;;;;76334:4;76321:10;;:17;;;;;;;;;;;;;;;;;;76354:10;76347:4;:17;;;;76393:1;76373:17;:21;;;;76244:158::o:0;65070:442::-;65167:7;65176;65196:26;65225:17;:27;65243:8;65225:27;;;;;;;;;;;65196:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65297:1;65269:30;;:7;:16;;;:30;;;65265:92;;65326:19;65316:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65265:92;65369:21;65434:17;:15;:17::i;:::-;65393:58;;65407:7;:23;;;65394:36;;:10;:36;;;;:::i;:::-;65393:58;;;;:::i;:::-;65369:82;;65472:7;:16;;;65490:13;65464:40;;;;;;65070:442;;;;;:::o;77146:85::-;77203:20;77209:7;77218:4;77203:5;:20::i;:::-;77146:85;:::o;75051:155::-;72252:6;;;;;;;;;;;72238:20;;:10;:20;;;72230:29;;;;;;75106:10:::1;75130:6;;;;;;;;;;;75122:20;;75149:21;75122:53;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75105:70;;;75192:5;75184:14;;;::::0;::::1;;75096:110;75051:155::o:0;32437:193::-;32583:39;32600:4;32606:2;32610:7;32583:39;;;;;;;;;;;;:16;:39::i;:::-;32437:193;;;:::o;71419:34::-;;;;:::o;75439:102::-;72252:6;;;;;;;;;;;72238:20;;:10;:20;;;72230:29;;;;;;75522:11:::1;75512:7;:21;;;;;;:::i;:::-;;75439:102:::0;:::o;76651:162::-;72252:6;;;;;;;;;;;72238:20;;:10;:20;;;72230:29;;;;;;76719:5:::1;76703:13;;:21;;;;;;;;;;;;;;;;;;76746:5;76733:10;;:18;;;;;;;;;;;;;;;;;;76774:5;76760:11;;:19;;;;;;;;;;;;;;;;;;76795:10;76788:4;:17;;;;76651:162::o:0;55787:528::-;55931:23;55997:22;56022:8;;:15;;55997:40;;56052:34;56110:14;56089:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;56052:73;;56145:9;56140:125;56161:14;56156:1;:19;56140:125;;56217:32;56237:8;;56246:1;56237:11;;;;;;;:::i;:::-;;;;;;;;56217:19;:32::i;:::-;56201:10;56212:1;56201:13;;;;;;;;:::i;:::-;;;;;;;:48;;;;56177:3;;;;;56140:125;;;;56286:10;56279:17;;;;55787:528;;;;:::o;20779:152::-;20851:7;20894:27;20913:7;20894:18;:27::i;:::-;20871:52;;20779:152;;;:::o;75799:319::-;72252:6;;;;;;;;;;;72238:20;;:10;:20;;;72230:29;;;;;;75929:1:::1;75906:13;:20;:24;75898:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;76002:6;75997:114;76018:13;:20;76014:1;:24;75997:114;;;76092:9;76056:14;:32;76071:13;76085:1;76071:16;;;;;;;;:::i;:::-;;;;;;;;76056:32;;;;;;;;;;;;;;;;:45;;;;;;;:::i;:::-;;;;;;;;76040:3;;;;;:::i;:::-;;;;75997:114;;;;75799:319:::0;;:::o;71915:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;16321:233::-;16393:7;16434:1;16417:19;;:5;:19;;;16413:60;;16445:28;;;;;;;;;;;;;;16413:60;10480:13;16491:18;:25;16510:5;16491:25;;;;;;;;;;;;;;;;:55;16484:62;;16321:233;;;:::o;76130:106::-;72252:6;;;;;;;;;;;72238:20;;:10;:20;;;72230:29;;;;;;76198:4:::1;76182:13;;:20;;;;;;;;;;;;;;;;;;76218:10;76211:4;:17;;;;76130:106::o:0;59663:900::-;59741:16;59795:19;59829:25;59869:22;59894:16;59904:5;59894:9;:16::i;:::-;59869:41;;59925:25;59967:14;59953:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59925:57;;59997:31;;:::i;:::-;60048:9;60060:15;:13;:15::i;:::-;60048:27;;60043:472;60092:14;60077:11;:29;60043:472;;60144:15;60157:1;60144:12;:15::i;:::-;60132:27;;60182:9;:16;;;60223:8;60178:73;60299:1;60273:28;;:9;:14;;;:28;;;60269:111;;60346:9;:14;;;60326:34;;60269:111;60423:5;60402:26;;:17;:26;;;60398:102;;60479:1;60453:8;60462:13;;;;;;60453:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;60398:102;60043:472;60108:3;;;;;60043:472;;;;60536:8;60529:15;;;;;;;59663:900;;;:::o;71974:33::-;;;;;;;;;;;;;:::o;19562:104::-;19618:13;19651:7;19644:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19562:104;:::o;56703:2513::-;56846:16;56913:4;56904:5;:13;56900:45;;56926:19;;;;;;;;;;;;;;56900:45;56960:19;56994:17;57014:14;:12;:14::i;:::-;56994:34;;57114:15;:13;:15::i;:::-;57106:5;:23;57102:87;;;57158:15;:13;:15::i;:::-;57150:23;;57102:87;57265:9;57258:4;:16;57254:73;;;57302:9;57295:16;;57254:73;57341:25;57369:16;57379:5;57369:9;:16::i;:::-;57341:44;;57563:4;57555:5;:12;57551:278;;;57588:19;57617:5;57610:4;:12;57588:34;;57659:17;57645:11;:31;57641:111;;;57721:11;57701:31;;57641:111;57569:198;57551:278;;;57812:1;57792:21;;57551:278;57843:25;57885:17;57871:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57843:60;;57943:1;57922:17;:22;57918:78;;57972:8;57965:15;;;;;;;;57918:78;58140:31;58174:26;58194:5;58174:19;:26::i;:::-;58140:60;;58215:25;58460:9;:16;;;58455:92;;58517:9;:14;;;58497:34;;58455:92;58566:9;58578:5;58566:17;;58561:478;58590:4;58585:1;:9;;:45;;;;;58613:17;58598:11;:32;;58585:45;58561:478;;;58668:15;58681:1;58668:12;:15::i;:::-;58656:27;;58706:9;:16;;;58747:8;58702:73;58823:1;58797:28;;:9;:14;;;:28;;;58793:111;;58870:9;:14;;;58850:34;;58793:111;58947:5;58926:26;;:17;:26;;;58922:102;;59003:1;58977:8;58986:13;;;;;;58977:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;58922:102;58561:478;58632:3;;;;;58561:478;;;;59141:11;59131:8;59124:29;59189:8;59182:15;;;;;;;;56703:2513;;;;;;:::o;73178:1469::-;73253:6;;;;;;;;;;;73252:7;73244:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;73335:13;;;;;;;;;;;:27;;;;73352:10;;;;;;;;;;;73335:27;:42;;;;73366:11;;;;;;;;;;;73335:42;73327:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;73427:14;73444:13;:11;:13::i;:::-;73427:30;;73468:24;73495:21;73505:10;73495:9;:21::i;:::-;73468:48;;73527:14;73544;:26;73559:10;73544:26;;;;;;;;;;;;;;;;73527:43;;73605:1;73591:11;:15;73583:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;71493:4;73669:11;73660:6;:20;;;;:::i;:::-;:33;;73652:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;73791:17;;73776:11;:32;;73768:104;;;;;;;;;;;;:::i;:::-;;;;;;;;;73903:6;;;;;;;;;;;73889:20;;:10;:20;;;73885:171;;73966:18;;73951:11;73932:16;:30;;;;:::i;:::-;:52;;73924:120;;;;;;;;;;;;:::i;:::-;;;;;;;;;73885:171;74072:13;;;;;;;;;;;:27;;;;74089:10;;;;;;;;;;;74072:27;74068:398;;;74152:9;74122:14;:26;74137:10;74122:26;;;;;;;;;;;;;;;;:39;74114:48;;;;;;74212:1;74183:14;:26;74198:10;74183:26;;;;;;;;;;;;;;;;:30;74175:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;74302:14;:26;74317:10;74302:26;;;;;;;;;;;;;;;;74287:11;:41;;74279:121;;;;;;;;;;;;:::i;:::-;;;;;;;;;74443:11;74413:14;:26;74428:10;74413:26;;;;;;;;;;;;;;;;:41;;;;;;;:::i;:::-;;;;;;;;74068:398;74518:11;74511:4;;:18;;;;:::i;:::-;74498:9;:31;;74490:104;;;;;;;;;;;;:::i;:::-;;;;;;;;;74605:34;74615:10;74627:11;74605:9;:34::i;:::-;73233:1414;;;73178:1469;:::o;26435:234::-;26582:8;26530:18;:39;26549:19;:17;:19::i;:::-;26530:39;;;;;;;;;;;;;;;:49;26570:8;26530:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;26642:8;26606:55;;26621:19;:17;:19::i;:::-;26606:55;;;26652:8;26606:55;;;;;;:::i;:::-;;;;;;;;26435:234;;:::o;72128:46::-;;;;;;;;;;;;;;;;;:::o;33228:407::-;33403:31;33416:4;33422:2;33426:7;33403:12;:31::i;:::-;33467:1;33449:2;:14;;;:19;33445:183;;33488:56;33519:4;33525:2;33529:7;33538:5;33488:30;:56::i;:::-;33483:145;;33572:40;;;;;;;;;;;;;;33483:145;33445:183;33228:407;;;;:::o;71377:35::-;;;;:::o;55200:428::-;55284:21;;:::i;:::-;55318:31;;:::i;:::-;55374:15;:13;:15::i;:::-;55364:7;:25;:54;;;;55404:14;:12;:14::i;:::-;55393:7;:25;;55364:54;55360:103;;;55442:9;55435:16;;;;;55360:103;55485:21;55498:7;55485:12;:21::i;:::-;55473:33;;55521:9;:16;;;55517:65;;;55561:9;55554:16;;;;;55517:65;55599:21;55612:7;55599:12;:21::i;:::-;55592:28;;;55200:428;;;;:::o;72051:31::-;;;;;;;;;;;;;:::o;19772:318::-;19845:13;19876:16;19884:7;19876;:16::i;:::-;19871:59;;19901:29;;;;;;;;;;;;;;19871:59;19943:21;19967:10;:8;:10::i;:::-;19943:34;;20020:1;20001:7;19995:21;:26;:87;;;;;;;;;;;;;;;;;20048:7;20057:18;20067:7;20057:9;:18::i;:::-;20031:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;19995:87;19988:94;;;19772:318;;;:::o;71460:37::-;71493:4;71460:37;:::o;76845:193::-;72252:6;;;;;;;;;;;72238:20;;:10;:20;;;72230:29;;;;;;76916:11:::1;76972:8;76963:6;;:17;;;;;;;;;;;;;;;;;;77000:4;76991:13;;77023:6;77015:15;;;::::0;::::1;;76905:133;76845:193:::0;:::o;26826:164::-;26923:4;26947:18;:25;26966:5;26947:25;;;;;;;;;;;;;;;:35;26973:8;26947:35;;;;;;;;;;;;;;;;;;;;;;;;;26940:42;;26826:164;;;;:::o;76410:233::-;72252:6;;;;;;;;;;;72238:20;;:10;:20;;;72230:29;;;;;;76467:13:::1;;;;;;;;;;;76466:14;76458:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;76571:5;76558:10;;:18;;;;;;;;;;;;;;;;;;76599:4;76585:11;;:18;;;;;;;;;;;;;;;;;;76633:2;76612:17:::0;:23:::1;;;;76410:233::o:0;72014:30::-;;;;;;;;;;;;;:::o;18484:639::-;18569:4;18908:10;18893:25;;:11;:25;;;;:102;;;;18985:10;18970:25;;:11;:25;;;;18893:102;:179;;;;19062:10;19047:25;;:11;:25;;;;18893:179;18873:199;;18484:639;;;:::o;64800:215::-;64902:4;64941:26;64926:41;;;:11;:41;;;;:81;;;;64971:36;64995:11;64971:23;:36::i;:::-;64926:81;64919:88;;64800:215;;;:::o;27248:282::-;27313:4;27369:7;27350:15;:13;:15::i;:::-;:26;;:66;;;;;27403:13;;27393:7;:23;27350:66;:153;;;;;27502:1;11256:8;27454:17;:26;27472:7;27454:26;;;;;;;;;;;;:44;:49;27350:153;27330:173;;27248:282;;;:::o;49556:105::-;49616:7;49643:10;49636:17;;49556:105;:::o;14653:92::-;14709:7;14653:92;:::o;21934:1275::-;22001:7;22021:12;22036:7;22021:22;;22104:4;22085:15;:13;:15::i;:::-;:23;22081:1061;;22138:13;;22131:4;:20;22127:1015;;;22176:14;22193:17;:23;22211:4;22193:23;;;;;;;;;;;;22176:40;;22310:1;11256:8;22282:6;:24;:29;22278:845;;22947:113;22964:1;22954:6;:11;22947:113;;23007:17;:25;23025:6;;;;;;;23007:25;;;;;;;;;;;;22998:34;;22947:113;;;23093:6;23086:13;;;;;;22278:845;22153:989;22127:1015;22081:1061;23170:31;;;;;;;;;;;;;;21934:1275;;;;:::o;28411:485::-;28513:27;28542:23;28583:38;28624:15;:24;28640:7;28624:24;;;;;;;;;;;28583:65;;28801:18;28778:41;;28858:19;28852:26;28833:45;;28763:126;28411:485;;;:::o;27639:659::-;27788:11;27953:16;27946:5;27942:28;27933:37;;28113:16;28102:9;28098:32;28085:45;;28263:15;28252:9;28249:30;28241:5;28230:9;28227:20;28224:56;28214:66;;27639:659;;;;;:::o;34297:159::-;;;;;:::o;48865:311::-;49000:7;49020:16;11660:3;49046:19;:41;;49020:68;;11660:3;49114:31;49125:4;49131:2;49135:9;49114:10;:31::i;:::-;49106:40;;:62;;49099:69;;;48865:311;;;;;:::o;23757:450::-;23837:14;24005:16;23998:5;23994:28;23985:37;;24182:5;24168:11;24143:23;24139:41;24136:52;24129:5;24126:63;24116:73;;23757:450;;;;:::o;35121:158::-;;;;;:::o;65794:97::-;65852:6;65878:5;65871:12;;65794:97;:::o;44085:3081::-;44165:27;44195;44214:7;44195:18;:27::i;:::-;44165:57;;44235:12;44266:19;44235:52;;44301:27;44330:23;44357:35;44384:7;44357:26;:35::i;:::-;44300:92;;;;44409:13;44405:316;;;44530:68;44555:15;44572:4;44578:19;:17;:19::i;:::-;44530:24;:68::i;:::-;44525:184;;44622:43;44639:4;44645:19;:17;:19::i;:::-;44622:16;:43::i;:::-;44617:92;;44674:35;;;;;;;;;;;;;;44617:92;44525:184;44405:316;44733:51;44755:4;44769:1;44773:7;44782:1;44733:21;:51::i;:::-;44877:15;44874:160;;;45017:1;44996:19;44989:30;44874:160;45695:1;10745:3;45665:1;:26;;45664:32;45636:18;:24;45655:4;45636:24;;;;;;;;;;;;;;;;:60;;;;;;;;;;;45963:176;46000:4;46071:53;46086:4;46100:1;46104:19;46071:14;:53::i;:::-;11536:8;11256;46024:43;46023:101;45963:18;:176::i;:::-;45934:17;:26;45952:7;45934:26;;;;;;;;;;;:205;;;;46310:1;11536:8;46259:19;:47;:52;46255:627;;46332:19;46364:1;46354:7;:11;46332:33;;46521:1;46487:17;:30;46505:11;46487:30;;;;;;;;;;;;:35;46483:384;;46625:13;;46610:11;:28;46606:242;;46805:19;46772:17;:30;46790:11;46772:30;;;;;;;;;;;:52;;;;46606:242;46483:384;46313:569;46255:627;46937:7;46933:1;46910:35;;46919:4;46910:35;;;;;;;;;;;;46956:50;46977:4;46991:1;46995:7;47004:1;46956:20;:50::i;:::-;47133:12;;:14;;;;;;;;;;;;;44154:3012;;;;44085:3081;;:::o;21382:161::-;21450:21;;:::i;:::-;21491:44;21510:17;:24;21528:5;21510:24;;;;;;;;;;;;21491:18;:44::i;:::-;21484:51;;21382:161;;;:::o;14824:103::-;14879:7;14906:13;;14899:20;;14824:103;:::o;43388:112::-;43465:27;43475:2;43479:8;43465:27;;;;;;;;;;;;:9;:27::i;:::-;43388:112;;:::o;35719:716::-;35882:4;35928:2;35903:45;;;35949:19;:17;:19::i;:::-;35970:4;35976:7;35985:5;35903:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;35899:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36203:1;36186:6;:13;:18;36182:235;;36232:40;;;;;;;;;;;;;;36182:235;36375:6;36369:13;36360:6;36356:2;36352:15;36345:38;35899:529;36072:54;;;36062:64;;;:6;:64;;;;36055:71;;;35719:716;;;;;;:::o;21120:166::-;21190:21;;:::i;:::-;21231:47;21250:27;21269:7;21250:18;:27::i;:::-;21231:18;:47::i;:::-;21224:54;;21120:166;;;:::o;75551:106::-;75611:13;75642:7;75635:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75551:106;:::o;49763:1745::-;49828:17;50262:4;50255;50249:11;50245:22;50354:1;50348:4;50341:15;50429:4;50426:1;50422:12;50415:19;;50511:1;50506:3;50499:14;50615:3;50854:5;50836:428;50862:1;50836:428;;;50902:1;50897:3;50893:11;50886:18;;51073:2;51067:4;51063:13;51059:2;51055:22;51050:3;51042:36;51167:2;51161:4;51157:13;51149:21;;51234:4;50836:428;51224:25;50836:428;50840:21;51303:3;51298;51294:13;51418:4;51413:3;51409:14;51402:21;;51483:6;51478:3;51471:19;49867:1634;;;49763:1745;;;:::o;62352:157::-;62437:4;62476:25;62461:40;;;:11;:40;;;;62454:47;;62352:157;;;:::o;48566:147::-;48703:6;48566:147;;;;;:::o;23308:366::-;23374:31;;:::i;:::-;23451:6;23418:9;:14;;:41;;;;;;;;;;;11139:3;23504:6;:33;;23470:9;:24;;:68;;;;;;;;;;;23596:1;11256:8;23568:6;:24;:29;;23549:9;:16;;:48;;;;;;;;;;;11660:3;23637:6;:28;;23608:9;:19;;:58;;;;;;;;;;;23308:366;;;:::o;42615:689::-;42746:19;42752:2;42756:8;42746:5;:19::i;:::-;42825:1;42807:2;:14;;;:19;42803:483;;42847:11;42861:13;;42847:27;;42893:13;42915:8;42909:3;:14;42893:30;;42942:233;42973:62;43012:1;43016:2;43020:7;;;;;;43029:5;42973:30;:62::i;:::-;42968:167;;43071:40;;;;;;;;;;;;;;42968:167;43170:3;43162:5;:11;42942:233;;43257:3;43240:13;;:20;43236:34;;43262:8;;;43236:34;42828:458;;42803:483;42615:689;;;:::o;36897:2966::-;36970:20;36993:13;;36970:36;;37033:1;37021:8;:13;37017:44;;37043:18;;;;;;;;;;;;;;37017:44;37074:61;37104:1;37108:2;37112:12;37126:8;37074:21;:61::i;:::-;37618:1;10618:2;37588:1;:26;;37587:32;37575:8;:45;37549:18;:22;37568:2;37549:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;37897:139;37934:2;37988:33;38011:1;38015:2;38019:1;37988:14;:33::i;:::-;37955:30;37976:8;37955:20;:30::i;:::-;:66;37897:18;:139::i;:::-;37863:17;:31;37881:12;37863:31;;;;;;;;;;;:173;;;;38053:16;38084:11;38113:8;38098:12;:23;38084:37;;38634:16;38630:2;38626:25;38614:37;;39006:12;38966:8;38925:1;38863:25;38804:1;38743;38716:335;39377:1;39363:12;39359:20;39317:346;39418:3;39409:7;39406:16;39317:346;;39636:7;39626:8;39623:1;39596:25;39593:1;39590;39585:59;39471:1;39462:7;39458:15;39447:26;;39317:346;;;39321:77;39708:1;39696:8;:13;39692:45;;39718:19;;;;;;;;;;;;;;39692:45;39770:3;39754:13;:19;;;;37323:2462;;39795:60;39824:1;39828:2;39832:12;39846:8;39795:20;:60::i;:::-;36959:2904;36897:2966;;:::o;24309:324::-;24379:14;24612:1;24602:8;24599:15;24573:24;24569:46;24559:56;;24309:324;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7:126:1:-;44:7;84:42;77:5;73:54;62:65;;7:126;;;:::o;139:96::-;176:7;205:24;223:5;205:24;:::i;:::-;194:35;;139:96;;;:::o;241:118::-;328:24;346:5;328:24;:::i;:::-;323:3;316:37;241:118;;:::o;365:77::-;402:7;431:5;420:16;;365:77;;;:::o;448:118::-;535:24;553:5;535:24;:::i;:::-;530:3;523:37;448:118;;:::o;572:332::-;693:4;731:2;720:9;716:18;708:26;;744:71;812:1;801:9;797:17;788:6;744:71;:::i;:::-;825:72;893:2;882:9;878:18;869:6;825:72;:::i;:::-;572:332;;;;;:::o;910:75::-;943:6;976:2;970:9;960:19;;910:75;:::o;991:117::-;1100:1;1097;1090:12;1114:117;1223:1;1220;1213:12;1237:149;1273:7;1313:66;1306:5;1302:78;1291:89;;1237:149;;;:::o;1392:120::-;1464:23;1481:5;1464:23;:::i;:::-;1457:5;1454:34;1444:62;;1502:1;1499;1492:12;1444:62;1392:120;:::o;1518:137::-;1563:5;1601:6;1588:20;1579:29;;1617:32;1643:5;1617:32;:::i;:::-;1518:137;;;;:::o;1661:327::-;1719:6;1768:2;1756:9;1747:7;1743:23;1739:32;1736:119;;;1774:79;;:::i;:::-;1736:119;1894:1;1919:52;1963:7;1954:6;1943:9;1939:22;1919:52;:::i;:::-;1909:62;;1865:116;1661:327;;;;:::o;1994:90::-;2028:7;2071:5;2064:13;2057:21;2046:32;;1994:90;;;:::o;2090:109::-;2171:21;2186:5;2171:21;:::i;:::-;2166:3;2159:34;2090:109;;:::o;2205:210::-;2292:4;2330:2;2319:9;2315:18;2307:26;;2343:65;2405:1;2394:9;2390:17;2381:6;2343:65;:::i;:::-;2205:210;;;;:::o;2421:116::-;2491:21;2506:5;2491:21;:::i;:::-;2484:5;2481:32;2471:60;;2527:1;2524;2517:12;2471:60;2421:116;:::o;2543:133::-;2586:5;2624:6;2611:20;2602:29;;2640:30;2664:5;2640:30;:::i;:::-;2543:133;;;;:::o;2682:323::-;2738:6;2787:2;2775:9;2766:7;2762:23;2758:32;2755:119;;;2793:79;;:::i;:::-;2755:119;2913:1;2938:50;2980:7;2971:6;2960:9;2956:22;2938:50;:::i;:::-;2928:60;;2884:114;2682:323;;;;:::o;3011:99::-;3063:6;3097:5;3091:12;3081:22;;3011:99;;;:::o;3116:169::-;3200:11;3234:6;3229:3;3222:19;3274:4;3269:3;3265:14;3250:29;;3116:169;;;;:::o;3291:246::-;3372:1;3382:113;3396:6;3393:1;3390:13;3382:113;;;3481:1;3476:3;3472:11;3466:18;3462:1;3457:3;3453:11;3446:39;3418:2;3415:1;3411:10;3406:15;;3382:113;;;3529:1;3520:6;3515:3;3511:16;3504:27;3353:184;3291:246;;;:::o;3543:102::-;3584:6;3635:2;3631:7;3626:2;3619:5;3615:14;3611:28;3601:38;;3543:102;;;:::o;3651:377::-;3739:3;3767:39;3800:5;3767:39;:::i;:::-;3822:71;3886:6;3881:3;3822:71;:::i;:::-;3815:78;;3902:65;3960:6;3955:3;3948:4;3941:5;3937:16;3902:65;:::i;:::-;3992:29;4014:6;3992:29;:::i;:::-;3987:3;3983:39;3976:46;;3743:285;3651:377;;;;:::o;4034:313::-;4147:4;4185:2;4174:9;4170:18;4162:26;;4234:9;4228:4;4224:20;4220:1;4209:9;4205:17;4198:47;4262:78;4335:4;4326:6;4262:78;:::i;:::-;4254:86;;4034:313;;;;:::o;4353:122::-;4426:24;4444:5;4426:24;:::i;:::-;4419:5;4416:35;4406:63;;4465:1;4462;4455:12;4406:63;4353:122;:::o;4481:139::-;4527:5;4565:6;4552:20;4543:29;;4581:33;4608:5;4581:33;:::i;:::-;4481:139;;;;:::o;4626:329::-;4685:6;4734:2;4722:9;4713:7;4709:23;4705:32;4702:119;;;4740:79;;:::i;:::-;4702:119;4860:1;4885:53;4930:7;4921:6;4910:9;4906:22;4885:53;:::i;:::-;4875:63;;4831:117;4626:329;;;;:::o;4961:222::-;5054:4;5092:2;5081:9;5077:18;5069:26;;5105:71;5173:1;5162:9;5158:17;5149:6;5105:71;:::i;:::-;4961:222;;;;:::o;5189:122::-;5262:24;5280:5;5262:24;:::i;:::-;5255:5;5252:35;5242:63;;5301:1;5298;5291:12;5242:63;5189:122;:::o;5317:139::-;5363:5;5401:6;5388:20;5379:29;;5417:33;5444:5;5417:33;:::i;:::-;5317:139;;;;:::o;5462:474::-;5530:6;5538;5587:2;5575:9;5566:7;5562:23;5558:32;5555:119;;;5593:79;;:::i;:::-;5555:119;5713:1;5738:53;5783:7;5774:6;5763:9;5759:22;5738:53;:::i;:::-;5728:63;;5684:117;5840:2;5866:53;5911:7;5902:6;5891:9;5887:22;5866:53;:::i;:::-;5856:63;;5811:118;5462:474;;;;;:::o;5942:222::-;6035:4;6073:2;6062:9;6058:18;6050:26;;6086:71;6154:1;6143:9;6139:17;6130:6;6086:71;:::i;:::-;5942:222;;;;:::o;6170:619::-;6247:6;6255;6263;6312:2;6300:9;6291:7;6287:23;6283:32;6280:119;;;6318:79;;:::i;:::-;6280:119;6438:1;6463:53;6508:7;6499:6;6488:9;6484:22;6463:53;:::i;:::-;6453:63;;6409:117;6565:2;6591:53;6636:7;6627:6;6616:9;6612:22;6591:53;:::i;:::-;6581:63;;6536:118;6693:2;6719:53;6764:7;6755:6;6744:9;6740:22;6719:53;:::i;:::-;6709:63;;6664:118;6170:619;;;;;:::o;6795:474::-;6863:6;6871;6920:2;6908:9;6899:7;6895:23;6891:32;6888:119;;;6926:79;;:::i;:::-;6888:119;7046:1;7071:53;7116:7;7107:6;7096:9;7092:22;7071:53;:::i;:::-;7061:63;;7017:117;7173:2;7199:53;7244:7;7235:6;7224:9;7220:22;7199:53;:::i;:::-;7189:63;;7144:118;6795:474;;;;;:::o;7275:117::-;7384:1;7381;7374:12;7398:117;7507:1;7504;7497:12;7521:180;7569:77;7566:1;7559:88;7666:4;7663:1;7656:15;7690:4;7687:1;7680:15;7707:281;7790:27;7812:4;7790:27;:::i;:::-;7782:6;7778:40;7920:6;7908:10;7905:22;7884:18;7872:10;7869:34;7866:62;7863:88;;;7931:18;;:::i;:::-;7863:88;7971:10;7967:2;7960:22;7750:238;7707:281;;:::o;7994:129::-;8028:6;8055:20;;:::i;:::-;8045:30;;8084:33;8112:4;8104:6;8084:33;:::i;:::-;7994:129;;;:::o;8129:308::-;8191:4;8281:18;8273:6;8270:30;8267:56;;;8303:18;;:::i;:::-;8267:56;8341:29;8363:6;8341:29;:::i;:::-;8333:37;;8425:4;8419;8415:15;8407:23;;8129:308;;;:::o;8443:146::-;8540:6;8535:3;8530;8517:30;8581:1;8572:6;8567:3;8563:16;8556:27;8443:146;;;:::o;8595:425::-;8673:5;8698:66;8714:49;8756:6;8714:49;:::i;:::-;8698:66;:::i;:::-;8689:75;;8787:6;8780:5;8773:21;8825:4;8818:5;8814:16;8863:3;8854:6;8849:3;8845:16;8842:25;8839:112;;;8870:79;;:::i;:::-;8839:112;8960:54;9007:6;9002:3;8997;8960:54;:::i;:::-;8679:341;8595:425;;;;;:::o;9040:340::-;9096:5;9145:3;9138:4;9130:6;9126:17;9122:27;9112:122;;9153:79;;:::i;:::-;9112:122;9270:6;9257:20;9295:79;9370:3;9362:6;9355:4;9347:6;9343:17;9295:79;:::i;:::-;9286:88;;9102:278;9040:340;;;;:::o;9386:509::-;9455:6;9504:2;9492:9;9483:7;9479:23;9475:32;9472:119;;;9510:79;;:::i;:::-;9472:119;9658:1;9647:9;9643:17;9630:31;9688:18;9680:6;9677:30;9674:117;;;9710:79;;:::i;:::-;9674:117;9815:63;9870:7;9861:6;9850:9;9846:22;9815:63;:::i;:::-;9805:73;;9601:287;9386:509;;;;:::o;9901:117::-;10010:1;10007;10000:12;10024:117;10133:1;10130;10123:12;10164:568;10237:8;10247:6;10297:3;10290:4;10282:6;10278:17;10274:27;10264:122;;10305:79;;:::i;:::-;10264:122;10418:6;10405:20;10395:30;;10448:18;10440:6;10437:30;10434:117;;;10470:79;;:::i;:::-;10434:117;10584:4;10576:6;10572:17;10560:29;;10638:3;10630:4;10622:6;10618:17;10608:8;10604:32;10601:41;10598:128;;;10645:79;;:::i;:::-;10598:128;10164:568;;;;;:::o;10738:559::-;10824:6;10832;10881:2;10869:9;10860:7;10856:23;10852:32;10849:119;;;10887:79;;:::i;:::-;10849:119;11035:1;11024:9;11020:17;11007:31;11065:18;11057:6;11054:30;11051:117;;;11087:79;;:::i;:::-;11051:117;11200:80;11272:7;11263:6;11252:9;11248:22;11200:80;:::i;:::-;11182:98;;;;10978:312;10738:559;;;;;:::o;11303:144::-;11400:6;11434:5;11428:12;11418:22;;11303:144;;;:::o;11453:214::-;11582:11;11616:6;11611:3;11604:19;11656:4;11651:3;11647:14;11632:29;;11453:214;;;;:::o;11673:162::-;11770:4;11793:3;11785:11;;11823:4;11818:3;11814:14;11806:22;;11673:162;;;:::o;11841:108::-;11918:24;11936:5;11918:24;:::i;:::-;11913:3;11906:37;11841:108;;:::o;11955:101::-;11991:7;12031:18;12024:5;12020:30;12009:41;;11955:101;;;:::o;12062:105::-;12137:23;12154:5;12137:23;:::i;:::-;12132:3;12125:36;12062:105;;:::o;12173:99::-;12244:21;12259:5;12244:21;:::i;:::-;12239:3;12232:34;12173:99;;:::o;12278:91::-;12314:7;12354:8;12347:5;12343:20;12332:31;;12278:91;;;:::o;12375:105::-;12450:23;12467:5;12450:23;:::i;:::-;12445:3;12438:36;12375:105;;:::o;12558:862::-;12705:4;12700:3;12696:14;12792:4;12785:5;12781:16;12775:23;12811:63;12868:4;12863:3;12859:14;12845:12;12811:63;:::i;:::-;12720:164;12976:4;12969:5;12965:16;12959:23;12995:61;13050:4;13045:3;13041:14;13027:12;12995:61;:::i;:::-;12894:172;13150:4;13143:5;13139:16;13133:23;13169:57;13220:4;13215:3;13211:14;13197:12;13169:57;:::i;:::-;13076:160;13323:4;13316:5;13312:16;13306:23;13342:61;13397:4;13392:3;13388:14;13374:12;13342:61;:::i;:::-;13246:167;12674:746;12558:862;;:::o;13426:299::-;13555:10;13576:106;13678:3;13670:6;13576:106;:::i;:::-;13714:4;13709:3;13705:14;13691:28;;13426:299;;;;:::o;13731:143::-;13831:4;13863;13858:3;13854:14;13846:22;;13731:143;;;:::o;13956:972::-;14135:3;14164:84;14242:5;14164:84;:::i;:::-;14264:116;14373:6;14368:3;14264:116;:::i;:::-;14257:123;;14404:86;14484:5;14404:86;:::i;:::-;14513:7;14544:1;14529:374;14554:6;14551:1;14548:13;14529:374;;;14630:6;14624:13;14657:123;14776:3;14761:13;14657:123;:::i;:::-;14650:130;;14803:90;14886:6;14803:90;:::i;:::-;14793:100;;14589:314;14576:1;14573;14569:9;14564:14;;14529:374;;;14533:14;14919:3;14912:10;;14140:788;;;13956:972;;;;:::o;14934:493::-;15137:4;15175:2;15164:9;15160:18;15152:26;;15224:9;15218:4;15214:20;15210:1;15199:9;15195:17;15188:47;15252:168;15415:4;15406:6;15252:168;:::i;:::-;15244:176;;14934:493;;;;:::o;15433:311::-;15510:4;15600:18;15592:6;15589:30;15586:56;;;15622:18;;:::i;:::-;15586:56;15672:4;15664:6;15660:17;15652:25;;15732:4;15726;15722:15;15714:23;;15433:311;;;:::o;15767:710::-;15863:5;15888:81;15904:64;15961:6;15904:64;:::i;:::-;15888:81;:::i;:::-;15879:90;;15989:5;16018:6;16011:5;16004:21;16052:4;16045:5;16041:16;16034:23;;16105:4;16097:6;16093:17;16085:6;16081:30;16134:3;16126:6;16123:15;16120:122;;;16153:79;;:::i;:::-;16120:122;16268:6;16251:220;16285:6;16280:3;16277:15;16251:220;;;16360:3;16389:37;16422:3;16410:10;16389:37;:::i;:::-;16384:3;16377:50;16456:4;16451:3;16447:14;16440:21;;16327:144;16311:4;16306:3;16302:14;16295:21;;16251:220;;;16255:21;15869:608;;15767:710;;;;;:::o;16500:370::-;16571:5;16620:3;16613:4;16605:6;16601:17;16597:27;16587:122;;16628:79;;:::i;:::-;16587:122;16745:6;16732:20;16770:94;16860:3;16852:6;16845:4;16837:6;16833:17;16770:94;:::i;:::-;16761:103;;16577:293;16500:370;;;;:::o;16876:684::-;16969:6;16977;17026:2;17014:9;17005:7;17001:23;16997:32;16994:119;;;17032:79;;:::i;:::-;16994:119;17180:1;17169:9;17165:17;17152:31;17210:18;17202:6;17199:30;17196:117;;;17232:79;;:::i;:::-;17196:117;17337:78;17407:7;17398:6;17387:9;17383:22;17337:78;:::i;:::-;17327:88;;17123:302;17464:2;17490:53;17535:7;17526:6;17515:9;17511:22;17490:53;:::i;:::-;17480:63;;17435:118;16876:684;;;;;:::o;17566:329::-;17625:6;17674:2;17662:9;17653:7;17649:23;17645:32;17642:119;;;17680:79;;:::i;:::-;17642:119;17800:1;17825:53;17870:7;17861:6;17850:9;17846:22;17825:53;:::i;:::-;17815:63;;17771:117;17566:329;;;;:::o;17901:114::-;17968:6;18002:5;17996:12;17986:22;;17901:114;;;:::o;18021:184::-;18120:11;18154:6;18149:3;18142:19;18194:4;18189:3;18185:14;18170:29;;18021:184;;;;:::o;18211:132::-;18278:4;18301:3;18293:11;;18331:4;18326:3;18322:14;18314:22;;18211:132;;;:::o;18349:108::-;18426:24;18444:5;18426:24;:::i;:::-;18421:3;18414:37;18349:108;;:::o;18463:179::-;18532:10;18553:46;18595:3;18587:6;18553:46;:::i;:::-;18631:4;18626:3;18622:14;18608:28;;18463:179;;;;:::o;18648:113::-;18718:4;18750;18745:3;18741:14;18733:22;;18648:113;;;:::o;18797:732::-;18916:3;18945:54;18993:5;18945:54;:::i;:::-;19015:86;19094:6;19089:3;19015:86;:::i;:::-;19008:93;;19125:56;19175:5;19125:56;:::i;:::-;19204:7;19235:1;19220:284;19245:6;19242:1;19239:13;19220:284;;;19321:6;19315:13;19348:63;19407:3;19392:13;19348:63;:::i;:::-;19341:70;;19434:60;19487:6;19434:60;:::i;:::-;19424:70;;19280:224;19267:1;19264;19260:9;19255:14;;19220:284;;;19224:14;19520:3;19513:10;;18921:608;;;18797:732;;;;:::o;19535:373::-;19678:4;19716:2;19705:9;19701:18;19693:26;;19765:9;19759:4;19755:20;19751:1;19740:9;19736:17;19729:47;19793:108;19896:4;19887:6;19793:108;:::i;:::-;19785:116;;19535:373;;;;:::o;19914:619::-;19991:6;19999;20007;20056:2;20044:9;20035:7;20031:23;20027:32;20024:119;;;20062:79;;:::i;:::-;20024:119;20182:1;20207:53;20252:7;20243:6;20232:9;20228:22;20207:53;:::i;:::-;20197:63;;20153:117;20309:2;20335:53;20380:7;20371:6;20360:9;20356:22;20335:53;:::i;:::-;20325:63;;20280:118;20437:2;20463:53;20508:7;20499:6;20488:9;20484:22;20463:53;:::i;:::-;20453:63;;20408:118;19914:619;;;;;:::o;20539:468::-;20604:6;20612;20661:2;20649:9;20640:7;20636:23;20632:32;20629:119;;;20667:79;;:::i;:::-;20629:119;20787:1;20812:53;20857:7;20848:6;20837:9;20833:22;20812:53;:::i;:::-;20802:63;;20758:117;20914:2;20940:50;20982:7;20973:6;20962:9;20958:22;20940:50;:::i;:::-;20930:60;;20885:115;20539:468;;;;;:::o;21013:307::-;21074:4;21164:18;21156:6;21153:30;21150:56;;;21186:18;;:::i;:::-;21150:56;21224:29;21246:6;21224:29;:::i;:::-;21216:37;;21308:4;21302;21298:15;21290:23;;21013:307;;;:::o;21326:423::-;21403:5;21428:65;21444:48;21485:6;21444:48;:::i;:::-;21428:65;:::i;:::-;21419:74;;21516:6;21509:5;21502:21;21554:4;21547:5;21543:16;21592:3;21583:6;21578:3;21574:16;21571:25;21568:112;;;21599:79;;:::i;:::-;21568:112;21689:54;21736:6;21731:3;21726;21689:54;:::i;:::-;21409:340;21326:423;;;;;:::o;21768:338::-;21823:5;21872:3;21865:4;21857:6;21853:17;21849:27;21839:122;;21880:79;;:::i;:::-;21839:122;21997:6;21984:20;22022:78;22096:3;22088:6;22081:4;22073:6;22069:17;22022:78;:::i;:::-;22013:87;;21829:277;21768:338;;;;:::o;22112:943::-;22207:6;22215;22223;22231;22280:3;22268:9;22259:7;22255:23;22251:33;22248:120;;;22287:79;;:::i;:::-;22248:120;22407:1;22432:53;22477:7;22468:6;22457:9;22453:22;22432:53;:::i;:::-;22422:63;;22378:117;22534:2;22560:53;22605:7;22596:6;22585:9;22581:22;22560:53;:::i;:::-;22550:63;;22505:118;22662:2;22688:53;22733:7;22724:6;22713:9;22709:22;22688:53;:::i;:::-;22678:63;;22633:118;22818:2;22807:9;22803:18;22790:32;22849:18;22841:6;22838:30;22835:117;;;22871:79;;:::i;:::-;22835:117;22976:62;23030:7;23021:6;23010:9;23006:22;22976:62;:::i;:::-;22966:72;;22761:287;22112:943;;;;;;;:::o;23133:872::-;23290:4;23285:3;23281:14;23377:4;23370:5;23366:16;23360:23;23396:63;23453:4;23448:3;23444:14;23430:12;23396:63;:::i;:::-;23305:164;23561:4;23554:5;23550:16;23544:23;23580:61;23635:4;23630:3;23626:14;23612:12;23580:61;:::i;:::-;23479:172;23735:4;23728:5;23724:16;23718:23;23754:57;23805:4;23800:3;23796:14;23782:12;23754:57;:::i;:::-;23661:160;23908:4;23901:5;23897:16;23891:23;23927:61;23982:4;23977:3;23973:14;23959:12;23927:61;:::i;:::-;23831:167;23259:746;23133:872;;:::o;24011:343::-;24164:4;24202:3;24191:9;24187:19;24179:27;;24216:131;24344:1;24333:9;24329:17;24320:6;24216:131;:::i;:::-;24011:343;;;;:::o;24360:474::-;24428:6;24436;24485:2;24473:9;24464:7;24460:23;24456:32;24453:119;;;24491:79;;:::i;:::-;24453:119;24611:1;24636:53;24681:7;24672:6;24661:9;24657:22;24636:53;:::i;:::-;24626:63;;24582:117;24738:2;24764:53;24809:7;24800:6;24789:9;24785:22;24764:53;:::i;:::-;24754:63;;24709:118;24360:474;;;;;:::o;24840:180::-;24888:77;24885:1;24878:88;24985:4;24982:1;24975:15;25009:4;25006:1;24999:15;25026:320;25070:6;25107:1;25101:4;25097:12;25087:22;;25154:1;25148:4;25144:12;25175:18;25165:81;;25231:4;25223:6;25219:17;25209:27;;25165:81;25293:2;25285:6;25282:14;25262:18;25259:38;25256:84;;25312:18;;:::i;:::-;25256:84;25077:269;25026:320;;;:::o;25352:180::-;25400:77;25397:1;25390:88;25497:4;25494:1;25487:15;25521:4;25518:1;25511:15;25538:410;25578:7;25601:20;25619:1;25601:20;:::i;:::-;25596:25;;25635:20;25653:1;25635:20;:::i;:::-;25630:25;;25690:1;25687;25683:9;25712:30;25730:11;25712:30;:::i;:::-;25701:41;;25891:1;25882:7;25878:15;25875:1;25872:22;25852:1;25845:9;25825:83;25802:139;;25921:18;;:::i;:::-;25802:139;25586:362;25538:410;;;;:::o;25954:180::-;26002:77;25999:1;25992:88;26099:4;26096:1;26089:15;26123:4;26120:1;26113:15;26140:185;26180:1;26197:20;26215:1;26197:20;:::i;:::-;26192:25;;26231:20;26249:1;26231:20;:::i;:::-;26226:25;;26270:1;26260:35;;26275:18;;:::i;:::-;26260:35;26317:1;26314;26310:9;26305:14;;26140:185;;;;:::o;26331:147::-;26432:11;26469:3;26454:18;;26331:147;;;;:::o;26484:114::-;;:::o;26604:398::-;26763:3;26784:83;26865:1;26860:3;26784:83;:::i;:::-;26777:90;;26876:93;26965:3;26876:93;:::i;:::-;26994:1;26989:3;26985:11;26978:18;;26604:398;;;:::o;27008:379::-;27192:3;27214:147;27357:3;27214:147;:::i;:::-;27207:154;;27378:3;27371:10;;27008:379;;;:::o;27393:141::-;27442:4;27465:3;27457:11;;27488:3;27485:1;27478:14;27522:4;27519:1;27509:18;27501:26;;27393:141;;;:::o;27540:93::-;27577:6;27624:2;27619;27612:5;27608:14;27604:23;27594:33;;27540:93;;;:::o;27639:107::-;27683:8;27733:5;27727:4;27723:16;27702:37;;27639:107;;;;:::o;27752:393::-;27821:6;27871:1;27859:10;27855:18;27894:97;27924:66;27913:9;27894:97;:::i;:::-;28012:39;28042:8;28031:9;28012:39;:::i;:::-;28000:51;;28084:4;28080:9;28073:5;28069:21;28060:30;;28133:4;28123:8;28119:19;28112:5;28109:30;28099:40;;27828:317;;27752:393;;;;;:::o;28151:60::-;28179:3;28200:5;28193:12;;28151:60;;;:::o;28217:142::-;28267:9;28300:53;28318:34;28327:24;28345:5;28327:24;:::i;:::-;28318:34;:::i;:::-;28300:53;:::i;:::-;28287:66;;28217:142;;;:::o;28365:75::-;28408:3;28429:5;28422:12;;28365:75;;;:::o;28446:269::-;28556:39;28587:7;28556:39;:::i;:::-;28617:91;28666:41;28690:16;28666:41;:::i;:::-;28658:6;28651:4;28645:11;28617:91;:::i;:::-;28611:4;28604:105;28522:193;28446:269;;;:::o;28721:73::-;28766:3;28721:73;:::o;28800:189::-;28877:32;;:::i;:::-;28918:65;28976:6;28968;28962:4;28918:65;:::i;:::-;28853:136;28800:189;;:::o;28995:186::-;29055:120;29072:3;29065:5;29062:14;29055:120;;;29126:39;29163:1;29156:5;29126:39;:::i;:::-;29099:1;29092:5;29088:13;29079:22;;29055:120;;;28995:186;;:::o;29187:543::-;29288:2;29283:3;29280:11;29277:446;;;29322:38;29354:5;29322:38;:::i;:::-;29406:29;29424:10;29406:29;:::i;:::-;29396:8;29392:44;29589:2;29577:10;29574:18;29571:49;;;29610:8;29595:23;;29571:49;29633:80;29689:22;29707:3;29689:22;:::i;:::-;29679:8;29675:37;29662:11;29633:80;:::i;:::-;29292:431;;29277:446;29187:543;;;:::o;29736:117::-;29790:8;29840:5;29834:4;29830:16;29809:37;;29736:117;;;;:::o;29859:169::-;29903:6;29936:51;29984:1;29980:6;29972:5;29969:1;29965:13;29936:51;:::i;:::-;29932:56;30017:4;30011;30007:15;29997:25;;29910:118;29859:169;;;;:::o;30033:295::-;30109:4;30255:29;30280:3;30274:4;30255:29;:::i;:::-;30247:37;;30317:3;30314:1;30310:11;30304:4;30301:21;30293:29;;30033:295;;;;:::o;30333:1395::-;30450:37;30483:3;30450:37;:::i;:::-;30552:18;30544:6;30541:30;30538:56;;;30574:18;;:::i;:::-;30538:56;30618:38;30650:4;30644:11;30618:38;:::i;:::-;30703:67;30763:6;30755;30749:4;30703:67;:::i;:::-;30797:1;30821:4;30808:17;;30853:2;30845:6;30842:14;30870:1;30865:618;;;;31527:1;31544:6;31541:77;;;31593:9;31588:3;31584:19;31578:26;31569:35;;31541:77;31644:67;31704:6;31697:5;31644:67;:::i;:::-;31638:4;31631:81;31500:222;30835:887;;30865:618;30917:4;30913:9;30905:6;30901:22;30951:37;30983:4;30951:37;:::i;:::-;31010:1;31024:208;31038:7;31035:1;31032:14;31024:208;;;31117:9;31112:3;31108:19;31102:26;31094:6;31087:42;31168:1;31160:6;31156:14;31146:24;;31215:2;31204:9;31200:18;31187:31;;31061:4;31058:1;31054:12;31049:17;;31024:208;;;31260:6;31251:7;31248:19;31245:179;;;31318:9;31313:3;31309:19;31303:26;31361:48;31403:4;31395:6;31391:17;31380:9;31361:48;:::i;:::-;31353:6;31346:64;31268:156;31245:179;31470:1;31466;31458:6;31454:14;31450:22;31444:4;31437:36;30872:611;;;30835:887;;30425:1303;;;30333:1395;;:::o;31734:180::-;31782:77;31779:1;31772:88;31879:4;31876:1;31869:15;31903:4;31900:1;31893:15;31920:230;32060:34;32056:1;32048:6;32044:14;32037:58;32129:13;32124:2;32116:6;32112:15;32105:38;31920:230;:::o;32156:366::-;32298:3;32319:67;32383:2;32378:3;32319:67;:::i;:::-;32312:74;;32395:93;32484:3;32395:93;:::i;:::-;32513:2;32508:3;32504:12;32497:19;;32156:366;;;:::o;32528:419::-;32694:4;32732:2;32721:9;32717:18;32709:26;;32781:9;32775:4;32771:20;32767:1;32756:9;32752:17;32745:47;32809:131;32935:4;32809:131;:::i;:::-;32801:139;;32528:419;;;:::o;32953:191::-;32993:3;33012:20;33030:1;33012:20;:::i;:::-;33007:25;;33046:20;33064:1;33046:20;:::i;:::-;33041:25;;33089:1;33086;33082:9;33075:16;;33110:3;33107:1;33104:10;33101:36;;;33117:18;;:::i;:::-;33101:36;32953:191;;;;:::o;33150:233::-;33189:3;33212:24;33230:5;33212:24;:::i;:::-;33203:33;;33258:66;33251:5;33248:77;33245:103;;33328:18;;:::i;:::-;33245:103;33375:1;33368:5;33364:13;33357:20;;33150:233;;;:::o;33389:229::-;33529:34;33525:1;33517:6;33513:14;33506:58;33598:12;33593:2;33585:6;33581:15;33574:37;33389:229;:::o;33624:366::-;33766:3;33787:67;33851:2;33846:3;33787:67;:::i;:::-;33780:74;;33863:93;33952:3;33863:93;:::i;:::-;33981:2;33976:3;33972:12;33965:19;;33624:366;;;:::o;33996:419::-;34162:4;34200:2;34189:9;34185:18;34177:26;;34249:9;34243:4;34239:20;34235:1;34224:9;34220:17;34213:47;34277:131;34403:4;34277:131;:::i;:::-;34269:139;;33996:419;;;:::o;34421:172::-;34561:24;34557:1;34549:6;34545:14;34538:48;34421:172;:::o;34599:366::-;34741:3;34762:67;34826:2;34821:3;34762:67;:::i;:::-;34755:74;;34838:93;34927:3;34838:93;:::i;:::-;34956:2;34951:3;34947:12;34940:19;;34599:366;;;:::o;34971:419::-;35137:4;35175:2;35164:9;35160:18;35152:26;;35224:9;35218:4;35214:20;35210:1;35199:9;35195:17;35188:47;35252:131;35378:4;35252:131;:::i;:::-;35244:139;;34971:419;;;:::o;35396:180::-;35536:32;35532:1;35524:6;35520:14;35513:56;35396:180;:::o;35582:366::-;35724:3;35745:67;35809:2;35804:3;35745:67;:::i;:::-;35738:74;;35821:93;35910:3;35821:93;:::i;:::-;35939:2;35934:3;35930:12;35923:19;;35582:366;;;:::o;35954:419::-;36120:4;36158:2;36147:9;36143:18;36135:26;;36207:9;36201:4;36197:20;36193:1;36182:9;36178:17;36171:47;36235:131;36361:4;36235:131;:::i;:::-;36227:139;;35954:419;;;:::o;36379:234::-;36519:34;36515:1;36507:6;36503:14;36496:58;36588:17;36583:2;36575:6;36571:15;36564:42;36379:234;:::o;36619:366::-;36761:3;36782:67;36846:2;36841:3;36782:67;:::i;:::-;36775:74;;36858:93;36947:3;36858:93;:::i;:::-;36976:2;36971:3;36967:12;36960:19;;36619:366;;;:::o;36991:419::-;37157:4;37195:2;37184:9;37180:18;37172:26;;37244:9;37238:4;37234:20;37230:1;37219:9;37215:17;37208:47;37272:131;37398:4;37272:131;:::i;:::-;37264:139;;36991:419;;;:::o;37416:237::-;37556:34;37552:1;37544:6;37540:14;37533:58;37625:20;37620:2;37612:6;37608:15;37601:45;37416:237;:::o;37659:366::-;37801:3;37822:67;37886:2;37881:3;37822:67;:::i;:::-;37815:74;;37898:93;37987:3;37898:93;:::i;:::-;38016:2;38011:3;38007:12;38000:19;;37659:366;;;:::o;38031:419::-;38197:4;38235:2;38224:9;38220:18;38212:26;;38284:9;38278:4;38274:20;38270:1;38259:9;38255:17;38248:47;38312:131;38438:4;38312:131;:::i;:::-;38304:139;;38031:419;;;:::o;38456:231::-;38596:34;38592:1;38584:6;38580:14;38573:58;38665:14;38660:2;38652:6;38648:15;38641:39;38456:231;:::o;38693:366::-;38835:3;38856:67;38920:2;38915:3;38856:67;:::i;:::-;38849:74;;38932:93;39021:3;38932:93;:::i;:::-;39050:2;39045:3;39041:12;39034:19;;38693:366;;;:::o;39065:419::-;39231:4;39269:2;39258:9;39254:18;39246:26;;39318:9;39312:4;39308:20;39304:1;39293:9;39289:17;39282:47;39346:131;39472:4;39346:131;:::i;:::-;39338:139;;39065:419;;;:::o;39490:223::-;39630:34;39626:1;39618:6;39614:14;39607:58;39699:6;39694:2;39686:6;39682:15;39675:31;39490:223;:::o;39719:366::-;39861:3;39882:67;39946:2;39941:3;39882:67;:::i;:::-;39875:74;;39958:93;40047:3;39958:93;:::i;:::-;40076:2;40071:3;40067:12;40060:19;;39719:366;;;:::o;40091:419::-;40257:4;40295:2;40284:9;40280:18;40272:26;;40344:9;40338:4;40334:20;40330:1;40319:9;40315:17;40308:47;40372:131;40498:4;40372:131;:::i;:::-;40364:139;;40091:419;;;:::o;40516:242::-;40656:34;40652:1;40644:6;40640:14;40633:58;40725:25;40720:2;40712:6;40708:15;40701:50;40516:242;:::o;40764:366::-;40906:3;40927:67;40991:2;40986:3;40927:67;:::i;:::-;40920:74;;41003:93;41092:3;41003:93;:::i;:::-;41121:2;41116:3;41112:12;41105:19;;40764:366;;;:::o;41136:419::-;41302:4;41340:2;41329:9;41325:18;41317:26;;41389:9;41383:4;41379:20;41375:1;41364:9;41360:17;41353:47;41417:131;41543:4;41417:131;:::i;:::-;41409:139;;41136:419;;;:::o;41561:194::-;41601:4;41621:20;41639:1;41621:20;:::i;:::-;41616:25;;41655:20;41673:1;41655:20;:::i;:::-;41650:25;;41699:1;41696;41692:9;41684:17;;41723:1;41717:4;41714:11;41711:37;;;41728:18;;:::i;:::-;41711:37;41561:194;;;;:::o;41761:237::-;41901:34;41897:1;41889:6;41885:14;41878:58;41970:20;41965:2;41957:6;41953:15;41946:45;41761:237;:::o;42004:366::-;42146:3;42167:67;42231:2;42226:3;42167:67;:::i;:::-;42160:74;;42243:93;42332:3;42243:93;:::i;:::-;42361:2;42356:3;42352:12;42345:19;;42004:366;;;:::o;42376:419::-;42542:4;42580:2;42569:9;42565:18;42557:26;;42629:9;42623:4;42619:20;42615:1;42604:9;42600:17;42593:47;42657:131;42783:4;42657:131;:::i;:::-;42649:139;;42376:419;;;:::o;42801:148::-;42903:11;42940:3;42925:18;;42801:148;;;;:::o;42955:390::-;43061:3;43089:39;43122:5;43089:39;:::i;:::-;43144:89;43226:6;43221:3;43144:89;:::i;:::-;43137:96;;43242:65;43300:6;43295:3;43288:4;43281:5;43277:16;43242:65;:::i;:::-;43332:6;43327:3;43323:16;43316:23;;43065:280;42955:390;;;;:::o;43351:435::-;43531:3;43553:95;43644:3;43635:6;43553:95;:::i;:::-;43546:102;;43665:95;43756:3;43747:6;43665:95;:::i;:::-;43658:102;;43777:3;43770:10;;43351:435;;;;;:::o;43792:243::-;43932:34;43928:1;43920:6;43916:14;43909:58;44001:26;43996:2;43988:6;43984:15;43977:51;43792:243;:::o;44041:366::-;44183:3;44204:67;44268:2;44263:3;44204:67;:::i;:::-;44197:74;;44280:93;44369:3;44280:93;:::i;:::-;44398:2;44393:3;44389:12;44382:19;;44041:366;;;:::o;44413:419::-;44579:4;44617:2;44606:9;44602:18;44594:26;;44666:9;44660:4;44656:20;44652:1;44641:9;44637:17;44630:47;44694:131;44820:4;44694:131;:::i;:::-;44686:139;;44413:419;;;:::o;44838:98::-;44889:6;44923:5;44917:12;44907:22;;44838:98;;;:::o;44942:168::-;45025:11;45059:6;45054:3;45047:19;45099:4;45094:3;45090:14;45075:29;;44942:168;;;;:::o;45116:373::-;45202:3;45230:38;45262:5;45230:38;:::i;:::-;45284:70;45347:6;45342:3;45284:70;:::i;:::-;45277:77;;45363:65;45421:6;45416:3;45409:4;45402:5;45398:16;45363:65;:::i;:::-;45453:29;45475:6;45453:29;:::i;:::-;45448:3;45444:39;45437:46;;45206:283;45116:373;;;;:::o;45495:640::-;45690:4;45728:3;45717:9;45713:19;45705:27;;45742:71;45810:1;45799:9;45795:17;45786:6;45742:71;:::i;:::-;45823:72;45891:2;45880:9;45876:18;45867:6;45823:72;:::i;:::-;45905;45973:2;45962:9;45958:18;45949:6;45905:72;:::i;:::-;46024:9;46018:4;46014:20;46009:2;45998:9;45994:18;45987:48;46052:76;46123:4;46114:6;46052:76;:::i;:::-;46044:84;;45495:640;;;;;;;:::o;46141:141::-;46197:5;46228:6;46222:13;46213:22;;46244:32;46270:5;46244:32;:::i;:::-;46141:141;;;;:::o;46288:349::-;46357:6;46406:2;46394:9;46385:7;46381:23;46377:32;46374:119;;;46412:79;;:::i;:::-;46374:119;46532:1;46557:63;46612:7;46603:6;46592:9;46588:22;46557:63;:::i;:::-;46547:73;;46503:127;46288:349;;;;:::o
Swarm Source
ipfs://749bf394b19501a14d99e84f6c574203b4d9f085d6e45dcc0a9558f2b4bdf487
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.