ERC-721
Overview
Max Total Supply
2,440 FOXFAMILY
Holders
626
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
3 FOXFAMILYLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
FoxFamily
Compiler Version
v0.8.13+commit.abaa5c0e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-12-05 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.13; interface IOperatorFilterRegistry { function isOperatorAllowed(address registrant, address operator) external view returns (bool); function register(address registrant) external; function registerAndSubscribe(address registrant, address subscription) external; function registerAndCopyEntries(address registrant, address registrantToCopy) external; function unregister(address addr) external; function updateOperator(address registrant, address operator, bool filtered) external; function updateOperators(address registrant, address[] calldata operators, bool filtered) external; function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external; function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external; function subscribe(address registrant, address registrantToSubscribe) external; function unsubscribe(address registrant, bool copyExistingEntries) external; function subscriptionOf(address addr) external returns (address registrant); function subscribers(address registrant) external returns (address[] memory); function subscriberAt(address registrant, uint256 index) external returns (address); function copyEntriesOf(address registrant, address registrantToCopy) external; function isOperatorFiltered(address registrant, address operator) external returns (bool); function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool); function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool); function filteredOperators(address addr) external returns (address[] memory); function filteredCodeHashes(address addr) external returns (bytes32[] memory); function filteredOperatorAt(address registrant, uint256 index) external returns (address); function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32); function isRegistered(address addr) external returns (bool); function codeHashOf(address addr) external returns (bytes32); } pragma solidity ^0.8.13; /** * @title OperatorFilterer * @notice Abstract contract whose constructor automatically registers and optionally subscribes to or copies another * registrant's entries in the OperatorFilterRegistry. * @dev This smart contract is meant to be inherited by token contracts so they can use the following: * - `onlyAllowedOperator` modifier for `transferFrom` and `safeTransferFrom` methods. * - `onlyAllowedOperatorApproval` modifier for `approve` and `setApprovalForAll` methods. */ abstract contract OperatorFilterer { error OperatorNotAllowed(address operator); IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY = IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E); constructor(address subscriptionOrRegistrantToCopy, bool subscribe) { // If an inheriting token contract is deployed to a network without the registry deployed, the modifier // will not revert, but the contract will need to be registered with the registry once it is deployed in // order for the modifier to filter addresses. if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) { if (subscribe) { OPERATOR_FILTER_REGISTRY.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy); } else { if (subscriptionOrRegistrantToCopy != address(0)) { OPERATOR_FILTER_REGISTRY.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy); } else { OPERATOR_FILTER_REGISTRY.register(address(this)); } } } } modifier onlyAllowedOperator(address from) virtual { // Allow spending tokens from addresses with balance // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred // from an EOA. if (from != msg.sender) { _checkFilterOperator(msg.sender); } _; } modifier onlyAllowedOperatorApproval(address operator) virtual { _checkFilterOperator(operator); _; } function _checkFilterOperator(address operator) internal view virtual { // Check registry code length to facilitate testing in environments without a deployed registry. if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) { if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) { revert OperatorNotAllowed(operator); } } } } // ERC721A Contracts v4.0.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of an ERC721A compliant contract. */ interface IERC721A { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * The caller cannot approve to their own address. */ error ApproveToCaller(); /** * The caller cannot approve to the current owner. */ error ApprovalToCurrentOwner(); /** * 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(); struct TokenOwnership { // The address of the owner. address addr; // Keeps track of the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; } /** * @dev Returns the total amount of tokens stored by the contract. * * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens. */ function totalSupply() external view returns (uint256); // ============================== // 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); // ============================== // 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`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev 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); } // ERC721A Contracts v4.0.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev ERC721 token receiver interface. */ interface ERC721A__IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..). * * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is IERC721A { // 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 tokenId of the next token 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` 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 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } /** * @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 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 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 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 returns (uint256) { return _burnCounter; } /** * @dev See {IERC165-supportsInterface}. */ 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: 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. } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view 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 auxillary 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 auxillary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal { uint256 packed = _packedAddressData[owner]; uint256 auxCasted; assembly { // Cast aux without masking. auxCasted := aux } packed = (packed & BITMASK_AUX_COMPLEMENT) | (auxCasted << BITPOS_AUX); _packedAddressData[owner] = packed; } /** * 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 ownership that has an address and is not burned // before an ownership that does not have an address and is not burned. // Hence, curr will not underflow. // // We can directly compare the packed value. // If the address is zero, packed is zero. while (packed == 0) { packed = _packedOwnerships[--curr]; } return packed; } } } revert OwnerQueryForNonexistentToken(); } /** * 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; } /** * Returns the unpacked `TokenOwnership` struct at `index`. */ function _ownershipAt(uint256 index) internal view returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnerships[index]); } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal { if (_packedOwnerships[index] == 0) { _packedOwnerships[index] = _packedOwnershipOf(index); } } /** * Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around in the collection over time. */ function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _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, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } /** * @dev Casts the address to uint256 without masking. */ function _addressToUint256(address value) private pure returns (uint256 result) { assembly { result := value } } /** * @dev Casts the boolean to uint256 without branching. */ function _boolToUint256(bool value) private pure returns (uint256 result) { assembly { result := value } } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = address(uint160(_packedOwnershipOf(tokenId))); if (to == owner) revert ApprovalToCurrentOwner(); if (_msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { revert ApprovalCallerNotOwnerNorApproved(); } _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { if (operator == _msgSenderERC721A()) revert ApproveToCaller(); _operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { _transfer(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), */ function _exists(uint256 tokenId) internal view returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && // If within bounds, _packedOwnerships[tokenId] & BITMASK_BURNED == 0; // and not burned. } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ''); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the balance and number minted. _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] = _addressToUint256(to) | (block.timestamp << BITPOS_START_TIMESTAMP) | (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; if (to.code.length != 0) { do { emit Transfer(address(0), to, updatedIndex); if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (updatedIndex < end); // Reentrancy protection if (_currentIndex != startTokenId) revert(); } else { do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex < end); } _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _mint(address to, uint256 quantity) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the balance and number minted. _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] = _addressToUint256(to) | (block.timestamp << BITPOS_START_TIMESTAMP) | (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex < end); _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) private { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); bool isApprovedOrOwner = (_msgSenderERC721A() == from || isApprovedForAll(from, _msgSenderERC721A()) || getApproved(tokenId) == _msgSenderERC721A()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. delete _tokenApprovals[tokenId]; // 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] = _addressToUint256(to) | (block.timestamp << BITPOS_START_TIMESTAMP) | BITMASK_NEXT_INITIALIZED; // 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 `_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)); if (approvalCheck) { bool isApprovedOrOwner = (_msgSenderERC721A() == from || isApprovedForAll(from, _msgSenderERC721A()) || getApproved(tokenId) == _msgSenderERC721A()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. delete _tokenApprovals[tokenId]; // 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] = _addressToUint256(from) | (block.timestamp << BITPOS_START_TIMESTAMP) | BITMASK_BURNED | BITMASK_NEXT_INITIALIZED; // 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++; } } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try 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)) } } } } /** * @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 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 returns (string memory ptr) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), // but we allocate 128 bytes to keep the free memory pointer 32-byte word aliged. // We will need 1 32-byte word to store the length, // and 3 32-byte words to store a maximum of 78 digits. Total: 32 + 3 * 32 = 128. ptr := add(mload(0x40), 128) // Update the free memory pointer to allocate. mstore(0x40, ptr) // Cache the end of the memory to calculate the length later. let end := ptr // We write the string from the rightmost digit to the leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // Costs a bit more than early returning for the zero case, // but cheaper in terms of deployment and overall runtime costs. for { // Initialize and perform the first pass without check. let temp := value // Move the pointer 1 byte leftwards to point to an empty character slot. ptr := sub(ptr, 1) // Write the character to the pointer. 48 is the ASCII index of '0'. mstore8(ptr, add(48, mod(temp, 10))) temp := div(temp, 10) } temp { // Keep dividing `temp` until zero. temp := div(temp, 10) } { // Body of the for loop. ptr := sub(ptr, 1) mstore8(ptr, add(48, mod(temp, 10))) } let length := sub(end, ptr) // Move the pointer 32 bytes leftwards to make room for the length. ptr := sub(ptr, 32) // Store the length. mstore(ptr, length) } } } // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } pragma solidity >=0.8.9 <0.9.0; contract FoxFamily is ERC721A, Ownable, ReentrancyGuard, OperatorFilterer { using Strings for uint256; string public uriPrefix = ''; string public uriSuffix = '.json'; string public hiddenMetadataUri; uint256 public cost = 0.015 ether; uint256 public maxNFTs = 3333; uint256 public maxPerTxn = 5; uint256 public maxMintAmount = 5; bool public paused = true; bool public revealed = true; constructor( string memory _tokenName, string memory _tokenSymbol ) ERC721A(_tokenName, _tokenSymbol) OperatorFilterer(address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6), false) {} modifier mintCompliance(uint256 _mintAmount) { require(!paused, "Minting has not started yet."); require(_mintAmount > 0 && _mintAmount <= maxPerTxn, "You can only mint 5 foxes per transaction."); require(totalSupply() + _mintAmount <= maxNFTs, "There are no foxes lefts!"); require(tx.origin == msg.sender, "No minting with smart contract."); require( _mintAmount > 0 && numberMinted(msg.sender) + _mintAmount <= maxMintAmount, "You have minted the max number of foxes!" ); require(msg.value >= cost * _mintAmount, "Insufficient or incorrect funds."); _; } function mint(uint256 _mintAmount) public payable mintCompliance(_mintAmount) { _safeMint(_msgSender(), _mintAmount); } function mintForAddress(uint256 _mintAmount, address _receiver) public onlyOwner { require(totalSupply() + _mintAmount <= maxNFTs, "Max supply exceeded!"); _safeMint(_receiver, _mintAmount); } function _startTokenId() internal view virtual override returns (uint256) { return 1; } function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) { require(_exists(_tokenId), "ERC721Metadata: URI query for nonexistent token"); if (revealed == false) { return hiddenMetadataUri; } string memory currentBaseURI = _baseURI(); return bytes(currentBaseURI).length > 0 ? string(abi.encodePacked(currentBaseURI, _tokenId.toString(), uriSuffix)) : ''; } function setCost(uint256 _cost) public onlyOwner { cost = _cost; } function setRevealed(bool _state) public onlyOwner { revealed = _state; } function setHiddenMetadataUri(string memory _hiddenMetadataUri) public onlyOwner { hiddenMetadataUri = _hiddenMetadataUri; } function setUriPrefix(string memory _uriPrefix) public onlyOwner { uriPrefix = _uriPrefix; } function setUriSuffix(string memory _uriSuffix) public onlyOwner { uriSuffix = _uriSuffix; } function setPaused(bool _state) public onlyOwner { paused = _state; } function setMaxMintAmount(uint256 _maxMintAmount) public onlyOwner { maxMintAmount = _maxMintAmount; } function withdraw() public onlyOwner nonReentrant { (bool withdrawFunds, ) = payable(owner()).call{value: address(this).balance}(""); require(withdrawFunds); } function numberMinted(address owner) public view returns (uint256) { return _numberMinted(owner); } function _baseURI() internal view virtual override returns (string memory) { return uriPrefix; } function setApprovalForAll(address operator, bool approved) public override onlyAllowedOperatorApproval(operator) { super.setApprovalForAll(operator, approved); } function approve(address operator, uint256 tokenId) public override onlyAllowedOperatorApproval(operator) { super.approve(operator, tokenId); } function transferFrom(address from, address to, uint256 tokenId) public override onlyAllowedOperator(from) { super.transferFrom(from, to, tokenId); } function safeTransferFrom(address from, address to, uint256 tokenId) public override onlyAllowedOperator(from) { super.safeTransferFrom(from, to, tokenId); } function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public override onlyAllowedOperator(from) { super.safeTransferFrom(from, to, tokenId, data); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"_tokenName","type":"string"},{"internalType":"string","name":"_tokenSymbol","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hiddenMetadataUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxNFTs","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerTxn","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":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"mintForAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_hiddenMetadataUri","type":"string"}],"name":"setHiddenMetadataUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintAmount","type":"uint256"}],"name":"setMaxMintAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"setUriPrefix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriSuffix","type":"string"}],"name":"setUriSuffix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uriPrefix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405260405180602001604052806000815250600a90805190602001906200002b9291906200045f565b506040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600b9080519060200190620000799291906200045f565b5066354a6ba7a18000600d55610d05600e556005600f5560056010556001601160006101000a81548160ff0219169083151502179055506001601160016101000a81548160ff021916908315150217905550348015620000d857600080fd5b50604051620046d3380380620046d38339818101604052810190620000fe9190620006ac565b733cc6cdda760b79bafa08df41ecfa224f810dceb66000838381600290805190602001906200012f9291906200045f565b508060039080519060200190620001489291906200045f565b50620001596200038860201b60201c565b600081905550505062000181620001756200039160201b60201c565b6200039960201b60201c565b600160098190555060006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156200037e57801562000244576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b81526004016200020a92919062000776565b600060405180830381600087803b1580156200022557600080fd5b505af11580156200023a573d6000803e3d6000fd5b505050506200037d565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614620002fe576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b8152600401620002c492919062000776565b600060405180830381600087803b158015620002df57600080fd5b505af1158015620002f4573d6000803e3d6000fd5b505050506200037c565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b8152600401620003479190620007a3565b600060405180830381600087803b1580156200036257600080fd5b505af115801562000377573d6000803e3d6000fd5b505050505b5b5b5050505062000824565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200046d90620007ef565b90600052602060002090601f016020900481019282620004915760008555620004dd565b82601f10620004ac57805160ff1916838001178555620004dd565b82800160010185558215620004dd579182015b82811115620004dc578251825591602001919060010190620004bf565b5b509050620004ec9190620004f0565b5090565b5b808211156200050b576000816000905550600101620004f1565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b62000578826200052d565b810181811067ffffffffffffffff821117156200059a57620005996200053e565b5b80604052505050565b6000620005af6200050f565b9050620005bd82826200056d565b919050565b600067ffffffffffffffff821115620005e057620005df6200053e565b5b620005eb826200052d565b9050602081019050919050565b60005b8381101562000618578082015181840152602081019050620005fb565b8381111562000628576000848401525b50505050565b6000620006456200063f84620005c2565b620005a3565b90508281526020810184848401111562000664576200066362000528565b5b62000671848285620005f8565b509392505050565b600082601f83011262000691576200069062000523565b5b8151620006a38482602086016200062e565b91505092915050565b60008060408385031215620006c657620006c562000519565b5b600083015167ffffffffffffffff811115620006e757620006e66200051e565b5b620006f58582860162000679565b925050602083015167ffffffffffffffff8111156200071957620007186200051e565b5b620007278582860162000679565b9150509250929050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200075e8262000731565b9050919050565b620007708162000751565b82525050565b60006040820190506200078d600083018562000765565b6200079c602083018462000765565b9392505050565b6000602082019050620007ba600083018462000765565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200080857607f821691505b6020821081036200081e576200081d620007c0565b5b50919050565b613e9f80620008346000396000f3fe6080604052600436106102255760003560e01c80635503a0e811610123578063a0712d68116100ab578063dc33e6811161006f578063dc33e681146107c2578063e0a80853146107ff578063e985e9c514610828578063efbd73f414610865578063f2fde38b1461088e57610225565b8063a0712d68146106ec578063a22cb46514610708578063a45ba8e714610731578063b88d4fde1461075c578063c87b56dd1461078557610225565b806370a08231116100f257806370a0823114610619578063715018a6146106565780637ec4a6591461066d5780638da5cb5b1461069657806395d89b41146106c157610225565b80635503a0e81461055b5780635c975abb1461058657806362b99ad4146105b15780636352211e146105dc57610225565b8063239c70ae116101b157806342842e0e1161017557806342842e0e1461048a57806344a0d68a146104b35780634e9e1ec6146104dc5780634fdd43cb14610507578063518302271461053057610225565b8063239c70ae146103c957806323b872dd146103f45780633cb519941461041d5780633ccfd60b1461044857806341f434341461045f57610225565b8063095ea7b3116101f8578063095ea7b3146102f857806313faede61461032157806316ba10e01461034c57806316c38b3c1461037557806318160ddd1461039e57610225565b806301ffc9a71461022a57806306fdde0314610267578063081812fc14610292578063088a4ed0146102cf575b600080fd5b34801561023657600080fd5b50610251600480360381019061024c9190612cf5565b6108b7565b60405161025e9190612d3d565b60405180910390f35b34801561027357600080fd5b5061027c610949565b6040516102899190612df1565b60405180910390f35b34801561029e57600080fd5b506102b960048036038101906102b49190612e49565b6109db565b6040516102c69190612eb7565b60405180910390f35b3480156102db57600080fd5b506102f660048036038101906102f19190612e49565b610a57565b005b34801561030457600080fd5b5061031f600480360381019061031a9190612efe565b610add565b005b34801561032d57600080fd5b50610336610af6565b6040516103439190612f4d565b60405180910390f35b34801561035857600080fd5b50610373600480360381019061036e919061309d565b610afc565b005b34801561038157600080fd5b5061039c60048036038101906103979190613112565b610b92565b005b3480156103aa57600080fd5b506103b3610c2b565b6040516103c09190612f4d565b60405180910390f35b3480156103d557600080fd5b506103de610c42565b6040516103eb9190612f4d565b60405180910390f35b34801561040057600080fd5b5061041b6004803603810190610416919061313f565b610c48565b005b34801561042957600080fd5b50610432610c97565b60405161043f9190612f4d565b60405180910390f35b34801561045457600080fd5b5061045d610c9d565b005b34801561046b57600080fd5b50610474610dee565b60405161048191906131f1565b60405180910390f35b34801561049657600080fd5b506104b160048036038101906104ac919061313f565b610e00565b005b3480156104bf57600080fd5b506104da60048036038101906104d59190612e49565b610e4f565b005b3480156104e857600080fd5b506104f1610ed5565b6040516104fe9190612f4d565b60405180910390f35b34801561051357600080fd5b5061052e6004803603810190610529919061309d565b610edb565b005b34801561053c57600080fd5b50610545610f71565b6040516105529190612d3d565b60405180910390f35b34801561056757600080fd5b50610570610f84565b60405161057d9190612df1565b60405180910390f35b34801561059257600080fd5b5061059b611012565b6040516105a89190612d3d565b60405180910390f35b3480156105bd57600080fd5b506105c6611025565b6040516105d39190612df1565b60405180910390f35b3480156105e857600080fd5b5061060360048036038101906105fe9190612e49565b6110b3565b6040516106109190612eb7565b60405180910390f35b34801561062557600080fd5b50610640600480360381019061063b919061320c565b6110c5565b60405161064d9190612f4d565b60405180910390f35b34801561066257600080fd5b5061066b61117d565b005b34801561067957600080fd5b50610694600480360381019061068f919061309d565b611205565b005b3480156106a257600080fd5b506106ab61129b565b6040516106b89190612eb7565b60405180910390f35b3480156106cd57600080fd5b506106d66112c5565b6040516106e39190612df1565b60405180910390f35b61070660048036038101906107019190612e49565b611357565b005b34801561071457600080fd5b5061072f600480360381019061072a9190613239565b611587565b005b34801561073d57600080fd5b506107466115a0565b6040516107539190612df1565b60405180910390f35b34801561076857600080fd5b50610783600480360381019061077e919061331a565b61162e565b005b34801561079157600080fd5b506107ac60048036038101906107a79190612e49565b61167f565b6040516107b99190612df1565b60405180910390f35b3480156107ce57600080fd5b506107e960048036038101906107e4919061320c565b6117d7565b6040516107f69190612f4d565b60405180910390f35b34801561080b57600080fd5b5061082660048036038101906108219190613112565b6117e9565b005b34801561083457600080fd5b5061084f600480360381019061084a919061339d565b611882565b60405161085c9190612d3d565b60405180910390f35b34801561087157600080fd5b5061088c600480360381019061088791906133dd565b611916565b005b34801561089a57600080fd5b506108b560048036038101906108b0919061320c565b6119f7565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061091257506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109425750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6060600280546109589061344c565b80601f01602080910402602001604051908101604052809291908181526020018280546109849061344c565b80156109d15780601f106109a6576101008083540402835291602001916109d1565b820191906000526020600020905b8154815290600101906020018083116109b457829003601f168201915b5050505050905090565b60006109e682611aee565b610a1c576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b610a5f611b4d565b73ffffffffffffffffffffffffffffffffffffffff16610a7d61129b565b73ffffffffffffffffffffffffffffffffffffffff1614610ad3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aca906134c9565b60405180910390fd5b8060108190555050565b81610ae781611b55565b610af18383611c52565b505050565b600d5481565b610b04611b4d565b73ffffffffffffffffffffffffffffffffffffffff16610b2261129b565b73ffffffffffffffffffffffffffffffffffffffff1614610b78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6f906134c9565b60405180910390fd5b80600b9080519060200190610b8e929190612be6565b5050565b610b9a611b4d565b73ffffffffffffffffffffffffffffffffffffffff16610bb861129b565b73ffffffffffffffffffffffffffffffffffffffff1614610c0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c05906134c9565b60405180910390fd5b80601160006101000a81548160ff02191690831515021790555050565b6000610c35611df8565b6001546000540303905090565b60105481565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610c8657610c8533611b55565b5b610c91848484611e01565b50505050565b600f5481565b610ca5611b4d565b73ffffffffffffffffffffffffffffffffffffffff16610cc361129b565b73ffffffffffffffffffffffffffffffffffffffff1614610d19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d10906134c9565b60405180910390fd5b600260095403610d5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5590613535565b60405180910390fd5b60026009819055506000610d7061129b565b73ffffffffffffffffffffffffffffffffffffffff1647604051610d9390613586565b60006040518083038185875af1925050503d8060008114610dd0576040519150601f19603f3d011682016040523d82523d6000602084013e610dd5565b606091505b5050905080610de357600080fd5b506001600981905550565b6daaeb6d7670e522a718067333cd4e81565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610e3e57610e3d33611b55565b5b610e49848484611e11565b50505050565b610e57611b4d565b73ffffffffffffffffffffffffffffffffffffffff16610e7561129b565b73ffffffffffffffffffffffffffffffffffffffff1614610ecb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec2906134c9565b60405180910390fd5b80600d8190555050565b600e5481565b610ee3611b4d565b73ffffffffffffffffffffffffffffffffffffffff16610f0161129b565b73ffffffffffffffffffffffffffffffffffffffff1614610f57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4e906134c9565b60405180910390fd5b80600c9080519060200190610f6d929190612be6565b5050565b601160019054906101000a900460ff1681565b600b8054610f919061344c565b80601f0160208091040260200160405190810160405280929190818152602001828054610fbd9061344c565b801561100a5780601f10610fdf5761010080835404028352916020019161100a565b820191906000526020600020905b815481529060010190602001808311610fed57829003601f168201915b505050505081565b601160009054906101000a900460ff1681565b600a80546110329061344c565b80601f016020809104026020016040519081016040528092919081815260200182805461105e9061344c565b80156110ab5780601f10611080576101008083540402835291602001916110ab565b820191906000526020600020905b81548152906001019060200180831161108e57829003601f168201915b505050505081565b60006110be82611e31565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361112c576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611185611b4d565b73ffffffffffffffffffffffffffffffffffffffff166111a361129b565b73ffffffffffffffffffffffffffffffffffffffff16146111f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f0906134c9565b60405180910390fd5b6112036000611efd565b565b61120d611b4d565b73ffffffffffffffffffffffffffffffffffffffff1661122b61129b565b73ffffffffffffffffffffffffffffffffffffffff1614611281576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611278906134c9565b60405180910390fd5b80600a9080519060200190611297929190612be6565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600380546112d49061344c565b80601f01602080910402602001604051908101604052809291908181526020018280546113009061344c565b801561134d5780601f106113225761010080835404028352916020019161134d565b820191906000526020600020905b81548152906001019060200180831161133057829003601f168201915b5050505050905090565b80601160009054906101000a900460ff16156113a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139f906135e7565b60405180910390fd5b6000811180156113ba5750600f548111155b6113f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f090613679565b60405180910390fd5b600e5481611405610c2b565b61140f91906136c8565b1115611450576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114479061376a565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146114be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b5906137d6565b60405180910390fd5b6000811180156114e35750601054816114d6336117d7565b6114e091906136c8565b11155b611522576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151990613868565b60405180910390fd5b80600d546115309190613888565b341015611572576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115699061392e565b60405180910390fd5b61158361157d611b4d565b83611fc3565b5050565b8161159181611b55565b61159b8383611fe1565b505050565b600c80546115ad9061344c565b80601f01602080910402602001604051908101604052809291908181526020018280546115d99061344c565b80156116265780601f106115fb57610100808354040283529160200191611626565b820191906000526020600020905b81548152906001019060200180831161160957829003601f168201915b505050505081565b833373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461166c5761166b33611b55565b5b61167885858585612158565b5050505050565b606061168a82611aee565b6116c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c0906139c0565b60405180910390fd5b60001515601160019054906101000a900460ff1615150361177657600c80546116f19061344c565b80601f016020809104026020016040519081016040528092919081815260200182805461171d9061344c565b801561176a5780601f1061173f5761010080835404028352916020019161176a565b820191906000526020600020905b81548152906001019060200180831161174d57829003601f168201915b505050505090506117d2565b60006117806121cb565b905060008151116117a057604051806020016040528060008152506117ce565b806117aa8461225d565b600b6040516020016117be93929190613ab0565b6040516020818303038152906040525b9150505b919050565b60006117e2826123bd565b9050919050565b6117f1611b4d565b73ffffffffffffffffffffffffffffffffffffffff1661180f61129b565b73ffffffffffffffffffffffffffffffffffffffff1614611865576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185c906134c9565b60405180910390fd5b80601160016101000a81548160ff02191690831515021790555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61191e611b4d565b73ffffffffffffffffffffffffffffffffffffffff1661193c61129b565b73ffffffffffffffffffffffffffffffffffffffff1614611992576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611989906134c9565b60405180910390fd5b600e548261199e610c2b565b6119a891906136c8565b11156119e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e090613b2d565b60405180910390fd5b6119f38183611fc3565b5050565b6119ff611b4d565b73ffffffffffffffffffffffffffffffffffffffff16611a1d61129b565b73ffffffffffffffffffffffffffffffffffffffff1614611a73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6a906134c9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611ae2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad990613bbf565b60405180910390fd5b611aeb81611efd565b50565b600081611af9611df8565b11158015611b08575060005482105b8015611b46575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611c4f576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401611bcc929190613bdf565b602060405180830381865afa158015611be9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c0d9190613c1d565b611c4e57806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611c459190612eb7565b60405180910390fd5b5b50565b6000611c5d82611e31565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611cc4576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16611ce3612414565b73ffffffffffffffffffffffffffffffffffffffff1614611d4657611d0f81611d0a612414565b611882565b611d45576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b611e0c83838361241c565b505050565b611e2c8383836040518060200160405280600081525061162e565b505050565b60008082905080611e40611df8565b11611ec657600054811015611ec55760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603611ec3575b60008103611eb9576004600083600190039350838152602001908152602001600020549050611e8f565b8092505050611ef8565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611fdd8282604051806020016040528060008152506127c3565b5050565b611fe9612414565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361204d576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806007600061205a612414565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16612107612414565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161214c9190612d3d565b60405180910390a35050565b61216384848461241c565b60008373ffffffffffffffffffffffffffffffffffffffff163b146121c55761218e84848484612a76565b6121c4576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6060600a80546121da9061344c565b80601f01602080910402602001604051908101604052809291908181526020018280546122069061344c565b80156122535780601f1061222857610100808354040283529160200191612253565b820191906000526020600020905b81548152906001019060200180831161223657829003601f168201915b5050505050905090565b6060600082036122a4576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506123b8565b600082905060005b600082146122d65780806122bf90613c4a565b915050600a826122cf9190613cc1565b91506122ac565b60008167ffffffffffffffff8111156122f2576122f1612f72565b5b6040519080825280601f01601f1916602001820160405280156123245781602001600182028036833780820191505090505b5090505b600085146123b15760018261233d9190613cf2565b9150600a8561234c9190613d26565b603061235891906136c8565b60f81b81838151811061236e5761236d613d57565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856123aa9190613cc1565b9450612328565b8093505050505b919050565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b600033905090565b600061242782611e31565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461248e576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166124af612414565b73ffffffffffffffffffffffffffffffffffffffff1614806124de57506124dd856124d8612414565b611882565b5b8061252357506124ec612414565b73ffffffffffffffffffffffffffffffffffffffff1661250b846109db565b73ffffffffffffffffffffffffffffffffffffffff16145b90508061255c576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036125c2576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6125cf8585856001612bc6565b6006600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b6126cc86612bcc565b1717600460008581526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008316036127545760006001840190506000600460008381526020019081526020016000205403612752576000548114612751578260046000838152602001908152602001600020819055505b5b505b828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46127bc8585856001612bd6565b5050505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361282f576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008303612869576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6128766000858386612bc6565b600160406001901b178302600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e16128db60018514612bdc565b901b60a042901b6128eb86612bcc565b1717600460008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b146129ef575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461299f6000878480600101955087612a76565b6129d5576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082106129305782600054146129ea57600080fd5b612a5a565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082106129f0575b816000819055505050612a706000858386612bd6565b50505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612a9c612414565b8786866040518563ffffffff1660e01b8152600401612abe9493929190613ddb565b6020604051808303816000875af1925050508015612afa57506040513d601f19601f82011682018060405250810190612af79190613e3c565b60015b612b73573d8060008114612b2a576040519150601f19603f3d011682016040523d82523d6000602084013e612b2f565b606091505b506000815103612b6b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b50505050565b6000819050919050565b50505050565b6000819050919050565b828054612bf29061344c565b90600052602060002090601f016020900481019282612c145760008555612c5b565b82601f10612c2d57805160ff1916838001178555612c5b565b82800160010185558215612c5b579182015b82811115612c5a578251825591602001919060010190612c3f565b5b509050612c689190612c6c565b5090565b5b80821115612c85576000816000905550600101612c6d565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612cd281612c9d565b8114612cdd57600080fd5b50565b600081359050612cef81612cc9565b92915050565b600060208284031215612d0b57612d0a612c93565b5b6000612d1984828501612ce0565b91505092915050565b60008115159050919050565b612d3781612d22565b82525050565b6000602082019050612d526000830184612d2e565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612d92578082015181840152602081019050612d77565b83811115612da1576000848401525b50505050565b6000601f19601f8301169050919050565b6000612dc382612d58565b612dcd8185612d63565b9350612ddd818560208601612d74565b612de681612da7565b840191505092915050565b60006020820190508181036000830152612e0b8184612db8565b905092915050565b6000819050919050565b612e2681612e13565b8114612e3157600080fd5b50565b600081359050612e4381612e1d565b92915050565b600060208284031215612e5f57612e5e612c93565b5b6000612e6d84828501612e34565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612ea182612e76565b9050919050565b612eb181612e96565b82525050565b6000602082019050612ecc6000830184612ea8565b92915050565b612edb81612e96565b8114612ee657600080fd5b50565b600081359050612ef881612ed2565b92915050565b60008060408385031215612f1557612f14612c93565b5b6000612f2385828601612ee9565b9250506020612f3485828601612e34565b9150509250929050565b612f4781612e13565b82525050565b6000602082019050612f626000830184612f3e565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612faa82612da7565b810181811067ffffffffffffffff82111715612fc957612fc8612f72565b5b80604052505050565b6000612fdc612c89565b9050612fe88282612fa1565b919050565b600067ffffffffffffffff82111561300857613007612f72565b5b61301182612da7565b9050602081019050919050565b82818337600083830152505050565b600061304061303b84612fed565b612fd2565b90508281526020810184848401111561305c5761305b612f6d565b5b61306784828561301e565b509392505050565b600082601f83011261308457613083612f68565b5b813561309484826020860161302d565b91505092915050565b6000602082840312156130b3576130b2612c93565b5b600082013567ffffffffffffffff8111156130d1576130d0612c98565b5b6130dd8482850161306f565b91505092915050565b6130ef81612d22565b81146130fa57600080fd5b50565b60008135905061310c816130e6565b92915050565b60006020828403121561312857613127612c93565b5b6000613136848285016130fd565b91505092915050565b60008060006060848603121561315857613157612c93565b5b600061316686828701612ee9565b935050602061317786828701612ee9565b925050604061318886828701612e34565b9150509250925092565b6000819050919050565b60006131b76131b26131ad84612e76565b613192565b612e76565b9050919050565b60006131c98261319c565b9050919050565b60006131db826131be565b9050919050565b6131eb816131d0565b82525050565b600060208201905061320660008301846131e2565b92915050565b60006020828403121561322257613221612c93565b5b600061323084828501612ee9565b91505092915050565b600080604083850312156132505761324f612c93565b5b600061325e85828601612ee9565b925050602061326f858286016130fd565b9150509250929050565b600067ffffffffffffffff82111561329457613293612f72565b5b61329d82612da7565b9050602081019050919050565b60006132bd6132b884613279565b612fd2565b9050828152602081018484840111156132d9576132d8612f6d565b5b6132e484828561301e565b509392505050565b600082601f83011261330157613300612f68565b5b81356133118482602086016132aa565b91505092915050565b6000806000806080858703121561333457613333612c93565b5b600061334287828801612ee9565b945050602061335387828801612ee9565b935050604061336487828801612e34565b925050606085013567ffffffffffffffff81111561338557613384612c98565b5b613391878288016132ec565b91505092959194509250565b600080604083850312156133b4576133b3612c93565b5b60006133c285828601612ee9565b92505060206133d385828601612ee9565b9150509250929050565b600080604083850312156133f4576133f3612c93565b5b600061340285828601612e34565b925050602061341385828601612ee9565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061346457607f821691505b6020821081036134775761347661341d565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006134b3602083612d63565b91506134be8261347d565b602082019050919050565b600060208201905081810360008301526134e2816134a6565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b600061351f601f83612d63565b915061352a826134e9565b602082019050919050565b6000602082019050818103600083015261354e81613512565b9050919050565b600081905092915050565b50565b6000613570600083613555565b915061357b82613560565b600082019050919050565b600061359182613563565b9150819050919050565b7f4d696e74696e6720686173206e6f742073746172746564207965742e00000000600082015250565b60006135d1601c83612d63565b91506135dc8261359b565b602082019050919050565b60006020820190508181036000830152613600816135c4565b9050919050565b7f596f752063616e206f6e6c79206d696e74203520666f7865732070657220747260008201527f616e73616374696f6e2e00000000000000000000000000000000000000000000602082015250565b6000613663602a83612d63565b915061366e82613607565b604082019050919050565b6000602082019050818103600083015261369281613656565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006136d382612e13565b91506136de83612e13565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561371357613712613699565b5b828201905092915050565b7f546865726520617265206e6f20666f786573206c656674732100000000000000600082015250565b6000613754601983612d63565b915061375f8261371e565b602082019050919050565b6000602082019050818103600083015261378381613747565b9050919050565b7f4e6f206d696e74696e67207769746820736d61727420636f6e74726163742e00600082015250565b60006137c0601f83612d63565b91506137cb8261378a565b602082019050919050565b600060208201905081810360008301526137ef816137b3565b9050919050565b7f596f752068617665206d696e74656420746865206d6178206e756d626572206f60008201527f6620666f78657321000000000000000000000000000000000000000000000000602082015250565b6000613852602883612d63565b915061385d826137f6565b604082019050919050565b6000602082019050818103600083015261388181613845565b9050919050565b600061389382612e13565b915061389e83612e13565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156138d7576138d6613699565b5b828202905092915050565b7f496e73756666696369656e74206f7220696e636f72726563742066756e64732e600082015250565b6000613918602083612d63565b9150613923826138e2565b602082019050919050565b600060208201905081810360008301526139478161390b565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006139aa602f83612d63565b91506139b58261394e565b604082019050919050565b600060208201905081810360008301526139d98161399d565b9050919050565b600081905092915050565b60006139f682612d58565b613a0081856139e0565b9350613a10818560208601612d74565b80840191505092915050565b60008190508160005260206000209050919050565b60008154613a3e8161344c565b613a4881866139e0565b94506001821660008114613a635760018114613a7457613aa7565b60ff19831686528186019350613aa7565b613a7d85613a1c565b60005b83811015613a9f57815481890152600182019150602081019050613a80565b838801955050505b50505092915050565b6000613abc82866139eb565b9150613ac882856139eb565b9150613ad48284613a31565b9150819050949350505050565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b6000613b17601483612d63565b9150613b2282613ae1565b602082019050919050565b60006020820190508181036000830152613b4681613b0a565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613ba9602683612d63565b9150613bb482613b4d565b604082019050919050565b60006020820190508181036000830152613bd881613b9c565b9050919050565b6000604082019050613bf46000830185612ea8565b613c016020830184612ea8565b9392505050565b600081519050613c17816130e6565b92915050565b600060208284031215613c3357613c32612c93565b5b6000613c4184828501613c08565b91505092915050565b6000613c5582612e13565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613c8757613c86613699565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613ccc82612e13565b9150613cd783612e13565b925082613ce757613ce6613c92565b5b828204905092915050565b6000613cfd82612e13565b9150613d0883612e13565b925082821015613d1b57613d1a613699565b5b828203905092915050565b6000613d3182612e13565b9150613d3c83612e13565b925082613d4c57613d4b613c92565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b600082825260208201905092915050565b6000613dad82613d86565b613db78185613d91565b9350613dc7818560208601612d74565b613dd081612da7565b840191505092915050565b6000608082019050613df06000830187612ea8565b613dfd6020830186612ea8565b613e0a6040830185612f3e565b8181036060830152613e1c8184613da2565b905095945050505050565b600081519050613e3681612cc9565b92915050565b600060208284031215613e5257613e51612c93565b5b6000613e6084828501613e27565b9150509291505056fea2646970667358221220ac9ada43f61ebea56bcf975c0e0d4d5de69acf6478e951312822316d9f4daf3f64736f6c634300080d003300000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000a466f782046616d696c79000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009464f5846414d494c590000000000000000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106102255760003560e01c80635503a0e811610123578063a0712d68116100ab578063dc33e6811161006f578063dc33e681146107c2578063e0a80853146107ff578063e985e9c514610828578063efbd73f414610865578063f2fde38b1461088e57610225565b8063a0712d68146106ec578063a22cb46514610708578063a45ba8e714610731578063b88d4fde1461075c578063c87b56dd1461078557610225565b806370a08231116100f257806370a0823114610619578063715018a6146106565780637ec4a6591461066d5780638da5cb5b1461069657806395d89b41146106c157610225565b80635503a0e81461055b5780635c975abb1461058657806362b99ad4146105b15780636352211e146105dc57610225565b8063239c70ae116101b157806342842e0e1161017557806342842e0e1461048a57806344a0d68a146104b35780634e9e1ec6146104dc5780634fdd43cb14610507578063518302271461053057610225565b8063239c70ae146103c957806323b872dd146103f45780633cb519941461041d5780633ccfd60b1461044857806341f434341461045f57610225565b8063095ea7b3116101f8578063095ea7b3146102f857806313faede61461032157806316ba10e01461034c57806316c38b3c1461037557806318160ddd1461039e57610225565b806301ffc9a71461022a57806306fdde0314610267578063081812fc14610292578063088a4ed0146102cf575b600080fd5b34801561023657600080fd5b50610251600480360381019061024c9190612cf5565b6108b7565b60405161025e9190612d3d565b60405180910390f35b34801561027357600080fd5b5061027c610949565b6040516102899190612df1565b60405180910390f35b34801561029e57600080fd5b506102b960048036038101906102b49190612e49565b6109db565b6040516102c69190612eb7565b60405180910390f35b3480156102db57600080fd5b506102f660048036038101906102f19190612e49565b610a57565b005b34801561030457600080fd5b5061031f600480360381019061031a9190612efe565b610add565b005b34801561032d57600080fd5b50610336610af6565b6040516103439190612f4d565b60405180910390f35b34801561035857600080fd5b50610373600480360381019061036e919061309d565b610afc565b005b34801561038157600080fd5b5061039c60048036038101906103979190613112565b610b92565b005b3480156103aa57600080fd5b506103b3610c2b565b6040516103c09190612f4d565b60405180910390f35b3480156103d557600080fd5b506103de610c42565b6040516103eb9190612f4d565b60405180910390f35b34801561040057600080fd5b5061041b6004803603810190610416919061313f565b610c48565b005b34801561042957600080fd5b50610432610c97565b60405161043f9190612f4d565b60405180910390f35b34801561045457600080fd5b5061045d610c9d565b005b34801561046b57600080fd5b50610474610dee565b60405161048191906131f1565b60405180910390f35b34801561049657600080fd5b506104b160048036038101906104ac919061313f565b610e00565b005b3480156104bf57600080fd5b506104da60048036038101906104d59190612e49565b610e4f565b005b3480156104e857600080fd5b506104f1610ed5565b6040516104fe9190612f4d565b60405180910390f35b34801561051357600080fd5b5061052e6004803603810190610529919061309d565b610edb565b005b34801561053c57600080fd5b50610545610f71565b6040516105529190612d3d565b60405180910390f35b34801561056757600080fd5b50610570610f84565b60405161057d9190612df1565b60405180910390f35b34801561059257600080fd5b5061059b611012565b6040516105a89190612d3d565b60405180910390f35b3480156105bd57600080fd5b506105c6611025565b6040516105d39190612df1565b60405180910390f35b3480156105e857600080fd5b5061060360048036038101906105fe9190612e49565b6110b3565b6040516106109190612eb7565b60405180910390f35b34801561062557600080fd5b50610640600480360381019061063b919061320c565b6110c5565b60405161064d9190612f4d565b60405180910390f35b34801561066257600080fd5b5061066b61117d565b005b34801561067957600080fd5b50610694600480360381019061068f919061309d565b611205565b005b3480156106a257600080fd5b506106ab61129b565b6040516106b89190612eb7565b60405180910390f35b3480156106cd57600080fd5b506106d66112c5565b6040516106e39190612df1565b60405180910390f35b61070660048036038101906107019190612e49565b611357565b005b34801561071457600080fd5b5061072f600480360381019061072a9190613239565b611587565b005b34801561073d57600080fd5b506107466115a0565b6040516107539190612df1565b60405180910390f35b34801561076857600080fd5b50610783600480360381019061077e919061331a565b61162e565b005b34801561079157600080fd5b506107ac60048036038101906107a79190612e49565b61167f565b6040516107b99190612df1565b60405180910390f35b3480156107ce57600080fd5b506107e960048036038101906107e4919061320c565b6117d7565b6040516107f69190612f4d565b60405180910390f35b34801561080b57600080fd5b5061082660048036038101906108219190613112565b6117e9565b005b34801561083457600080fd5b5061084f600480360381019061084a919061339d565b611882565b60405161085c9190612d3d565b60405180910390f35b34801561087157600080fd5b5061088c600480360381019061088791906133dd565b611916565b005b34801561089a57600080fd5b506108b560048036038101906108b0919061320c565b6119f7565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061091257506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109425750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6060600280546109589061344c565b80601f01602080910402602001604051908101604052809291908181526020018280546109849061344c565b80156109d15780601f106109a6576101008083540402835291602001916109d1565b820191906000526020600020905b8154815290600101906020018083116109b457829003601f168201915b5050505050905090565b60006109e682611aee565b610a1c576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b610a5f611b4d565b73ffffffffffffffffffffffffffffffffffffffff16610a7d61129b565b73ffffffffffffffffffffffffffffffffffffffff1614610ad3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aca906134c9565b60405180910390fd5b8060108190555050565b81610ae781611b55565b610af18383611c52565b505050565b600d5481565b610b04611b4d565b73ffffffffffffffffffffffffffffffffffffffff16610b2261129b565b73ffffffffffffffffffffffffffffffffffffffff1614610b78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6f906134c9565b60405180910390fd5b80600b9080519060200190610b8e929190612be6565b5050565b610b9a611b4d565b73ffffffffffffffffffffffffffffffffffffffff16610bb861129b565b73ffffffffffffffffffffffffffffffffffffffff1614610c0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c05906134c9565b60405180910390fd5b80601160006101000a81548160ff02191690831515021790555050565b6000610c35611df8565b6001546000540303905090565b60105481565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610c8657610c8533611b55565b5b610c91848484611e01565b50505050565b600f5481565b610ca5611b4d565b73ffffffffffffffffffffffffffffffffffffffff16610cc361129b565b73ffffffffffffffffffffffffffffffffffffffff1614610d19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d10906134c9565b60405180910390fd5b600260095403610d5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5590613535565b60405180910390fd5b60026009819055506000610d7061129b565b73ffffffffffffffffffffffffffffffffffffffff1647604051610d9390613586565b60006040518083038185875af1925050503d8060008114610dd0576040519150601f19603f3d011682016040523d82523d6000602084013e610dd5565b606091505b5050905080610de357600080fd5b506001600981905550565b6daaeb6d7670e522a718067333cd4e81565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610e3e57610e3d33611b55565b5b610e49848484611e11565b50505050565b610e57611b4d565b73ffffffffffffffffffffffffffffffffffffffff16610e7561129b565b73ffffffffffffffffffffffffffffffffffffffff1614610ecb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec2906134c9565b60405180910390fd5b80600d8190555050565b600e5481565b610ee3611b4d565b73ffffffffffffffffffffffffffffffffffffffff16610f0161129b565b73ffffffffffffffffffffffffffffffffffffffff1614610f57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4e906134c9565b60405180910390fd5b80600c9080519060200190610f6d929190612be6565b5050565b601160019054906101000a900460ff1681565b600b8054610f919061344c565b80601f0160208091040260200160405190810160405280929190818152602001828054610fbd9061344c565b801561100a5780601f10610fdf5761010080835404028352916020019161100a565b820191906000526020600020905b815481529060010190602001808311610fed57829003601f168201915b505050505081565b601160009054906101000a900460ff1681565b600a80546110329061344c565b80601f016020809104026020016040519081016040528092919081815260200182805461105e9061344c565b80156110ab5780601f10611080576101008083540402835291602001916110ab565b820191906000526020600020905b81548152906001019060200180831161108e57829003601f168201915b505050505081565b60006110be82611e31565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361112c576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611185611b4d565b73ffffffffffffffffffffffffffffffffffffffff166111a361129b565b73ffffffffffffffffffffffffffffffffffffffff16146111f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f0906134c9565b60405180910390fd5b6112036000611efd565b565b61120d611b4d565b73ffffffffffffffffffffffffffffffffffffffff1661122b61129b565b73ffffffffffffffffffffffffffffffffffffffff1614611281576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611278906134c9565b60405180910390fd5b80600a9080519060200190611297929190612be6565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600380546112d49061344c565b80601f01602080910402602001604051908101604052809291908181526020018280546113009061344c565b801561134d5780601f106113225761010080835404028352916020019161134d565b820191906000526020600020905b81548152906001019060200180831161133057829003601f168201915b5050505050905090565b80601160009054906101000a900460ff16156113a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139f906135e7565b60405180910390fd5b6000811180156113ba5750600f548111155b6113f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f090613679565b60405180910390fd5b600e5481611405610c2b565b61140f91906136c8565b1115611450576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114479061376a565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146114be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b5906137d6565b60405180910390fd5b6000811180156114e35750601054816114d6336117d7565b6114e091906136c8565b11155b611522576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151990613868565b60405180910390fd5b80600d546115309190613888565b341015611572576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115699061392e565b60405180910390fd5b61158361157d611b4d565b83611fc3565b5050565b8161159181611b55565b61159b8383611fe1565b505050565b600c80546115ad9061344c565b80601f01602080910402602001604051908101604052809291908181526020018280546115d99061344c565b80156116265780601f106115fb57610100808354040283529160200191611626565b820191906000526020600020905b81548152906001019060200180831161160957829003601f168201915b505050505081565b833373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461166c5761166b33611b55565b5b61167885858585612158565b5050505050565b606061168a82611aee565b6116c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c0906139c0565b60405180910390fd5b60001515601160019054906101000a900460ff1615150361177657600c80546116f19061344c565b80601f016020809104026020016040519081016040528092919081815260200182805461171d9061344c565b801561176a5780601f1061173f5761010080835404028352916020019161176a565b820191906000526020600020905b81548152906001019060200180831161174d57829003601f168201915b505050505090506117d2565b60006117806121cb565b905060008151116117a057604051806020016040528060008152506117ce565b806117aa8461225d565b600b6040516020016117be93929190613ab0565b6040516020818303038152906040525b9150505b919050565b60006117e2826123bd565b9050919050565b6117f1611b4d565b73ffffffffffffffffffffffffffffffffffffffff1661180f61129b565b73ffffffffffffffffffffffffffffffffffffffff1614611865576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185c906134c9565b60405180910390fd5b80601160016101000a81548160ff02191690831515021790555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61191e611b4d565b73ffffffffffffffffffffffffffffffffffffffff1661193c61129b565b73ffffffffffffffffffffffffffffffffffffffff1614611992576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611989906134c9565b60405180910390fd5b600e548261199e610c2b565b6119a891906136c8565b11156119e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e090613b2d565b60405180910390fd5b6119f38183611fc3565b5050565b6119ff611b4d565b73ffffffffffffffffffffffffffffffffffffffff16611a1d61129b565b73ffffffffffffffffffffffffffffffffffffffff1614611a73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6a906134c9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611ae2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad990613bbf565b60405180910390fd5b611aeb81611efd565b50565b600081611af9611df8565b11158015611b08575060005482105b8015611b46575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611c4f576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401611bcc929190613bdf565b602060405180830381865afa158015611be9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c0d9190613c1d565b611c4e57806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611c459190612eb7565b60405180910390fd5b5b50565b6000611c5d82611e31565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611cc4576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16611ce3612414565b73ffffffffffffffffffffffffffffffffffffffff1614611d4657611d0f81611d0a612414565b611882565b611d45576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b611e0c83838361241c565b505050565b611e2c8383836040518060200160405280600081525061162e565b505050565b60008082905080611e40611df8565b11611ec657600054811015611ec55760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603611ec3575b60008103611eb9576004600083600190039350838152602001908152602001600020549050611e8f565b8092505050611ef8565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611fdd8282604051806020016040528060008152506127c3565b5050565b611fe9612414565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361204d576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806007600061205a612414565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16612107612414565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161214c9190612d3d565b60405180910390a35050565b61216384848461241c565b60008373ffffffffffffffffffffffffffffffffffffffff163b146121c55761218e84848484612a76565b6121c4576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6060600a80546121da9061344c565b80601f01602080910402602001604051908101604052809291908181526020018280546122069061344c565b80156122535780601f1061222857610100808354040283529160200191612253565b820191906000526020600020905b81548152906001019060200180831161223657829003601f168201915b5050505050905090565b6060600082036122a4576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506123b8565b600082905060005b600082146122d65780806122bf90613c4a565b915050600a826122cf9190613cc1565b91506122ac565b60008167ffffffffffffffff8111156122f2576122f1612f72565b5b6040519080825280601f01601f1916602001820160405280156123245781602001600182028036833780820191505090505b5090505b600085146123b15760018261233d9190613cf2565b9150600a8561234c9190613d26565b603061235891906136c8565b60f81b81838151811061236e5761236d613d57565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856123aa9190613cc1565b9450612328565b8093505050505b919050565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b600033905090565b600061242782611e31565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461248e576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166124af612414565b73ffffffffffffffffffffffffffffffffffffffff1614806124de57506124dd856124d8612414565b611882565b5b8061252357506124ec612414565b73ffffffffffffffffffffffffffffffffffffffff1661250b846109db565b73ffffffffffffffffffffffffffffffffffffffff16145b90508061255c576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036125c2576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6125cf8585856001612bc6565b6006600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b6126cc86612bcc565b1717600460008581526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008316036127545760006001840190506000600460008381526020019081526020016000205403612752576000548114612751578260046000838152602001908152602001600020819055505b5b505b828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46127bc8585856001612bd6565b5050505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361282f576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008303612869576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6128766000858386612bc6565b600160406001901b178302600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e16128db60018514612bdc565b901b60a042901b6128eb86612bcc565b1717600460008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b146129ef575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461299f6000878480600101955087612a76565b6129d5576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082106129305782600054146129ea57600080fd5b612a5a565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082106129f0575b816000819055505050612a706000858386612bd6565b50505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612a9c612414565b8786866040518563ffffffff1660e01b8152600401612abe9493929190613ddb565b6020604051808303816000875af1925050508015612afa57506040513d601f19601f82011682018060405250810190612af79190613e3c565b60015b612b73573d8060008114612b2a576040519150601f19603f3d011682016040523d82523d6000602084013e612b2f565b606091505b506000815103612b6b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b50505050565b6000819050919050565b50505050565b6000819050919050565b828054612bf29061344c565b90600052602060002090601f016020900481019282612c145760008555612c5b565b82601f10612c2d57805160ff1916838001178555612c5b565b82800160010185558215612c5b579182015b82811115612c5a578251825591602001919060010190612c3f565b5b509050612c689190612c6c565b5090565b5b80821115612c85576000816000905550600101612c6d565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612cd281612c9d565b8114612cdd57600080fd5b50565b600081359050612cef81612cc9565b92915050565b600060208284031215612d0b57612d0a612c93565b5b6000612d1984828501612ce0565b91505092915050565b60008115159050919050565b612d3781612d22565b82525050565b6000602082019050612d526000830184612d2e565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612d92578082015181840152602081019050612d77565b83811115612da1576000848401525b50505050565b6000601f19601f8301169050919050565b6000612dc382612d58565b612dcd8185612d63565b9350612ddd818560208601612d74565b612de681612da7565b840191505092915050565b60006020820190508181036000830152612e0b8184612db8565b905092915050565b6000819050919050565b612e2681612e13565b8114612e3157600080fd5b50565b600081359050612e4381612e1d565b92915050565b600060208284031215612e5f57612e5e612c93565b5b6000612e6d84828501612e34565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612ea182612e76565b9050919050565b612eb181612e96565b82525050565b6000602082019050612ecc6000830184612ea8565b92915050565b612edb81612e96565b8114612ee657600080fd5b50565b600081359050612ef881612ed2565b92915050565b60008060408385031215612f1557612f14612c93565b5b6000612f2385828601612ee9565b9250506020612f3485828601612e34565b9150509250929050565b612f4781612e13565b82525050565b6000602082019050612f626000830184612f3e565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612faa82612da7565b810181811067ffffffffffffffff82111715612fc957612fc8612f72565b5b80604052505050565b6000612fdc612c89565b9050612fe88282612fa1565b919050565b600067ffffffffffffffff82111561300857613007612f72565b5b61301182612da7565b9050602081019050919050565b82818337600083830152505050565b600061304061303b84612fed565b612fd2565b90508281526020810184848401111561305c5761305b612f6d565b5b61306784828561301e565b509392505050565b600082601f83011261308457613083612f68565b5b813561309484826020860161302d565b91505092915050565b6000602082840312156130b3576130b2612c93565b5b600082013567ffffffffffffffff8111156130d1576130d0612c98565b5b6130dd8482850161306f565b91505092915050565b6130ef81612d22565b81146130fa57600080fd5b50565b60008135905061310c816130e6565b92915050565b60006020828403121561312857613127612c93565b5b6000613136848285016130fd565b91505092915050565b60008060006060848603121561315857613157612c93565b5b600061316686828701612ee9565b935050602061317786828701612ee9565b925050604061318886828701612e34565b9150509250925092565b6000819050919050565b60006131b76131b26131ad84612e76565b613192565b612e76565b9050919050565b60006131c98261319c565b9050919050565b60006131db826131be565b9050919050565b6131eb816131d0565b82525050565b600060208201905061320660008301846131e2565b92915050565b60006020828403121561322257613221612c93565b5b600061323084828501612ee9565b91505092915050565b600080604083850312156132505761324f612c93565b5b600061325e85828601612ee9565b925050602061326f858286016130fd565b9150509250929050565b600067ffffffffffffffff82111561329457613293612f72565b5b61329d82612da7565b9050602081019050919050565b60006132bd6132b884613279565b612fd2565b9050828152602081018484840111156132d9576132d8612f6d565b5b6132e484828561301e565b509392505050565b600082601f83011261330157613300612f68565b5b81356133118482602086016132aa565b91505092915050565b6000806000806080858703121561333457613333612c93565b5b600061334287828801612ee9565b945050602061335387828801612ee9565b935050604061336487828801612e34565b925050606085013567ffffffffffffffff81111561338557613384612c98565b5b613391878288016132ec565b91505092959194509250565b600080604083850312156133b4576133b3612c93565b5b60006133c285828601612ee9565b92505060206133d385828601612ee9565b9150509250929050565b600080604083850312156133f4576133f3612c93565b5b600061340285828601612e34565b925050602061341385828601612ee9565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061346457607f821691505b6020821081036134775761347661341d565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006134b3602083612d63565b91506134be8261347d565b602082019050919050565b600060208201905081810360008301526134e2816134a6565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b600061351f601f83612d63565b915061352a826134e9565b602082019050919050565b6000602082019050818103600083015261354e81613512565b9050919050565b600081905092915050565b50565b6000613570600083613555565b915061357b82613560565b600082019050919050565b600061359182613563565b9150819050919050565b7f4d696e74696e6720686173206e6f742073746172746564207965742e00000000600082015250565b60006135d1601c83612d63565b91506135dc8261359b565b602082019050919050565b60006020820190508181036000830152613600816135c4565b9050919050565b7f596f752063616e206f6e6c79206d696e74203520666f7865732070657220747260008201527f616e73616374696f6e2e00000000000000000000000000000000000000000000602082015250565b6000613663602a83612d63565b915061366e82613607565b604082019050919050565b6000602082019050818103600083015261369281613656565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006136d382612e13565b91506136de83612e13565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561371357613712613699565b5b828201905092915050565b7f546865726520617265206e6f20666f786573206c656674732100000000000000600082015250565b6000613754601983612d63565b915061375f8261371e565b602082019050919050565b6000602082019050818103600083015261378381613747565b9050919050565b7f4e6f206d696e74696e67207769746820736d61727420636f6e74726163742e00600082015250565b60006137c0601f83612d63565b91506137cb8261378a565b602082019050919050565b600060208201905081810360008301526137ef816137b3565b9050919050565b7f596f752068617665206d696e74656420746865206d6178206e756d626572206f60008201527f6620666f78657321000000000000000000000000000000000000000000000000602082015250565b6000613852602883612d63565b915061385d826137f6565b604082019050919050565b6000602082019050818103600083015261388181613845565b9050919050565b600061389382612e13565b915061389e83612e13565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156138d7576138d6613699565b5b828202905092915050565b7f496e73756666696369656e74206f7220696e636f72726563742066756e64732e600082015250565b6000613918602083612d63565b9150613923826138e2565b602082019050919050565b600060208201905081810360008301526139478161390b565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006139aa602f83612d63565b91506139b58261394e565b604082019050919050565b600060208201905081810360008301526139d98161399d565b9050919050565b600081905092915050565b60006139f682612d58565b613a0081856139e0565b9350613a10818560208601612d74565b80840191505092915050565b60008190508160005260206000209050919050565b60008154613a3e8161344c565b613a4881866139e0565b94506001821660008114613a635760018114613a7457613aa7565b60ff19831686528186019350613aa7565b613a7d85613a1c565b60005b83811015613a9f57815481890152600182019150602081019050613a80565b838801955050505b50505092915050565b6000613abc82866139eb565b9150613ac882856139eb565b9150613ad48284613a31565b9150819050949350505050565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b6000613b17601483612d63565b9150613b2282613ae1565b602082019050919050565b60006020820190508181036000830152613b4681613b0a565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613ba9602683612d63565b9150613bb482613b4d565b604082019050919050565b60006020820190508181036000830152613bd881613b9c565b9050919050565b6000604082019050613bf46000830185612ea8565b613c016020830184612ea8565b9392505050565b600081519050613c17816130e6565b92915050565b600060208284031215613c3357613c32612c93565b5b6000613c4184828501613c08565b91505092915050565b6000613c5582612e13565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613c8757613c86613699565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613ccc82612e13565b9150613cd783612e13565b925082613ce757613ce6613c92565b5b828204905092915050565b6000613cfd82612e13565b9150613d0883612e13565b925082821015613d1b57613d1a613699565b5b828203905092915050565b6000613d3182612e13565b9150613d3c83612e13565b925082613d4c57613d4b613c92565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b600082825260208201905092915050565b6000613dad82613d86565b613db78185613d91565b9350613dc7818560208601612d74565b613dd081612da7565b840191505092915050565b6000608082019050613df06000830187612ea8565b613dfd6020830186612ea8565b613e0a6040830185612f3e565b8181036060830152613e1c8184613da2565b905095945050505050565b600081519050613e3681612cc9565b92915050565b600060208284031215613e5257613e51612c93565b5b6000613e6084828501613e27565b9150509291505056fea2646970667358221220ac9ada43f61ebea56bcf975c0e0d4d5de69acf6478e951312822316d9f4daf3f64736f6c634300080d0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000a466f782046616d696c79000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009464f5846414d494c590000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _tokenName (string): Fox Family
Arg [1] : _tokenSymbol (string): FOXFAMILY
-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [2] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [3] : 466f782046616d696c7900000000000000000000000000000000000000000000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000009
Arg [5] : 464f5846414d494c590000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
51213:4177:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17818:615;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22831:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24907:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53961:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54658:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51433:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53772:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53878:77;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;16872:315;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51538:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54819:161;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51505:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54077:172;;;;;;;;;;;;;:::i;:::-;;2827:143;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54986:169;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53360:74;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51471:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53528:132;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51607:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51357:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51577:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51324:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22620:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18497:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50361:103;;;;;;;;;;;;;:::i;:::-;;53666:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49710:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23000:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52462:127;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54478:174;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51395:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55161:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52909:445;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54255:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53440:81;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25562:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52597:205;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50619:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17818:615;17903:4;18218:10;18203:25;;:11;:25;;;;:102;;;;18295:10;18280:25;;:11;:25;;;;18203:102;:179;;;;18372:10;18357:25;;:11;:25;;;;18203:179;18183:199;;17818:615;;;:::o;22831:100::-;22885:13;22918:5;22911:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22831:100;:::o;24907:204::-;24975:7;25000:16;25008:7;25000;:16::i;:::-;24995:64;;25025:34;;;;;;;;;;;;;;24995:64;25079:15;:24;25095:7;25079:24;;;;;;;;;;;;;;;;;;;;;25072:31;;24907:204;;;:::o;53961:110::-;49941:12;:10;:12::i;:::-;49930:23;;:7;:5;:7::i;:::-;:23;;;49922:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54051:14:::1;54035:13;:30;;;;53961:110:::0;:::o;54658:155::-;54754:8;4348:30;4369:8;4348:20;:30::i;:::-;54775:32:::1;54789:8;54799:7;54775:13;:32::i;:::-;54658:155:::0;;;:::o;51433:33::-;;;;:::o;53772:100::-;49941:12;:10;:12::i;:::-;49930:23;;:7;:5;:7::i;:::-;:23;;;49922:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53856:10:::1;53844:9;:22;;;;;;;;;;;;:::i;:::-;;53772:100:::0;:::o;53878:77::-;49941:12;:10;:12::i;:::-;49930:23;;:7;:5;:7::i;:::-;:23;;;49922:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53943:6:::1;53934;;:15;;;;;;;;;;;;;;;;;;53878:77:::0;:::o;16872:315::-;16925:7;17153:15;:13;:15::i;:::-;17138:12;;17122:13;;:28;:46;17115:53;;16872:315;:::o;51538:32::-;;;;:::o;54819:161::-;54920:4;4176:10;4168:18;;:4;:18;;;4164:83;;4203:32;4224:10;4203:20;:32::i;:::-;4164:83;54937:37:::1;54956:4;54962:2;54966:7;54937:18;:37::i;:::-;54819:161:::0;;;;:::o;51505:28::-;;;;:::o;54077:172::-;49941:12;:10;:12::i;:::-;49930:23;;:7;:5;:7::i;:::-;:23;;;49922:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46917:1:::1;47515:7;;:19:::0;47507:63:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;46917:1;47648:7;:18;;;;54135::::2;54167:7;:5;:7::i;:::-;54159:21;;54188;54159:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54134:80;;;54229:13;54221:22;;;::::0;::::2;;54127:122;46873:1:::1;47827:7;:22;;;;54077:172::o:0;2827:143::-;2927:42;2827:143;:::o;54986:169::-;55091:4;4176:10;4168:18;;:4;:18;;;4164:83;;4203:32;4224:10;4203:20;:32::i;:::-;4164:83;55108:41:::1;55131:4;55137:2;55141:7;55108:22;:41::i;:::-;54986:169:::0;;;;:::o;53360:74::-;49941:12;:10;:12::i;:::-;49930:23;;:7;:5;:7::i;:::-;:23;;;49922:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53423:5:::1;53416:4;:12;;;;53360:74:::0;:::o;51471:29::-;;;;:::o;53528:132::-;49941:12;:10;:12::i;:::-;49930:23;;:7;:5;:7::i;:::-;:23;;;49922:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53636:18:::1;53616:17;:38;;;;;;;;;;;;:::i;:::-;;53528:132:::0;:::o;51607:27::-;;;;;;;;;;;;;:::o;51357:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;51577:25::-;;;;;;;;;;;;;:::o;51324:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;22620:144::-;22684:7;22727:27;22746:7;22727:18;:27::i;:::-;22704:52;;22620:144;;;:::o;18497:224::-;18561:7;18602:1;18585:19;;:5;:19;;;18581:60;;18613:28;;;;;;;;;;;;;;18581:60;13836:13;18659:18;:25;18678:5;18659:25;;;;;;;;;;;;;;;;:54;18652:61;;18497:224;;;:::o;50361:103::-;49941:12;:10;:12::i;:::-;49930:23;;:7;:5;:7::i;:::-;:23;;;49922:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50426:30:::1;50453:1;50426:18;:30::i;:::-;50361:103::o:0;53666:100::-;49941:12;:10;:12::i;:::-;49930:23;;:7;:5;:7::i;:::-;:23;;;49922:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53750:10:::1;53738:9;:22;;;;;;;;;;;;:::i;:::-;;53666:100:::0;:::o;49710:87::-;49756:7;49783:6;;;;;;;;;;;49776:13;;49710:87;:::o;23000:104::-;23056:13;23089:7;23082:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23000:104;:::o;52462:127::-;52527:11;51902:6;;;;;;;;;;;51901:7;51893:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;51970:1;51956:11;:15;:43;;;;;51990:9;;51975:11;:24;;51956:43;51948:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;52092:7;;52077:11;52061:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:38;;52053:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;52157:10;52144:23;;:9;:23;;;52136:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;52240:1;52226:11;:15;:74;;;;;52287:13;;52272:11;52245:24;52258:10;52245:12;:24::i;:::-;:38;;;;:::i;:::-;:55;;52226:74;52210:149;;;;;;;;;;;;:::i;:::-;;;;;;;;;52394:11;52387:4;;:18;;;;:::i;:::-;52374:9;:31;;52366:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;52547:36:::1;52557:12;:10;:12::i;:::-;52571:11;52547:9;:36::i;:::-;52462:127:::0;;:::o;54478:174::-;54582:8;4348:30;4369:8;4348:20;:30::i;:::-;54603:43:::1;54627:8;54637;54603:23;:43::i;:::-;54478:174:::0;;;:::o;51395:31::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;55161:224::-;55312:4;4176:10;4168:18;;:4;:18;;;4164:83;;4203:32;4224:10;4203:20;:32::i;:::-;4164:83;55332:47:::1;55355:4;55361:2;55365:7;55374:4;55332:22;:47::i;:::-;55161:224:::0;;;;;:::o;52909:445::-;52983:13;53013:17;53021:8;53013:7;:17::i;:::-;53005:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;53107:5;53095:17;;:8;;;;;;;;;;;:17;;;53091:64;;53130:17;53123:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53091:64;53163:28;53194:10;:8;:10::i;:::-;53163:41;;53249:1;53224:14;53218:28;:32;:130;;;;;;;;;;;;;;;;;53286:14;53302:19;:8;:17;:19::i;:::-;53323:9;53269:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;53218:130;53211:137;;;52909:445;;;;:::o;54255:107::-;54313:7;54336:20;54350:5;54336:13;:20::i;:::-;54329:27;;54255:107;;;:::o;53440:81::-;49941:12;:10;:12::i;:::-;49930:23;;:7;:5;:7::i;:::-;:23;;;49922:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53509:6:::1;53498:8;;:17;;;;;;;;;;;;;;;;;;53440:81:::0;:::o;25562:164::-;25659:4;25683:18;:25;25702:5;25683:25;;;;;;;;;;;;;;;:35;25709:8;25683:35;;;;;;;;;;;;;;;;;;;;;;;;;25676:42;;25562:164;;;;:::o;52597:205::-;49941:12;:10;:12::i;:::-;49930:23;;:7;:5;:7::i;:::-;:23;;;49922:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52724:7:::1;;52709:11;52693:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:38;;52685:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;52763:33;52773:9;52784:11;52763:9;:33::i;:::-;52597:205:::0;;:::o;50619:201::-;49941:12;:10;:12::i;:::-;49930:23;;:7;:5;:7::i;:::-;:23;;;49922:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50728:1:::1;50708:22;;:8;:22;;::::0;50700:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;50784:28;50803:8;50784:18;:28::i;:::-;50619:201:::0;:::o;26941:273::-;26998:4;27054:7;27035:15;:13;:15::i;:::-;:26;;:66;;;;;27088:13;;27078:7;:23;27035:66;:152;;;;;27186:1;14606:8;27139:17;:26;27157:7;27139:26;;;;;;;;;;;;:43;:48;27035:152;27015:172;;26941:273;;;:::o;48489:98::-;48542:7;48569:10;48562:17;;48489:98;:::o;4406:419::-;4645:1;2927:42;4597:45;;;:49;4593:225;;;2927:42;4668;;;4719:4;4726:8;4668:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4663:144;;4782:8;4763:28;;;;;;;;;;;:::i;:::-;;;;;;;;4663:144;4593:225;4406:419;:::o;24359:482::-;24440:13;24472:27;24491:7;24472:18;:27::i;:::-;24440:61;;24522:5;24516:11;;:2;:11;;;24512:48;;24536:24;;;;;;;;;;;;;;24512:48;24600:5;24577:28;;:19;:17;:19::i;:::-;:28;;;24573:175;;24625:44;24642:5;24649:19;:17;:19::i;:::-;24625:16;:44::i;:::-;24620:128;;24697:35;;;;;;;;;;;;;;24620:128;24573:175;24787:2;24760:15;:24;24776:7;24760:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;24825:7;24821:2;24805:28;;24814:5;24805:28;;;;;;;;;;;;24429:412;24359:482;;:::o;52808:95::-;52873:7;52896:1;52889:8;;52808:95;:::o;25793:170::-;25927:28;25937:4;25943:2;25947:7;25927:9;:28::i;:::-;25793:170;;;:::o;26034:185::-;26172:39;26189:4;26195:2;26199:7;26172:39;;;;;;;;;;;;:16;:39::i;:::-;26034:185;;;:::o;20135:1129::-;20202:7;20222:12;20237:7;20222:22;;20305:4;20286:15;:13;:15::i;:::-;:23;20282:915;;20339:13;;20332:4;:20;20328:869;;;20377:14;20394:17;:23;20412:4;20394:23;;;;;;;;;;;;20377:40;;20510:1;14606:8;20483:6;:23;:28;20479:699;;21002:113;21019:1;21009:6;:11;21002:113;;21062:17;:25;21080:6;;;;;;;21062:25;;;;;;;;;;;;21053:34;;21002:113;;;21148:6;21141:13;;;;;;20479:699;20354:843;20328:869;20282:915;21225:31;;;;;;;;;;;;;;20135:1129;;;;:::o;50980:191::-;51054:16;51073:6;;;;;;;;;;;51054:25;;51099:8;51090:6;;:17;;;;;;;;;;;;;;;;;;51154:8;51123:40;;51144:8;51123:40;;;;;;;;;;;;51043:128;50980:191;:::o;27298:104::-;27367:27;27377:2;27381:8;27367:27;;;;;;;;;;;;:9;:27::i;:::-;27298:104;;:::o;25183:308::-;25294:19;:17;:19::i;:::-;25282:31;;:8;:31;;;25278:61;;25322:17;;;;;;;;;;;;;;25278:61;25404:8;25352:18;:39;25371:19;:17;:19::i;:::-;25352:39;;;;;;;;;;;;;;;:49;25392:8;25352:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;25464:8;25428:55;;25443:19;:17;:19::i;:::-;25428:55;;;25474:8;25428:55;;;;;;:::i;:::-;;;;;;;;25183:308;;:::o;26290:396::-;26457:28;26467:4;26473:2;26477:7;26457:9;:28::i;:::-;26518:1;26500:2;:14;;;:19;26496:183;;26539:56;26570:4;26576:2;26580:7;26589:5;26539:30;:56::i;:::-;26534:145;;26623:40;;;;;;;;;;;;;;26534:145;26496:183;26290:396;;;;:::o;54368:104::-;54428:13;54457:9;54450:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54368:104;:::o;43411:723::-;43467:13;43697:1;43688:5;:10;43684:53;;43715:10;;;;;;;;;;;;;;;;;;;;;43684:53;43747:12;43762:5;43747:20;;43778:14;43803:78;43818:1;43810:4;:9;43803:78;;43836:8;;;;;:::i;:::-;;;;43867:2;43859:10;;;;;:::i;:::-;;;43803:78;;;43891:19;43923:6;43913:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43891:39;;43941:154;43957:1;43948:5;:10;43941:154;;43985:1;43975:11;;;;;:::i;:::-;;;44052:2;44044:5;:10;;;;:::i;:::-;44031:2;:24;;;;:::i;:::-;44018:39;;44001:6;44008;44001:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;44081:2;44072:11;;;;;:::i;:::-;;;43941:154;;;44119:6;44105:21;;;;;43411:723;;;;:::o;18803:176::-;18864:7;13836:13;13973:2;18892:18;:25;18911:5;18892:25;;;;;;;;;;;;;;;;:49;;18891:80;18884:87;;18803:176;;;:::o;40923:105::-;40983:7;41010:10;41003:17;;40923:105;:::o;32180:2515::-;32295:27;32325;32344:7;32325:18;:27::i;:::-;32295:57;;32410:4;32369:45;;32385:19;32369:45;;;32365:86;;32423:28;;;;;;;;;;;;;;32365:86;32464:22;32513:4;32490:27;;:19;:17;:19::i;:::-;:27;;;:87;;;;32534:43;32551:4;32557:19;:17;:19::i;:::-;32534:16;:43::i;:::-;32490:87;:147;;;;32618:19;:17;:19::i;:::-;32594:43;;:20;32606:7;32594:11;:20::i;:::-;:43;;;32490:147;32464:174;;32656:17;32651:66;;32682:35;;;;;;;;;;;;;;32651:66;32746:1;32732:16;;:2;:16;;;32728:52;;32757:23;;;;;;;;;;;;;;32728:52;32793:43;32815:4;32821:2;32825:7;32834:1;32793:21;:43::i;:::-;32909:15;:24;32925:7;32909:24;;;;;;;;;;;;32902:31;;;;;;;;;;;33301:18;:24;33320:4;33301:24;;;;;;;;;;;;;;;;33299:26;;;;;;;;;;;;33370:18;:22;33389:2;33370:22;;;;;;;;;;;;;;;;33368:24;;;;;;;;;;;14888:8;14490:3;33751:15;:41;;33709:21;33727:2;33709:17;:21::i;:::-;:84;:128;33663:17;:26;33681:7;33663:26;;;;;;;;;;;:174;;;;34007:1;14888:8;33957:19;:46;:51;33953:626;;34029:19;34061:1;34051:7;:11;34029:33;;34218:1;34184:17;:30;34202:11;34184:30;;;;;;;;;;;;:35;34180:384;;34322:13;;34307:11;:28;34303:242;;34502:19;34469:17;:30;34487:11;34469:30;;;;;;;;;;;:52;;;;34303:242;34180:384;34010:569;33953:626;34626:7;34622:2;34607:27;;34616:4;34607:27;;;;;;;;;;;;34645:42;34666:4;34672:2;34676:7;34685:1;34645:20;:42::i;:::-;32284:2411;;32180:2515;;;:::o;27775:2236::-;27898:20;27921:13;;27898:36;;27963:1;27949:16;;:2;:16;;;27945:48;;27974:19;;;;;;;;;;;;;;27945:48;28020:1;28008:8;:13;28004:44;;28030:18;;;;;;;;;;;;;;28004:44;28061:61;28091:1;28095:2;28099:12;28113:8;28061:21;:61::i;:::-;28665:1;13973:2;28636:1;:25;;28635:31;28623:8;:44;28597:18;:22;28616:2;28597:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;14753:3;29066:29;29093:1;29081:8;:13;29066:14;:29::i;:::-;:56;;14490:3;29003:15;:41;;28961:21;28979:2;28961:17;:21::i;:::-;:84;:162;28910:17;:31;28928:12;28910:31;;;;;;;;;;;:213;;;;29140:20;29163:12;29140:35;;29190:11;29219:8;29204:12;:23;29190:37;;29266:1;29248:2;:14;;;:19;29244:635;;29288:313;29344:12;29340:2;29319:38;;29336:1;29319:38;;;;;;;;;;;;29385:69;29424:1;29428:2;29432:14;;;;;;29448:5;29385:30;:69::i;:::-;29380:174;;29490:40;;;;;;;;;;;;;;29380:174;29596:3;29581:12;:18;29288:313;;29682:12;29665:13;;:29;29661:43;;29696:8;;;29661:43;29244:635;;;29745:119;29801:14;;;;;;29797:2;29776:40;;29793:1;29776:40;;;;;;;;;;;;29859:3;29844:12;:18;29745:119;;29244:635;29909:12;29893:13;:28;;;;28374:1559;;29943:60;29972:1;29976:2;29980:12;29994:8;29943:20;:60::i;:::-;27887:2124;27775:2236;;;:::o;38392:716::-;38555:4;38601:2;38576:45;;;38622:19;:17;:19::i;:::-;38643:4;38649:7;38658:5;38576:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;38572:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38876:1;38859:6;:13;:18;38855:235;;38905:40;;;;;;;;;;;;;;38855:235;39048:6;39042:13;39033:6;39029:2;39025:15;39018:38;38572:529;38745:54;;;38735:64;;;:6;:64;;;;38728:71;;;38392:716;;;;;;:::o;39756:159::-;;;;;:::o;23920:148::-;23984:14;24045:5;24035:15;;23920:148;;;:::o;40574:158::-;;;;;:::o;24155:142::-;24213:14;24274:5;24264:15;;24155:142;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:117::-;5399:1;5396;5389:12;5413:117;5522:1;5519;5512:12;5536:180;5584:77;5581:1;5574:88;5681:4;5678:1;5671:15;5705:4;5702:1;5695:15;5722:281;5805:27;5827:4;5805:27;:::i;:::-;5797:6;5793:40;5935:6;5923:10;5920:22;5899:18;5887:10;5884:34;5881:62;5878:88;;;5946:18;;:::i;:::-;5878:88;5986:10;5982:2;5975:22;5765:238;5722:281;;:::o;6009:129::-;6043:6;6070:20;;:::i;:::-;6060:30;;6099:33;6127:4;6119:6;6099:33;:::i;:::-;6009:129;;;:::o;6144:308::-;6206:4;6296:18;6288:6;6285:30;6282:56;;;6318:18;;:::i;:::-;6282:56;6356:29;6378:6;6356:29;:::i;:::-;6348:37;;6440:4;6434;6430:15;6422:23;;6144:308;;;:::o;6458:154::-;6542:6;6537:3;6532;6519:30;6604:1;6595:6;6590:3;6586:16;6579:27;6458:154;;;:::o;6618:412::-;6696:5;6721:66;6737:49;6779:6;6737:49;:::i;:::-;6721:66;:::i;:::-;6712:75;;6810:6;6803:5;6796:21;6848:4;6841:5;6837:16;6886:3;6877:6;6872:3;6868:16;6865:25;6862:112;;;6893:79;;:::i;:::-;6862:112;6983:41;7017:6;7012:3;7007;6983:41;:::i;:::-;6702:328;6618:412;;;;;:::o;7050:340::-;7106:5;7155:3;7148:4;7140:6;7136:17;7132:27;7122:122;;7163:79;;:::i;:::-;7122:122;7280:6;7267:20;7305:79;7380:3;7372:6;7365:4;7357:6;7353:17;7305:79;:::i;:::-;7296:88;;7112:278;7050:340;;;;:::o;7396:509::-;7465:6;7514:2;7502:9;7493:7;7489:23;7485:32;7482:119;;;7520:79;;:::i;:::-;7482:119;7668:1;7657:9;7653:17;7640:31;7698:18;7690:6;7687:30;7684:117;;;7720:79;;:::i;:::-;7684:117;7825:63;7880:7;7871:6;7860:9;7856:22;7825:63;:::i;:::-;7815:73;;7611:287;7396:509;;;;:::o;7911:116::-;7981:21;7996:5;7981:21;:::i;:::-;7974:5;7971:32;7961:60;;8017:1;8014;8007:12;7961:60;7911:116;:::o;8033:133::-;8076:5;8114:6;8101:20;8092:29;;8130:30;8154:5;8130:30;:::i;:::-;8033:133;;;;:::o;8172:323::-;8228:6;8277:2;8265:9;8256:7;8252:23;8248:32;8245:119;;;8283:79;;:::i;:::-;8245:119;8403:1;8428:50;8470:7;8461:6;8450:9;8446:22;8428:50;:::i;:::-;8418:60;;8374:114;8172:323;;;;:::o;8501:619::-;8578:6;8586;8594;8643:2;8631:9;8622:7;8618:23;8614:32;8611:119;;;8649:79;;:::i;:::-;8611:119;8769:1;8794:53;8839:7;8830:6;8819:9;8815:22;8794:53;:::i;:::-;8784:63;;8740:117;8896:2;8922:53;8967:7;8958:6;8947:9;8943:22;8922:53;:::i;:::-;8912:63;;8867:118;9024:2;9050:53;9095:7;9086:6;9075:9;9071:22;9050:53;:::i;:::-;9040:63;;8995:118;8501:619;;;;;:::o;9126:60::-;9154:3;9175:5;9168:12;;9126:60;;;:::o;9192:142::-;9242:9;9275:53;9293:34;9302:24;9320:5;9302:24;:::i;:::-;9293:34;:::i;:::-;9275:53;:::i;:::-;9262:66;;9192:142;;;:::o;9340:126::-;9390:9;9423:37;9454:5;9423:37;:::i;:::-;9410:50;;9340:126;;;:::o;9472:157::-;9553:9;9586:37;9617:5;9586:37;:::i;:::-;9573:50;;9472:157;;;:::o;9635:193::-;9753:68;9815:5;9753:68;:::i;:::-;9748:3;9741:81;9635:193;;:::o;9834:284::-;9958:4;9996:2;9985:9;9981:18;9973:26;;10009:102;10108:1;10097:9;10093:17;10084:6;10009:102;:::i;:::-;9834:284;;;;:::o;10124:329::-;10183:6;10232:2;10220:9;10211:7;10207:23;10203:32;10200:119;;;10238:79;;:::i;:::-;10200:119;10358:1;10383:53;10428:7;10419:6;10408:9;10404:22;10383:53;:::i;:::-;10373:63;;10329:117;10124:329;;;;:::o;10459:468::-;10524:6;10532;10581:2;10569:9;10560:7;10556:23;10552:32;10549:119;;;10587:79;;:::i;:::-;10549:119;10707:1;10732:53;10777:7;10768:6;10757:9;10753:22;10732:53;:::i;:::-;10722:63;;10678:117;10834:2;10860:50;10902:7;10893:6;10882:9;10878:22;10860:50;:::i;:::-;10850:60;;10805:115;10459:468;;;;;:::o;10933:307::-;10994:4;11084:18;11076:6;11073:30;11070:56;;;11106:18;;:::i;:::-;11070:56;11144:29;11166:6;11144:29;:::i;:::-;11136:37;;11228:4;11222;11218:15;11210:23;;10933:307;;;:::o;11246:410::-;11323:5;11348:65;11364:48;11405:6;11364:48;:::i;:::-;11348:65;:::i;:::-;11339:74;;11436:6;11429:5;11422:21;11474:4;11467:5;11463:16;11512:3;11503:6;11498:3;11494:16;11491:25;11488:112;;;11519:79;;:::i;:::-;11488:112;11609:41;11643:6;11638:3;11633;11609:41;:::i;:::-;11329:327;11246:410;;;;;:::o;11675:338::-;11730:5;11779:3;11772:4;11764:6;11760:17;11756:27;11746:122;;11787:79;;:::i;:::-;11746:122;11904:6;11891:20;11929:78;12003:3;11995:6;11988:4;11980:6;11976:17;11929:78;:::i;:::-;11920:87;;11736:277;11675:338;;;;:::o;12019:943::-;12114:6;12122;12130;12138;12187:3;12175:9;12166:7;12162:23;12158:33;12155:120;;;12194:79;;:::i;:::-;12155:120;12314:1;12339:53;12384:7;12375:6;12364:9;12360:22;12339:53;:::i;:::-;12329:63;;12285:117;12441:2;12467:53;12512:7;12503:6;12492:9;12488:22;12467:53;:::i;:::-;12457:63;;12412:118;12569:2;12595:53;12640:7;12631:6;12620:9;12616:22;12595:53;:::i;:::-;12585:63;;12540:118;12725:2;12714:9;12710:18;12697:32;12756:18;12748:6;12745:30;12742:117;;;12778:79;;:::i;:::-;12742:117;12883:62;12937:7;12928:6;12917:9;12913:22;12883:62;:::i;:::-;12873:72;;12668:287;12019:943;;;;;;;:::o;12968:474::-;13036:6;13044;13093:2;13081:9;13072:7;13068:23;13064:32;13061:119;;;13099:79;;:::i;:::-;13061:119;13219:1;13244:53;13289:7;13280:6;13269:9;13265:22;13244:53;:::i;:::-;13234:63;;13190:117;13346:2;13372:53;13417:7;13408:6;13397:9;13393:22;13372:53;:::i;:::-;13362:63;;13317:118;12968:474;;;;;:::o;13448:::-;13516:6;13524;13573:2;13561:9;13552:7;13548:23;13544:32;13541:119;;;13579:79;;:::i;:::-;13541:119;13699:1;13724:53;13769:7;13760:6;13749:9;13745:22;13724:53;:::i;:::-;13714:63;;13670:117;13826:2;13852:53;13897:7;13888:6;13877:9;13873:22;13852:53;:::i;:::-;13842:63;;13797:118;13448:474;;;;;:::o;13928:180::-;13976:77;13973:1;13966:88;14073:4;14070:1;14063:15;14097:4;14094:1;14087:15;14114:320;14158:6;14195:1;14189:4;14185:12;14175:22;;14242:1;14236:4;14232:12;14263:18;14253:81;;14319:4;14311:6;14307:17;14297:27;;14253:81;14381:2;14373:6;14370:14;14350:18;14347:38;14344:84;;14400:18;;:::i;:::-;14344:84;14165:269;14114:320;;;:::o;14440:182::-;14580:34;14576:1;14568:6;14564:14;14557:58;14440:182;:::o;14628:366::-;14770:3;14791:67;14855:2;14850:3;14791:67;:::i;:::-;14784:74;;14867:93;14956:3;14867:93;:::i;:::-;14985:2;14980:3;14976:12;14969:19;;14628:366;;;:::o;15000:419::-;15166:4;15204:2;15193:9;15189:18;15181:26;;15253:9;15247:4;15243:20;15239:1;15228:9;15224:17;15217:47;15281:131;15407:4;15281:131;:::i;:::-;15273:139;;15000:419;;;:::o;15425:181::-;15565:33;15561:1;15553:6;15549:14;15542:57;15425:181;:::o;15612:366::-;15754:3;15775:67;15839:2;15834:3;15775:67;:::i;:::-;15768:74;;15851:93;15940:3;15851:93;:::i;:::-;15969:2;15964:3;15960:12;15953:19;;15612:366;;;:::o;15984:419::-;16150:4;16188:2;16177:9;16173:18;16165:26;;16237:9;16231:4;16227:20;16223:1;16212:9;16208:17;16201:47;16265:131;16391:4;16265:131;:::i;:::-;16257:139;;15984:419;;;:::o;16409:147::-;16510:11;16547:3;16532:18;;16409:147;;;;:::o;16562:114::-;;:::o;16682:398::-;16841:3;16862:83;16943:1;16938:3;16862:83;:::i;:::-;16855:90;;16954:93;17043:3;16954:93;:::i;:::-;17072:1;17067:3;17063:11;17056:18;;16682:398;;;:::o;17086:379::-;17270:3;17292:147;17435:3;17292:147;:::i;:::-;17285:154;;17456:3;17449:10;;17086:379;;;:::o;17471:178::-;17611:30;17607:1;17599:6;17595:14;17588:54;17471:178;:::o;17655:366::-;17797:3;17818:67;17882:2;17877:3;17818:67;:::i;:::-;17811:74;;17894:93;17983:3;17894:93;:::i;:::-;18012:2;18007:3;18003:12;17996:19;;17655:366;;;:::o;18027:419::-;18193:4;18231:2;18220:9;18216:18;18208:26;;18280:9;18274:4;18270:20;18266:1;18255:9;18251:17;18244:47;18308:131;18434:4;18308:131;:::i;:::-;18300:139;;18027:419;;;:::o;18452:229::-;18592:34;18588:1;18580:6;18576:14;18569:58;18661:12;18656:2;18648:6;18644:15;18637:37;18452:229;:::o;18687:366::-;18829:3;18850:67;18914:2;18909:3;18850:67;:::i;:::-;18843:74;;18926:93;19015:3;18926:93;:::i;:::-;19044:2;19039:3;19035:12;19028:19;;18687:366;;;:::o;19059:419::-;19225:4;19263:2;19252:9;19248:18;19240:26;;19312:9;19306:4;19302:20;19298:1;19287:9;19283:17;19276:47;19340:131;19466:4;19340:131;:::i;:::-;19332:139;;19059:419;;;:::o;19484:180::-;19532:77;19529:1;19522:88;19629:4;19626:1;19619:15;19653:4;19650:1;19643:15;19670:305;19710:3;19729:20;19747:1;19729:20;:::i;:::-;19724:25;;19763:20;19781:1;19763:20;:::i;:::-;19758:25;;19917:1;19849:66;19845:74;19842:1;19839:81;19836:107;;;19923:18;;:::i;:::-;19836:107;19967:1;19964;19960:9;19953:16;;19670:305;;;;:::o;19981:175::-;20121:27;20117:1;20109:6;20105:14;20098:51;19981:175;:::o;20162:366::-;20304:3;20325:67;20389:2;20384:3;20325:67;:::i;:::-;20318:74;;20401:93;20490:3;20401:93;:::i;:::-;20519:2;20514:3;20510:12;20503:19;;20162:366;;;:::o;20534:419::-;20700:4;20738:2;20727:9;20723:18;20715:26;;20787:9;20781:4;20777:20;20773:1;20762:9;20758:17;20751:47;20815:131;20941:4;20815:131;:::i;:::-;20807:139;;20534:419;;;:::o;20959:181::-;21099:33;21095:1;21087:6;21083:14;21076:57;20959:181;:::o;21146:366::-;21288:3;21309:67;21373:2;21368:3;21309:67;:::i;:::-;21302:74;;21385:93;21474:3;21385:93;:::i;:::-;21503:2;21498:3;21494:12;21487:19;;21146:366;;;:::o;21518:419::-;21684:4;21722:2;21711:9;21707:18;21699:26;;21771:9;21765:4;21761:20;21757:1;21746:9;21742:17;21735:47;21799:131;21925:4;21799:131;:::i;:::-;21791:139;;21518:419;;;:::o;21943:227::-;22083:34;22079:1;22071:6;22067:14;22060:58;22152:10;22147:2;22139:6;22135:15;22128:35;21943:227;:::o;22176:366::-;22318:3;22339:67;22403:2;22398:3;22339:67;:::i;:::-;22332:74;;22415:93;22504:3;22415:93;:::i;:::-;22533:2;22528:3;22524:12;22517:19;;22176:366;;;:::o;22548:419::-;22714:4;22752:2;22741:9;22737:18;22729:26;;22801:9;22795:4;22791:20;22787:1;22776:9;22772:17;22765:47;22829:131;22955:4;22829:131;:::i;:::-;22821:139;;22548:419;;;:::o;22973:348::-;23013:7;23036:20;23054:1;23036:20;:::i;:::-;23031:25;;23070:20;23088:1;23070:20;:::i;:::-;23065:25;;23258:1;23190:66;23186:74;23183:1;23180:81;23175:1;23168:9;23161:17;23157:105;23154:131;;;23265:18;;:::i;:::-;23154:131;23313:1;23310;23306:9;23295:20;;22973:348;;;;:::o;23327:182::-;23467:34;23463:1;23455:6;23451:14;23444:58;23327:182;:::o;23515:366::-;23657:3;23678:67;23742:2;23737:3;23678:67;:::i;:::-;23671:74;;23754:93;23843:3;23754:93;:::i;:::-;23872:2;23867:3;23863:12;23856:19;;23515:366;;;:::o;23887:419::-;24053:4;24091:2;24080:9;24076:18;24068:26;;24140:9;24134:4;24130:20;24126:1;24115:9;24111:17;24104:47;24168:131;24294:4;24168:131;:::i;:::-;24160:139;;23887:419;;;:::o;24312:234::-;24452:34;24448:1;24440:6;24436:14;24429:58;24521:17;24516:2;24508:6;24504:15;24497:42;24312:234;:::o;24552:366::-;24694:3;24715:67;24779:2;24774:3;24715:67;:::i;:::-;24708:74;;24791:93;24880:3;24791:93;:::i;:::-;24909:2;24904:3;24900:12;24893:19;;24552:366;;;:::o;24924:419::-;25090:4;25128:2;25117:9;25113:18;25105:26;;25177:9;25171:4;25167:20;25163:1;25152:9;25148:17;25141:47;25205:131;25331:4;25205:131;:::i;:::-;25197:139;;24924:419;;;:::o;25349:148::-;25451:11;25488:3;25473:18;;25349:148;;;;:::o;25503:377::-;25609:3;25637:39;25670:5;25637:39;:::i;:::-;25692:89;25774:6;25769:3;25692:89;:::i;:::-;25685:96;;25790:52;25835:6;25830:3;25823:4;25816:5;25812:16;25790:52;:::i;:::-;25867:6;25862:3;25858:16;25851:23;;25613:267;25503:377;;;;:::o;25886:141::-;25935:4;25958:3;25950:11;;25981:3;25978:1;25971:14;26015:4;26012:1;26002:18;25994:26;;25886:141;;;:::o;26057:845::-;26160:3;26197:5;26191:12;26226:36;26252:9;26226:36;:::i;:::-;26278:89;26360:6;26355:3;26278:89;:::i;:::-;26271:96;;26398:1;26387:9;26383:17;26414:1;26409:137;;;;26560:1;26555:341;;;;26376:520;;26409:137;26493:4;26489:9;26478;26474:25;26469:3;26462:38;26529:6;26524:3;26520:16;26513:23;;26409:137;;26555:341;26622:38;26654:5;26622:38;:::i;:::-;26682:1;26696:154;26710:6;26707:1;26704:13;26696:154;;;26784:7;26778:14;26774:1;26769:3;26765:11;26758:35;26834:1;26825:7;26821:15;26810:26;;26732:4;26729:1;26725:12;26720:17;;26696:154;;;26879:6;26874:3;26870:16;26863:23;;26562:334;;26376:520;;26164:738;;26057:845;;;;:::o;26908:589::-;27133:3;27155:95;27246:3;27237:6;27155:95;:::i;:::-;27148:102;;27267:95;27358:3;27349:6;27267:95;:::i;:::-;27260:102;;27379:92;27467:3;27458:6;27379:92;:::i;:::-;27372:99;;27488:3;27481:10;;26908:589;;;;;;:::o;27503:170::-;27643:22;27639:1;27631:6;27627:14;27620:46;27503:170;:::o;27679:366::-;27821:3;27842:67;27906:2;27901:3;27842:67;:::i;:::-;27835:74;;27918:93;28007:3;27918:93;:::i;:::-;28036:2;28031:3;28027:12;28020:19;;27679:366;;;:::o;28051:419::-;28217:4;28255:2;28244:9;28240:18;28232:26;;28304:9;28298:4;28294:20;28290:1;28279:9;28275:17;28268:47;28332:131;28458:4;28332:131;:::i;:::-;28324:139;;28051:419;;;:::o;28476:225::-;28616:34;28612:1;28604:6;28600:14;28593:58;28685:8;28680:2;28672:6;28668:15;28661:33;28476:225;:::o;28707:366::-;28849:3;28870:67;28934:2;28929:3;28870:67;:::i;:::-;28863:74;;28946:93;29035:3;28946:93;:::i;:::-;29064:2;29059:3;29055:12;29048:19;;28707:366;;;:::o;29079:419::-;29245:4;29283:2;29272:9;29268:18;29260:26;;29332:9;29326:4;29322:20;29318:1;29307:9;29303:17;29296:47;29360:131;29486:4;29360:131;:::i;:::-;29352:139;;29079:419;;;:::o;29504:332::-;29625:4;29663:2;29652:9;29648:18;29640:26;;29676:71;29744:1;29733:9;29729:17;29720:6;29676:71;:::i;:::-;29757:72;29825:2;29814:9;29810:18;29801:6;29757:72;:::i;:::-;29504:332;;;;;:::o;29842:137::-;29896:5;29927:6;29921:13;29912:22;;29943:30;29967:5;29943:30;:::i;:::-;29842:137;;;;:::o;29985:345::-;30052:6;30101:2;30089:9;30080:7;30076:23;30072:32;30069:119;;;30107:79;;:::i;:::-;30069:119;30227:1;30252:61;30305:7;30296:6;30285:9;30281:22;30252:61;:::i;:::-;30242:71;;30198:125;29985:345;;;;:::o;30336:233::-;30375:3;30398:24;30416:5;30398:24;:::i;:::-;30389:33;;30444:66;30437:5;30434:77;30431:103;;30514:18;;:::i;:::-;30431:103;30561:1;30554:5;30550:13;30543:20;;30336:233;;;:::o;30575:180::-;30623:77;30620:1;30613:88;30720:4;30717:1;30710:15;30744:4;30741:1;30734:15;30761:185;30801:1;30818:20;30836:1;30818:20;:::i;:::-;30813:25;;30852:20;30870:1;30852:20;:::i;:::-;30847:25;;30891:1;30881:35;;30896:18;;:::i;:::-;30881:35;30938:1;30935;30931:9;30926:14;;30761:185;;;;:::o;30952:191::-;30992:4;31012:20;31030:1;31012:20;:::i;:::-;31007:25;;31046:20;31064:1;31046:20;:::i;:::-;31041:25;;31085:1;31082;31079:8;31076:34;;;31090:18;;:::i;:::-;31076:34;31135:1;31132;31128:9;31120:17;;30952:191;;;;:::o;31149:176::-;31181:1;31198:20;31216:1;31198:20;:::i;:::-;31193:25;;31232:20;31250:1;31232:20;:::i;:::-;31227:25;;31271:1;31261:35;;31276:18;;:::i;:::-;31261:35;31317:1;31314;31310:9;31305:14;;31149:176;;;;:::o;31331:180::-;31379:77;31376:1;31369:88;31476:4;31473:1;31466:15;31500:4;31497:1;31490:15;31517:98;31568:6;31602:5;31596:12;31586:22;;31517:98;;;:::o;31621:168::-;31704:11;31738:6;31733:3;31726:19;31778:4;31773:3;31769:14;31754:29;;31621:168;;;;:::o;31795:360::-;31881:3;31909:38;31941:5;31909:38;:::i;:::-;31963:70;32026:6;32021:3;31963:70;:::i;:::-;31956:77;;32042:52;32087:6;32082:3;32075:4;32068:5;32064:16;32042:52;:::i;:::-;32119:29;32141:6;32119:29;:::i;:::-;32114:3;32110:39;32103:46;;31885:270;31795:360;;;;:::o;32161:640::-;32356:4;32394:3;32383:9;32379:19;32371:27;;32408:71;32476:1;32465:9;32461:17;32452:6;32408:71;:::i;:::-;32489:72;32557:2;32546:9;32542:18;32533:6;32489:72;:::i;:::-;32571;32639:2;32628:9;32624:18;32615:6;32571:72;:::i;:::-;32690:9;32684:4;32680:20;32675:2;32664:9;32660:18;32653:48;32718:76;32789:4;32780:6;32718:76;:::i;:::-;32710:84;;32161:640;;;;;;;:::o;32807:141::-;32863:5;32894:6;32888:13;32879:22;;32910:32;32936:5;32910:32;:::i;:::-;32807:141;;;;:::o;32954:349::-;33023:6;33072:2;33060:9;33051:7;33047:23;33043:32;33040:119;;;33078:79;;:::i;:::-;33040:119;33198:1;33223:63;33278:7;33269:6;33258:9;33254:22;33223:63;:::i;:::-;33213:73;;33169:127;32954:349;;;;:::o
Swarm Source
ipfs://ac9ada43f61ebea56bcf975c0e0d4d5de69acf6478e951312822316d9f4daf3f
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.