Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 726 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Stake | 19096138 | 251 days ago | IN | 0 ETH | 0.00602839 | ||||
Stake | 18308863 | 361 days ago | IN | 0 ETH | 0.00236098 | ||||
Bulk Stake | 18128431 | 386 days ago | IN | 0 ETH | 0.00936165 | ||||
Bulk Stake | 18123062 | 387 days ago | IN | 0 ETH | 0.03637379 | ||||
Stake | 17487607 | 476 days ago | IN | 0 ETH | 0.02590628 | ||||
Stake | 16883448 | 561 days ago | IN | 0 ETH | 0.01285441 | ||||
Bulk Stake | 16881068 | 562 days ago | IN | 0 ETH | 0.03805604 | ||||
Bulk Stake | 16857304 | 565 days ago | IN | 0 ETH | 0.01056814 | ||||
Stake | 16809188 | 572 days ago | IN | 0 ETH | 0.0133802 | ||||
Bulk Stake | 16741460 | 581 days ago | IN | 0 ETH | 0.05157556 | ||||
Stake | 16730071 | 583 days ago | IN | 0 ETH | 0.01318251 | ||||
Stake | 16725474 | 584 days ago | IN | 0 ETH | 0.01240741 | ||||
Stake | 16716881 | 585 days ago | IN | 0 ETH | 0.01246601 | ||||
Bulk Stake | 16710671 | 586 days ago | IN | 0 ETH | 0.02957093 | ||||
Stake | 16708011 | 586 days ago | IN | 0 ETH | 0.01396366 | ||||
Stake | 16673620 | 591 days ago | IN | 0 ETH | 0.00880711 | ||||
Bulk Stake | 16646974 | 595 days ago | IN | 0 ETH | 0.04827279 | ||||
Stake | 16642928 | 595 days ago | IN | 0 ETH | 0.01440929 | ||||
Unstake | 16610820 | 600 days ago | IN | 0 ETH | 0.00165617 | ||||
Stake | 16597420 | 602 days ago | IN | 0 ETH | 0.00274541 | ||||
Stake | 16597411 | 602 days ago | IN | 0 ETH | 0.0008105 | ||||
Stake | 16597402 | 602 days ago | IN | 0 ETH | 0.00058149 | ||||
Unstake | 16569141 | 606 days ago | IN | 0 ETH | 0.01814285 | ||||
Unstake | 16567733 | 606 days ago | IN | 0 ETH | 0.01601334 | ||||
Unstake | 16553926 | 608 days ago | IN | 0 ETH | 0.0168146 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
ShonenJunkQuesting
Compiler Version
v0.8.17+commit.8df45f5f
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.9; import "@openzeppelin/contracts/token/ERC721/IERC721.sol"; import "@openzeppelin/contracts/security/ReentrancyGuard.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/utils/Context.sol"; contract ShonenJunkQuesting is ReentrancyGuard, Context, Ownable { /* .__ __ __ _____| |__ ____ ____ ____ ____ |__|__ __ ____ | | __ / ___/ | \ / _ \ / \_/ __ \ / \ | | | \/ \| |/ / \___ \| Y ( <_> ) | \ ___/| | \ | | | / | \ < /____ >___| /\____/|___| /\___ >___| /\__| |____/|___| /__|_ \ \/ \/ \/ \/ \/\______| \/ \/ */ IERC721 public immutable nftCollection; uint16 public immutable maxSupply; bool public stakingEnabled = true; bool public unstakingEnabled = true; uint256 public minimumTimeOfStaking = 0; address[] private activeStakers; constructor(IERC721 _nftCollection, uint16 _maxSupply) { nftCollection = _nftCollection; maxSupply = _maxSupply; } struct StakedToken { address staker; uint16 tokenId; // The time when this token started staking uint256 timeOfStaking; // Duration in seconds which is calculated during retrieval uint256 durationOfStaking; } struct Staker { uint16 amountStaked; StakedToken[] stakedTokens; uint256 timeOfLastUpdate; } // Mapping of owner address to staker info mapping(address => Staker) public stakers; // Mapping of Token Id to original owner address mapping(uint256 => address) public stakerAddress; function stake(uint16 _tokenId) external nonReentrant { require(stakingEnabled, "Staking is currently disabled."); address invoker = _msgSender(); require( nftCollection.ownerOf(_tokenId) == invoker, "You don't own this token." ); require( stakerAddress[_tokenId] != invoker, "You already staked this token." ); _stakeTokenIdWithAddress(invoker, _tokenId); _updateStakingMetadata(invoker); } function unstake(uint16 _tokenId) external nonReentrant { require(unstakingEnabled, "Unstaking is currently disabled."); address invoker = _msgSender(); require( nftCollection.ownerOf(_tokenId) == invoker, "You don't own this token." ); require(stakerAddress[_tokenId] == invoker, "Token is not staked."); _unstakeTokenIdWithAddress(invoker, _tokenId); _updateStakingMetadata(invoker); } function bulkStake(uint16[] memory _tokenIds) external nonReentrant { require(stakingEnabled, "Staking is currently disabled."); require(_tokenIds.length > 0, "You must specify tokens to stake."); address invoker = _msgSender(); bool ownedAllTokens = true; bool tokensNotYetStaked = true; for (uint16 i = 0; i < _tokenIds.length; i++) { if (nftCollection.ownerOf(_tokenIds[i]) != invoker) { ownedAllTokens = false; break; } else if (stakerAddress[_tokenIds[i]] == invoker) { tokensNotYetStaked = false; break; } } require( ownedAllTokens, "You don't own one or more of the tokens you're staking." ); require( tokensNotYetStaked, "One or more of the tokens you're staking is already staked." ); for (uint16 i = 0; i < _tokenIds.length; i++) { _stakeTokenIdWithAddress(invoker, _tokenIds[i]); } _updateStakingMetadata(invoker); } function bulkUnstake(uint16[] memory _tokenIds) external nonReentrant { require(unstakingEnabled, "Unstaking is currently disabled."); require(_tokenIds.length > 0, "You must specify tokens to unstake."); address invoker = _msgSender(); bool ownedAllTokens = true; bool tokensAreStaked = true; for (uint16 i = 0; i < _tokenIds.length; i++) { if (nftCollection.ownerOf(_tokenIds[i]) != invoker) { ownedAllTokens = false; break; } else if (stakerAddress[_tokenIds[i]] != invoker) { tokensAreStaked = false; break; } } require( ownedAllTokens, "You don't own one or more of the tokens you're unstaking." ); require( tokensAreStaked, "One or more of the tokens you're unstaking is not staked." ); for (uint16 i = 0; i < _tokenIds.length; i++) { _unstakeTokenIdWithAddress(invoker, _tokenIds[i]); } _updateStakingMetadata(invoker); } function unstakeAll() external nonReentrant { require(unstakingEnabled, "Unstaking is currently disabled."); address invoker = _msgSender(); _unstakeAllByAddress(invoker); } // OWNER ONLY FUNCTIONS function setStartOfStaking(uint256 _minimumTimeOfStaking) external onlyOwner { minimumTimeOfStaking = _minimumTimeOfStaking; } function allowStaking(bool _flag) external onlyOwner { require( _flag != stakingEnabled, "The new value is the same as the current value." ); stakingEnabled = _flag; } function allowUnstaking(bool _flag) external onlyOwner { require( _flag != unstakingEnabled, "The new value is the same as the current value." ); unstakingEnabled = _flag; } function forceBulkStake(uint16[] memory _tokenIds) external onlyOwner nonReentrant { require(_tokenIds.length > 0, "You must specify tokens to stake."); bool tokensNotYetStaked = true; for (uint16 i = 0; i < _tokenIds.length; i++) { if ( stakerAddress[_tokenIds[i]] == nftCollection.ownerOf(_tokenIds[i]) ) { tokensNotYetStaked = false; break; } } require( tokensNotYetStaked, "One or more of the tokens is already staked." ); address[] memory tokenOwners = new address[](_tokenIds.length); uint16 totalOwners = 0; for (uint16 i = 0; i < _tokenIds.length; i++) { address tokenOwner = nftCollection.ownerOf(_tokenIds[i]); _stakeTokenIdWithAddress(tokenOwner, _tokenIds[i]); // Keep track of unique token owner addresses bool tokenOwnerIsTracked = false; for (uint16 j = 0; j < tokenOwners.length; j++) { if (tokenOwners[j] == tokenOwner) { tokenOwnerIsTracked = true; break; } } if (!tokenOwnerIsTracked) { tokenOwners[totalOwners] = tokenOwner; totalOwners++; } } // Update staking metadata for each unique token owner for (uint16 i = 0; i < totalOwners; i++) { _updateStakingMetadata(tokenOwners[i]); } } function forceBulkUnstake(uint16[] memory _tokenIds) external onlyOwner nonReentrant { require(_tokenIds.length > 0, "You must specify tokens to unstake."); address[] memory tokenOwners = new address[](_tokenIds.length); uint16 totalOwners = 0; for (uint16 i = 0; i < _tokenIds.length; i++) { address tokenOwner = nftCollection.ownerOf(_tokenIds[i]); _unstakeTokenIdWithAddress(tokenOwner, _tokenIds[i]); // Keep track of unique token owner addresses bool tokenOwnerIsTracked = false; for (uint16 j = 0; j < tokenOwners.length; j++) { if (tokenOwners[j] == tokenOwner) { tokenOwnerIsTracked = true; break; } } if (!tokenOwnerIsTracked) { tokenOwners[totalOwners] = tokenOwner; totalOwners++; } } // Update staking metadata for each unique token owner for (uint16 i = 0; i < totalOwners; i++) { _updateStakingMetadata(tokenOwners[i]); } } function forceUpdateTimeOfStaking( uint16[] memory _tokenIds, uint256 timeOfStaking ) external onlyOwner nonReentrant { require(_tokenIds.length > 0, "You must specify tokens to update."); address targetStaker = nftCollection.ownerOf(_tokenIds[0]); bool validTokenIds = true; for (uint16 i = 0; i < _tokenIds.length; i++) { if (nftCollection.ownerOf(_tokenIds[i]) != targetStaker) { validTokenIds = false; break; } } require(validTokenIds, "Tokens must belong to the same address."); // Try and update the timeOfStaking for each token Id for (uint16 i = 0; i < _tokenIds.length; i++) { uint16 currentTokenId = _tokenIds[i]; // Retrieve the tokenIndex from the stakers array of staked tokens uint16 tokenIndex = maxSupply; for ( uint16 j = 0; j < stakers[targetStaker].stakedTokens.length; j++ ) { if ( stakers[targetStaker].stakedTokens[j].tokenId == currentTokenId ) { tokenIndex = j; break; } } require( tokenIndex < maxSupply, "One or more tokens is not currently staked." ); // Ensure the tokenIndex is not out of bounds if (tokenIndex < maxSupply) { bool dataIsCorrect = stakers[targetStaker] .stakedTokens[tokenIndex] .staker == targetStaker && stakerAddress[currentTokenId] == targetStaker; bool stillInOwnersWallet = nftCollection.ownerOf( currentTokenId ) == targetStaker; // Update the time of staking if all other staking information is still intact if (dataIsCorrect && stillInOwnersWallet) { stakers[targetStaker] .stakedTokens[tokenIndex] .timeOfStaking = timeOfStaking; } } } } function forceUnstakeAll(address _targetStaker) external onlyOwner { _unstakeAllByAddress(_targetStaker); } // VIEW ONLY FUNCTIONS function getMyTotalStakeCount() external view returns (uint16) { address invoker = _msgSender(); return _getStakeCountByAddress(invoker); } function getAllStakedTokens() external view returns (StakedToken[] memory) { uint16 allStakedTokensCount = _countAllStakedTokens(); StakedToken[] memory allStakedTokens = new StakedToken[]( allStakedTokensCount ); address[] memory currentActiveStakers = _getAllActiveStakers(); uint16 counter = 0; for (uint16 i = 0; i < currentActiveStakers.length; i++) { StakedToken[] memory stakedTokens = _getStakedTokensByAddress( currentActiveStakers[i] ); for (uint16 j = 0; j < stakedTokens.length; j++) { allStakedTokens[counter] = (stakedTokens[j]); counter++; } } return allStakedTokens; } function getStakedTokensByAddress(address _staker) external view returns (StakedToken[] memory) { return _getStakedTokensByAddress(_staker); } function getAllActiveStakers() external view returns (address[] memory) { return _getAllActiveStakers(); } function getAllActiveStakersCount() external view returns (uint16) { address[] memory verifiedStakers = new address[](activeStakers.length); uint16 counter = 0; for (uint16 i = 0; i < activeStakers.length; i++) { address currentAddress = activeStakers[i]; StakedToken[] memory stakedTokens = stakers[currentAddress] .stakedTokens; for (uint16 j = 0; j < stakedTokens.length; j++) { if ( stakerAddress[stakedTokens[j].tokenId] == currentAddress && nftCollection.ownerOf(stakedTokens[j].tokenId) == currentAddress ) { verifiedStakers[counter] = currentAddress; counter++; break; } } } return counter; } // INTERNAL function _getStakedTokensByAddress(address _staker) internal view returns (StakedToken[] memory) { uint16 totalStakeCountByAddress = _getStakeCountByAddress(_staker); // Return empty list if address has no staked tokens if (totalStakeCountByAddress < 1) { return new StakedToken[](0); } // Return all the tokens actively staked by this owner StakedToken[] memory activeStakedTokens = new StakedToken[]( totalStakeCountByAddress ); uint16 index = 0; // Go thru each staked tokens and validate before adding them to list for (uint16 i = 0; i < stakers[_staker].stakedTokens.length; i++) { StakedToken memory stakedTokenInfo = stakers[_staker].stakedTokens[ i ]; bool dataIsCorrect = stakedTokenInfo.staker == _staker && stakerAddress[stakedTokenInfo.tokenId] == _staker; bool stillInOwnersWallet = nftCollection.ownerOf( stakedTokenInfo.tokenId ) == _staker; if (dataIsCorrect && stillInOwnersWallet) { // Copy the staked token information activeStakedTokens[index] = stakedTokenInfo; // Update the duration of stake activeStakedTokens[index].durationOfStaking = block.timestamp > activeStakedTokens[index].timeOfStaking ? block.timestamp - activeStakedTokens[index].timeOfStaking : 0; index++; } } return activeStakedTokens; } function _stakeTokenIdWithAddress(address _staker, uint16 _tokenId) internal { uint256 timeOfStaking = block.timestamp; // Create StakedToken StakedToken memory stakedToken = StakedToken( _staker, _tokenId, // Ensure tokens can't be staked before official start of staking timeOfStaking > minimumTimeOfStaking ? timeOfStaking : minimumTimeOfStaking, 0 ); // Find the index of the token from the stakedToken list if it exists uint16 tokenIndex = maxSupply; for (uint16 i = 0; i < stakers[_staker].stakedTokens.length; i++) { if (stakers[_staker].stakedTokens[i].tokenId == _tokenId) { tokenIndex = i; break; } } // Add or update if (tokenIndex < maxSupply) { stakers[_staker].stakedTokens[tokenIndex] = stakedToken; } else { stakers[_staker].stakedTokens.push(stakedToken); } // Update the mapping of the Token Id to the stakers address _bindAddressToTokenId(_staker, _tokenId); } function _unstakeTokenIdWithAddress(address _staker, uint16 _tokenId) internal { // Find the index of the token from the stakedToken list uint16 tokenIndex = maxSupply; for (uint16 i = 0; i < stakers[_staker].stakedTokens.length; i++) { if (stakers[_staker].stakedTokens[i].tokenId == _tokenId) { tokenIndex = i; break; } } // _tokenId is in stakedTokens if (tokenIndex < maxSupply) { // Remove this token from the users stakedTokens list stakers[_staker].stakedTokens[tokenIndex].staker = address(0); stakers[_staker].stakedTokens[tokenIndex].timeOfStaking = 0; } // Set the stakerAddress for the tokenId to address(0) to indicate that the token is no longer staked stakerAddress[_tokenId] = address(0); } // This method ensures that the staking data is intact // must be called after all the _stakeTokenIdWithAddress/_unstakeTokenIdWithAddress calls are finished function _updateStakingMetadata(address _staker) internal { uint16 totalStakedCountByAddress = _getStakeCountByAddress(_staker); stakers[_staker].amountStaked = totalStakedCountByAddress; stakers[_staker].timeOfLastUpdate = block.timestamp; bool completelyUnstaked = totalStakedCountByAddress == 0; if (completelyUnstaked) { _unstakeAllByAddress(_staker); } else { _addToActiveStakers(_staker); } } function _addToActiveStakers(address _staker) internal { for (uint16 i = 0; i < activeStakers.length; i++) { if (activeStakers[i] == _staker) { return; } } activeStakers.push(_staker); } function _removeFromActiveStakers(address _inactiveStakerAddress) internal returns (bool) { for (uint256 i = 0; i < activeStakers.length; i++) { if (activeStakers[i] == _inactiveStakerAddress) { activeStakers[i] = activeStakers[activeStakers.length - 1]; activeStakers.pop(); return true; } } return false; } // Clear staking data of an address function _unstakeAllByAddress(address _staker) internal { _removeFromActiveStakers(_staker); stakers[_staker].timeOfLastUpdate = block.timestamp; delete stakers[_staker].stakedTokens; stakers[_staker].amountStaked = 0; } // Binds the staker information to a token Id function _bindAddressToTokenId(address _staker, uint16 _tokenId) internal { address previousStakerAddress = stakerAddress[_tokenId]; bool hasValidPreviousStakerAddress = previousStakerAddress != _staker && previousStakerAddress != address(0); // Unstake and update previous owner if there's any if (hasValidPreviousStakerAddress) { _unstakeTokenIdWithAddress(previousStakerAddress, _tokenId); _updateStakingMetadata(previousStakerAddress); } stakerAddress[_tokenId] = _staker; } function _getStakeCountByAddress(address _staker) internal view returns (uint16) { uint16 stakeCount = 0; for (uint16 i = 0; i < stakers[_staker].stakedTokens.length; i++) { uint16 currentTokenId = stakers[_staker].stakedTokens[i].tokenId; bool dataIsCorrect = stakers[_staker].stakedTokens[i].staker == _staker && stakerAddress[currentTokenId] == _staker; bool stillInOwnersWallet = nftCollection.ownerOf(currentTokenId) == _staker; // Count only those that have valid staking data and still owned by the staker if (stillInOwnersWallet && dataIsCorrect) { stakeCount++; } } return stakeCount; } function _getAllActiveStakers() internal view returns (address[] memory) { address[] memory verifiedStakers = new address[](activeStakers.length); uint16 counter = 0; for (uint16 i = 0; i < activeStakers.length; i++) { address currentAddress = activeStakers[i]; StakedToken[] memory stakedTokens = stakers[currentAddress] .stakedTokens; for (uint16 j = 0; j < stakedTokens.length; j++) { if ( stakerAddress[stakedTokens[j].tokenId] == currentAddress && nftCollection.ownerOf(stakedTokens[j].tokenId) == currentAddress ) { verifiedStakers[counter] = currentAddress; counter++; break; } } } address[] memory filteredActiveStakers = new address[](counter); for (uint16 i = 0; i < counter; i++) { filteredActiveStakers[i] = verifiedStakers[i]; } return filteredActiveStakers; } function _countAllStakedTokens() internal view returns (uint16) { uint16 total = 0; address[] memory currentActiveStakers = _getAllActiveStakers(); for (uint16 i = 0; i < currentActiveStakers.length; i++) { total += _getStakeCountByAddress(currentActiveStakers[i]); } return total; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT // 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; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; }
// SPDX-License-Identifier: MIT // 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; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @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); } }
{ "remappings": [], "optimizer": { "enabled": false, "runs": 200 }, "evmVersion": "london", "libraries": {}, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract IERC721","name":"_nftCollection","type":"address"},{"internalType":"uint16","name":"_maxSupply","type":"uint16"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[{"internalType":"bool","name":"_flag","type":"bool"}],"name":"allowStaking","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_flag","type":"bool"}],"name":"allowUnstaking","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16[]","name":"_tokenIds","type":"uint16[]"}],"name":"bulkStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16[]","name":"_tokenIds","type":"uint16[]"}],"name":"bulkUnstake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16[]","name":"_tokenIds","type":"uint16[]"}],"name":"forceBulkStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16[]","name":"_tokenIds","type":"uint16[]"}],"name":"forceBulkUnstake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_targetStaker","type":"address"}],"name":"forceUnstakeAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16[]","name":"_tokenIds","type":"uint16[]"},{"internalType":"uint256","name":"timeOfStaking","type":"uint256"}],"name":"forceUpdateTimeOfStaking","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getAllActiveStakers","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAllActiveStakersCount","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAllStakedTokens","outputs":[{"components":[{"internalType":"address","name":"staker","type":"address"},{"internalType":"uint16","name":"tokenId","type":"uint16"},{"internalType":"uint256","name":"timeOfStaking","type":"uint256"},{"internalType":"uint256","name":"durationOfStaking","type":"uint256"}],"internalType":"struct ShonenJunkQuesting.StakedToken[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMyTotalStakeCount","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_staker","type":"address"}],"name":"getStakedTokensByAddress","outputs":[{"components":[{"internalType":"address","name":"staker","type":"address"},{"internalType":"uint16","name":"tokenId","type":"uint16"},{"internalType":"uint256","name":"timeOfStaking","type":"uint256"},{"internalType":"uint256","name":"durationOfStaking","type":"uint256"}],"internalType":"struct ShonenJunkQuesting.StakedToken[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumTimeOfStaking","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftCollection","outputs":[{"internalType":"contract IERC721","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minimumTimeOfStaking","type":"uint256"}],"name":"setStartOfStaking","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_tokenId","type":"uint16"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"stakerAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"stakers","outputs":[{"internalType":"uint16","name":"amountStaked","type":"uint16"},{"internalType":"uint256","name":"timeOfLastUpdate","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_tokenId","type":"uint16"}],"name":"unstake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unstakeAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unstakingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60c060405260018060146101000a81548160ff02191690831515021790555060018060156101000a81548160ff02191690831515021790555060006002553480156200004a57600080fd5b5060405162005e3338038062005e3383398181016040528101906200007091906200026f565b6001600081905550620000986200008c620000e460201b60201c565b620000ec60201b60201c565b8173ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250508061ffff1660a08161ffff16815250505050620002b6565b600033905090565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620001e482620001b7565b9050919050565b6000620001f882620001d7565b9050919050565b6200020a81620001eb565b81146200021657600080fd5b50565b6000815190506200022a81620001ff565b92915050565b600061ffff82169050919050565b620002498162000230565b81146200025557600080fd5b50565b60008151905062000269816200023e565b92915050565b60008060408385031215620002895762000288620001b2565b5b6000620002998582860162000219565b9250506020620002ac8582860162000258565b9150509250929050565b60805160a051615ac46200036f60003960008181611a3101528181611b4a01528181611bb40152818161262001528181612d0f01528181612e280152818161359101526136aa01526000818161058f0152818161097501528181610c9801528181610f240152818161117901528181611376015281816117e8015281816118cc01528181611d2701528181611fed015281816124b0015281816129480152818161339701528181613bdf01526140950152615ac46000f3fe608060405234801561001057600080fd5b50600436106101a85760003560e01c80637537e161116100f9578063d5abeb0111610097578063f66ab0a911610071578063f66ab0a914610458578063f687b34514610474578063f7bd560f14610492578063fe4eaa12146104b0576101a8565b8063d5abeb0114610402578063f2fde38b14610420578063f3073ee71461043c576101a8565b806394067045116100d3578063940670451461037c5780639cfcd3ec146103ac578063c5b08fa7146103c8578063d427efd1146103e4576101a8565b80637537e161146103115780638da5cb5b1461032d5780639168ae721461034b576101a8565b806335322f37116101665780636e5a0155116101405780636e5a0155146102b1578063715018a6146102cd57806372411513146102d757806374e6385a146102f3576101a8565b806335322f371461026b578063546ba763146102755780636588103b14610293576101a8565b806246aba3146101ad57806302dc0524146101c95780631307e232146101f95780631cfff51b14610215578063284dc1a2146102335780632f57ee411461024f575b600080fd5b6101c760048036038101906101c291906147cd565b6104ce565b005b6101e360048036038101906101de9190614858565b610741565b6040516101f091906149c0565b60405180910390f35b610213600480360381019061020e9190614a1a565b610753565b005b61021d610841565b60405161022a9190614a56565b60405180910390f35b61024d60048036038101906102489190614bca565b610854565b005b610269600480360381019061026491906147cd565b610bd7565b005b610273610e4a565b005b61027d610f06565b60405161028a9190614c22565b60405180910390f35b61029b610f22565b6040516102a89190614c9c565b60405180910390f35b6102cb60048036038101906102c69190614ce3565b610f46565b005b6102d5610fcc565b005b6102f160048036038101906102ec9190614bca565b611054565b005b6102fb6115ad565b6040516103089190614a56565b60405180910390f35b61032b60048036038101906103269190614858565b6115c0565b005b610335611648565b6040516103429190614d1f565b60405180910390f35b61036560048036038101906103609190614858565b611672565b604051610373929190614d49565b60405180910390f35b61039660048036038101906103919190614ce3565b6116a4565b6040516103a39190614d1f565b60405180910390f35b6103c660048036038101906103c19190614d72565b6116d7565b005b6103e260048036038101906103dd9190614bca565b611e7d565b005b6103ec612223565b6040516103f99190614c22565b60405180910390f35b61040a61261e565b6040516104179190614c22565b60405180910390f35b61043a60048036038101906104359190614858565b612642565b005b61045660048036038101906104519190614a1a565b612739565b005b610472600480360381019061046d9190614bca565b612827565b005b61047c612baa565b6040516104899190614dce565b60405180910390f35b61049a612bb0565b6040516104a791906149c0565b60405180910390f35b6104b8612cf4565b6040516104c59190614e98565b60405180910390f35b600260005403610513576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161050a90614f17565b60405180910390fd5b6002600081905550600160159054906101000a900460ff1661056a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161056190614f83565b60405180910390fd5b6000610574612d03565b90508073ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16636352211e846040518263ffffffff1660e01b81526004016105e69190614fd4565b602060405180830381865afa158015610603573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106279190615004565b73ffffffffffffffffffffffffffffffffffffffff161461067d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106749061507d565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600560008461ffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610722576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610719906150e9565b60405180910390fd5b61072c8183612d0b565b61073581612fcb565b50600160008190555050565b606061074c826130aa565b9050919050565b61075b612d03565b73ffffffffffffffffffffffffffffffffffffffff16610779611648565b73ffffffffffffffffffffffffffffffffffffffff16146107cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107c690615155565b60405180910390fd5b600160159054906101000a900460ff16151581151503610824576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161081b906151e7565b60405180910390fd5b80600160156101000a81548160ff02191690831515021790555050565b600160149054906101000a900460ff1681565b600260005403610899576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161089090614f17565b60405180910390fd5b6002600081905550600160149054906101000a900460ff166108f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e790615253565b60405180910390fd5b6000815111610934576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092b906152e5565b60405180910390fd5b600061093e612d03565b905060006001905060006001905060005b84518161ffff161015610af3578373ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16636352211e878461ffff16815181106109c6576109c5615305565b5b60200260200101516040518263ffffffff1660e01b81526004016109ea9190614fd4565b602060405180830381865afa158015610a07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a2b9190615004565b73ffffffffffffffffffffffffffffffffffffffff1614610a4f5760009250610af3565b8373ffffffffffffffffffffffffffffffffffffffff1660056000878461ffff1681518110610a8157610a80615305565b5b602002602001015161ffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603610ae05760009150610af3565b8080610aeb90615363565b91505061094f565b5081610b34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2b906153ff565b60405180910390fd5b80610b74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6b90615491565b60405180910390fd5b60005b84518161ffff161015610bbf57610bac84868361ffff1681518110610b9f57610b9e615305565b5b6020026020010151613536565b8080610bb790615363565b915050610b77565b50610bc983612fcb565b505050600160008190555050565b600260005403610c1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1390614f17565b60405180910390fd5b6002600081905550600160149054906101000a900460ff16610c73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6a90615253565b60405180910390fd5b6000610c7d612d03565b90508073ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16636352211e846040518263ffffffff1660e01b8152600401610cef9190614fd4565b602060405180830381865afa158015610d0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d309190615004565b73ffffffffffffffffffffffffffffffffffffffff1614610d86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7d9061507d565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600560008461ffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603610e2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e22906154fd565b60405180910390fd5b610e358183613536565b610e3e81612fcb565b50600160008190555050565b600260005403610e8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8690614f17565b60405180910390fd5b6002600081905550600160159054906101000a900460ff16610ee6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610edd90614f83565b60405180910390fd5b6000610ef0612d03565b9050610efb816138c3565b506001600081905550565b600080610f11612d03565b9050610f1c816139c3565b91505090565b7f000000000000000000000000000000000000000000000000000000000000000081565b610f4e612d03565b73ffffffffffffffffffffffffffffffffffffffff16610f6c611648565b73ffffffffffffffffffffffffffffffffffffffff1614610fc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb990615155565b60405180910390fd5b8060028190555050565b610fd4612d03565b73ffffffffffffffffffffffffffffffffffffffff16610ff2611648565b73ffffffffffffffffffffffffffffffffffffffff1614611048576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103f90615155565b60405180910390fd5b6110526000613cce565b565b61105c612d03565b73ffffffffffffffffffffffffffffffffffffffff1661107a611648565b73ffffffffffffffffffffffffffffffffffffffff16146110d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c790615155565b60405180910390fd5b600260005403611115576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110c90614f17565b60405180910390fd5b60026000819055506000815111611161576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611158906152e5565b60405180910390fd5b60006001905060005b82518161ffff1610156112d2577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16636352211e848361ffff16815181106111ca576111c9615305565b5b60200260200101516040518263ffffffff1660e01b81526004016111ee9190614fd4565b602060405180830381865afa15801561120b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061122f9190615004565b73ffffffffffffffffffffffffffffffffffffffff1660056000858461ffff16815181106112605761125f615305565b5b602002602001015161ffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036112bf57600091506112d2565b80806112ca90615363565b91505061116a565b5080611313576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130a9061558f565b60405180910390fd5b6000825167ffffffffffffffff8111156113305761132f614a87565b5b60405190808252806020026020018201604052801561135e5781602001602082028036833780820191505090505b5090506000805b84518161ffff1610156115505760007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16636352211e878461ffff16815181106113c7576113c6615305565b5b60200260200101516040518263ffffffff1660e01b81526004016113eb9190614fd4565b602060405180830381865afa158015611408573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061142c9190615004565b905061145681878461ffff168151811061144957611448615305565b5b6020026020010151613536565b6000805b85518161ffff1610156114d4578273ffffffffffffffffffffffffffffffffffffffff16868261ffff168151811061149557611494615305565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16036114c157600191506114d4565b80806114cc90615363565b91505061145a565b508061153b5781858561ffff16815181106114f2576114f1615305565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050838061153790615363565b9450505b5050808061154890615363565b915050611365565b5060005b8161ffff168161ffff16101561159e5761158b838261ffff168151811061157e5761157d615305565b5b6020026020010151612fcb565b808061159690615363565b915050611554565b50505050600160008190555050565b600160159054906101000a900460ff1681565b6115c8612d03565b73ffffffffffffffffffffffffffffffffffffffff166115e6611648565b73ffffffffffffffffffffffffffffffffffffffff161461163c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163390615155565b60405180910390fd5b611645816138c3565b50565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60046020528060005260406000206000915090508060000160009054906101000a900461ffff16908060020154905082565b60056020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6116df612d03565b73ffffffffffffffffffffffffffffffffffffffff166116fd611648565b73ffffffffffffffffffffffffffffffffffffffff1614611753576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174a90615155565b60405180910390fd5b600260005403611798576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178f90614f17565b60405180910390fd5b600260008190555060008251116117e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117db90615621565b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16636352211e8460008151811061183657611835615305565b5b60200260200101516040518263ffffffff1660e01b815260040161185a9190614fd4565b602060405180830381865afa158015611877573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061189b9190615004565b905060006001905060005b84518161ffff1610156119b9578273ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16636352211e878461ffff168151811061191d5761191c615305565b5b60200260200101516040518263ffffffff1660e01b81526004016119419190614fd4565b602060405180830381865afa15801561195e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119829190615004565b73ffffffffffffffffffffffffffffffffffffffff16146119a657600091506119b9565b80806119b190615363565b9150506118a6565b50806119fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f1906156b3565b60405180910390fd5b60005b84518161ffff161015611e6e576000858261ffff1681518110611a2357611a22615305565b5b6020026020010151905060007f0000000000000000000000000000000000000000000000000000000000000000905060005b600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101805490508161ffff161015611b47578261ffff16600460008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018261ffff1681548110611b0357611b02615305565b5b906000526020600020906003020160000160149054906101000a900461ffff1661ffff1603611b3457809150611b47565b8080611b3f90615363565b915050611a55565b507f000000000000000000000000000000000000000000000000000000000000000061ffff168161ffff1610611bb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba990615745565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000061ffff168161ffff161015611e595760008573ffffffffffffffffffffffffffffffffffffffff16600460008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018361ffff1681548110611c5357611c52615305565b5b906000526020600020906003020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16148015611d0a57508573ffffffffffffffffffffffffffffffffffffffff16600560008561ffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b905060008673ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16636352211e866040518263ffffffff1660e01b8152600401611d7e9190614fd4565b602060405180830381865afa158015611d9b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dbf9190615004565b73ffffffffffffffffffffffffffffffffffffffff16149050818015611de25750805b15611e565787600460008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018461ffff1681548110611e4057611e3f615305565b5b9060005260206000209060030201600101819055505b50505b50508080611e6690615363565b9150506119fd565b50505060016000819055505050565b611e85612d03565b73ffffffffffffffffffffffffffffffffffffffff16611ea3611648565b73ffffffffffffffffffffffffffffffffffffffff1614611ef9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef090615155565b60405180910390fd5b600260005403611f3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3590614f17565b60405180910390fd5b60026000819055506000815111611f8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f81906157d7565b60405180910390fd5b6000815167ffffffffffffffff811115611fa757611fa6614a87565b5b604051908082528060200260200182016040528015611fd55781602001602082028036833780820191505090505b5090506000805b83518161ffff1610156121c75760007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16636352211e868461ffff168151811061203e5761203d615305565b5b60200260200101516040518263ffffffff1660e01b81526004016120629190614fd4565b602060405180830381865afa15801561207f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120a39190615004565b90506120cd81868461ffff16815181106120c0576120bf615305565b5b6020026020010151612d0b565b6000805b85518161ffff16101561214b578273ffffffffffffffffffffffffffffffffffffffff16868261ffff168151811061210c5761210b615305565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1603612138576001915061214b565b808061214390615363565b9150506120d1565b50806121b25781858561ffff168151811061216957612168615305565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505083806121ae90615363565b9450505b505080806121bf90615363565b915050611fdc565b5060005b8161ffff168161ffff16101561221557612202838261ffff16815181106121f5576121f4615305565b5b6020026020010151612fcb565b808061220d90615363565b9150506121cb565b505050600160008190555050565b60008060038054905067ffffffffffffffff81111561224557612244614a87565b5b6040519080825280602002602001820160405280156122735781602001602082028036833780820191505090505b5090506000805b6003805490508161ffff16101561261557600060038261ffff16815481106122a5576122a4615305565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101805480602002602001604051908101604052809291908181526020016000905b828210156123f257838290600052602060002090600302016040518060800160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900461ffff1661ffff1661ffff1681526020016001820154815260200160028201548152505081526020019060010190612336565b50505050905060005b81518161ffff1610156125ff578273ffffffffffffffffffffffffffffffffffffffff1660056000848461ffff168151811061243a57612439615305565b5b60200260200101516020015161ffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614801561258257508273ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16636352211e848461ffff168151811061250157612500615305565b5b6020026020010151602001516040518263ffffffff1660e01b81526004016125299190614fd4565b602060405180830381865afa158015612546573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061256a9190615004565b73ffffffffffffffffffffffffffffffffffffffff16145b156125ec5782868661ffff168151811061259f5761259e615305565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505084806125e490615363565b9550506125ff565b80806125f790615363565b9150506123fb565b505050808061260d90615363565b91505061227a565b50809250505090565b7f000000000000000000000000000000000000000000000000000000000000000081565b61264a612d03565b73ffffffffffffffffffffffffffffffffffffffff16612668611648565b73ffffffffffffffffffffffffffffffffffffffff16146126be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126b590615155565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361272d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161272490615869565b60405180910390fd5b61273681613cce565b50565b612741612d03565b73ffffffffffffffffffffffffffffffffffffffff1661275f611648565b73ffffffffffffffffffffffffffffffffffffffff16146127b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127ac90615155565b60405180910390fd5b600160149054906101000a900460ff1615158115150361280a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612801906151e7565b60405180910390fd5b80600160146101000a81548160ff02191690831515021790555050565b60026000540361286c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161286390614f17565b60405180910390fd5b6002600081905550600160159054906101000a900460ff166128c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128ba90614f83565b60405180910390fd5b6000815111612907576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128fe906157d7565b60405180910390fd5b6000612911612d03565b905060006001905060006001905060005b84518161ffff161015612ac6578373ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16636352211e878461ffff168151811061299957612998615305565b5b60200260200101516040518263ffffffff1660e01b81526004016129bd9190614fd4565b602060405180830381865afa1580156129da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129fe9190615004565b73ffffffffffffffffffffffffffffffffffffffff1614612a225760009250612ac6565b8373ffffffffffffffffffffffffffffffffffffffff1660056000878461ffff1681518110612a5457612a53615305565b5b602002602001015161ffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612ab35760009150612ac6565b8080612abe90615363565b915050612922565b5081612b07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612afe906158fb565b60405180910390fd5b80612b47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b3e9061598d565b60405180910390fd5b60005b84518161ffff161015612b9257612b7f84868361ffff1681518110612b7257612b71615305565b5b6020026020010151612d0b565b8080612b8a90615363565b915050612b4a565b50612b9c83612fcb565b505050600160008190555050565b60025481565b60606000612bbc613d94565b905060008161ffff1667ffffffffffffffff811115612bde57612bdd614a87565b5b604051908082528060200260200182016040528015612c1757816020015b612c046146b6565b815260200190600190039081612bfc5790505b5090506000612c24613e07565b90506000805b82518161ffff161015612ce9576000612c60848361ffff1681518110612c5357612c52615305565b5b60200260200101516130aa565b905060005b81518161ffff161015612cd457818161ffff1681518110612c8957612c88615305565b5b6020026020010151868561ffff1681518110612ca857612ca7615305565b5b60200260200101819052508380612cbe90615363565b9450508080612ccc90615363565b915050612c65565b50508080612ce190615363565b915050612c2a565b508294505050505090565b6060612cfe613e07565b905090565b600033905090565b60007f0000000000000000000000000000000000000000000000000000000000000000905060005b600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101805490508161ffff161015612e25578261ffff16600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018261ffff1681548110612de157612de0615305565b5b906000526020600020906003020160000160149054906101000a900461ffff1661ffff1603612e1257809150612e25565b8080612e1d90615363565b915050612d33565b507f000000000000000000000000000000000000000000000000000000000000000061ffff168161ffff161015612f6f576000600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018261ffff1681548110612eb057612eaf615305565b5b906000526020600020906003020160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018261ffff1681548110612f5957612f58615305565b5b9060005260206000209060030201600101819055505b6000600560008461ffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050565b6000612fd6826139c3565b905080600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160006101000a81548161ffff021916908361ffff16021790555042600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201819055506000808261ffff16149050801561309b57613096836138c3565b6130a5565b6130a4836142ec565b5b505050565b606060006130b7836139c3565b905060018161ffff16101561312357600067ffffffffffffffff8111156130e1576130e0614a87565b5b60405190808252806020026020018201604052801561311a57816020015b6131076146b6565b8152602001906001900390816130ff5790505b50915050613531565b60008161ffff1667ffffffffffffffff81111561314357613142614a87565b5b60405190808252806020026020018201604052801561317c57816020015b6131696146b6565b8152602001906001900390816131615790505b5090506000805b600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101805490508161ffff161015613529576000600460008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018261ffff168154811061322e5761322d615305565b5b90600052602060002090600302016040518060800160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900461ffff1661ffff1661ffff16815260200160018201548152602001600282015481525050905060008773ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614801561337a57508773ffffffffffffffffffffffffffffffffffffffff1660056000846020015161ffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b905060008873ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16636352211e85602001516040518263ffffffff1660e01b81526004016133f29190614fd4565b602060405180830381865afa15801561340f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134339190615004565b73ffffffffffffffffffffffffffffffffffffffff161490508180156134565750805b156135135782868661ffff168151811061347357613472615305565b5b6020026020010181905250858561ffff168151811061349557613494615305565b5b60200260200101516040015142116134ae5760006134dd565b858561ffff16815181106134c5576134c4615305565b5b602002602001015160400151426134dc91906159ad565b5b868661ffff16815181106134f4576134f3615305565b5b60200260200101516060018181525050848061350f90615363565b9550505b505050808061352190615363565b915050613183565b508193505050505b919050565b6000429050600060405180608001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020018461ffff168152602001600254841161357f57600254613581565b835b81526020016000815250905060007f0000000000000000000000000000000000000000000000000000000000000000905060005b600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101805490508161ffff1610156136a7578461ffff16600460008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018261ffff168154811061366357613662615305565b5b906000526020600020906003020160000160149054906101000a900461ffff1661ffff1603613694578091506136a7565b808061369f90615363565b9150506135b5565b507f000000000000000000000000000000000000000000000000000000000000000061ffff168161ffff1610156137c55781600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018261ffff168154811061373157613730615305565b5b906000526020600020906003020160008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548161ffff021916908361ffff16021790555060408201518160010155606082015181600201559050506138b2565b600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010182908060018154018082558091505060019003906000526020600020906003020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548161ffff021916908361ffff160217905550604082015181600101556060820151816002015550505b6138bc85856143f6565b5050505050565b6138cc81614515565b5042600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020181905550600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101600061396291906146f8565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160006101000a81548161ffff021916908361ffff16021790555050565b6000806000905060005b600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101805490508161ffff161015613cc4576000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018261ffff1681548110613a7857613a77615305565b5b906000526020600020906003020160000160149054906101000a900461ffff16905060008573ffffffffffffffffffffffffffffffffffffffff16600460008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018461ffff1681548110613b0b57613b0a615305565b5b906000526020600020906003020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16148015613bc257508573ffffffffffffffffffffffffffffffffffffffff16600560008461ffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b905060008673ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16636352211e856040518263ffffffff1660e01b8152600401613c369190614fd4565b602060405180830381865afa158015613c53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c779190615004565b73ffffffffffffffffffffffffffffffffffffffff16149050808015613c9a5750815b15613cae578480613caa90615363565b9550505b5050508080613cbc90615363565b9150506139cd565b5080915050919050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080600090506000613da5613e07565b905060005b81518161ffff161015613dfe57613dde828261ffff1681518110613dd157613dd0615305565b5b60200260200101516139c3565b83613de991906159e1565b92508080613df690615363565b915050613daa565b50819250505090565b6060600060038054905067ffffffffffffffff811115613e2a57613e29614a87565b5b604051908082528060200260200182016040528015613e585781602001602082028036833780820191505090505b5090506000805b6003805490508161ffff1610156141fa57600060038261ffff1681548110613e8a57613e89615305565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101805480602002602001604051908101604052809291908181526020016000905b82821015613fd757838290600052602060002090600302016040518060800160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900461ffff1661ffff1661ffff1681526020016001820154815260200160028201548152505081526020019060010190613f1b565b50505050905060005b81518161ffff1610156141e4578273ffffffffffffffffffffffffffffffffffffffff1660056000848461ffff168151811061401f5761401e615305565b5b60200260200101516020015161ffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614801561416757508273ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16636352211e848461ffff16815181106140e6576140e5615305565b5b6020026020010151602001516040518263ffffffff1660e01b815260040161410e9190614fd4565b602060405180830381865afa15801561412b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061414f9190615004565b73ffffffffffffffffffffffffffffffffffffffff16145b156141d15782868661ffff168151811061418457614183615305565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505084806141c990615363565b9550506141e4565b80806141dc90615363565b915050613fe0565b50505080806141f290615363565b915050613e5f565b5060008161ffff1667ffffffffffffffff81111561421b5761421a614a87565b5b6040519080825280602002602001820160405280156142495781602001602082028036833780820191505090505b50905060005b8261ffff168161ffff1610156142e257838161ffff168151811061427657614275615305565b5b6020026020010151828261ffff168151811061429557614294615305565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505080806142da90615363565b91505061424f565b5080935050505090565b60005b6003805490508161ffff16101561438e578173ffffffffffffffffffffffffffffffffffffffff1660038261ffff168154811061432f5761432e615305565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160361437b57506143f3565b808061438690615363565b9150506142ef565b506003819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b50565b6000600560008361ffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415801561449d5750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b905080156144b9576144af8284612d0b565b6144b882612fcb565b5b83600560008561ffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050565b600080600090505b6003805490508110156146ab578273ffffffffffffffffffffffffffffffffffffffff166003828154811061455557614554615305565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160361469857600360016003805490506145af91906159ad565b815481106145c0576145bf615305565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600382815481106145ff576145fe615305565b5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600380548061465957614658615a17565b5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055905560019150506146b1565b80806146a390615a46565b91505061451d565b50600090505b919050565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600061ffff16815260200160008152602001600081525090565b5080546000825560030290600052602060002090810190614719919061471c565b50565b5b8082111561477b57600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556000820160146101000a81549061ffff0219169055600182016000905560028201600090555060030161471d565b5090565b6000604051905090565b600080fd5b600080fd5b600061ffff82169050919050565b6147aa81614793565b81146147b557600080fd5b50565b6000813590506147c7816147a1565b92915050565b6000602082840312156147e3576147e2614789565b5b60006147f1848285016147b8565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000614825826147fa565b9050919050565b6148358161481a565b811461484057600080fd5b50565b6000813590506148528161482c565b92915050565b60006020828403121561486e5761486d614789565b5b600061487c84828501614843565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6148ba8161481a565b82525050565b6148c981614793565b82525050565b6000819050919050565b6148e2816148cf565b82525050565b6080820160008201516148fe60008501826148b1565b50602082015161491160208501826148c0565b50604082015161492460408501826148d9565b50606082015161493760608501826148d9565b50505050565b600061494983836148e8565b60808301905092915050565b6000602082019050919050565b600061496d82614885565b6149778185614890565b9350614982836148a1565b8060005b838110156149b357815161499a888261493d565b97506149a583614955565b925050600181019050614986565b5085935050505092915050565b600060208201905081810360008301526149da8184614962565b905092915050565b60008115159050919050565b6149f7816149e2565b8114614a0257600080fd5b50565b600081359050614a14816149ee565b92915050565b600060208284031215614a3057614a2f614789565b5b6000614a3e84828501614a05565b91505092915050565b614a50816149e2565b82525050565b6000602082019050614a6b6000830184614a47565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b614abf82614a76565b810181811067ffffffffffffffff82111715614ade57614add614a87565b5b80604052505050565b6000614af161477f565b9050614afd8282614ab6565b919050565b600067ffffffffffffffff821115614b1d57614b1c614a87565b5b602082029050602081019050919050565b600080fd5b6000614b46614b4184614b02565b614ae7565b90508083825260208201905060208402830185811115614b6957614b68614b2e565b5b835b81811015614b925780614b7e88826147b8565b845260208401935050602081019050614b6b565b5050509392505050565b600082601f830112614bb157614bb0614a71565b5b8135614bc1848260208601614b33565b91505092915050565b600060208284031215614be057614bdf614789565b5b600082013567ffffffffffffffff811115614bfe57614bfd61478e565b5b614c0a84828501614b9c565b91505092915050565b614c1c81614793565b82525050565b6000602082019050614c376000830184614c13565b92915050565b6000819050919050565b6000614c62614c5d614c58846147fa565b614c3d565b6147fa565b9050919050565b6000614c7482614c47565b9050919050565b6000614c8682614c69565b9050919050565b614c9681614c7b565b82525050565b6000602082019050614cb16000830184614c8d565b92915050565b614cc0816148cf565b8114614ccb57600080fd5b50565b600081359050614cdd81614cb7565b92915050565b600060208284031215614cf957614cf8614789565b5b6000614d0784828501614cce565b91505092915050565b614d198161481a565b82525050565b6000602082019050614d346000830184614d10565b92915050565b614d43816148cf565b82525050565b6000604082019050614d5e6000830185614c13565b614d6b6020830184614d3a565b9392505050565b60008060408385031215614d8957614d88614789565b5b600083013567ffffffffffffffff811115614da757614da661478e565b5b614db385828601614b9c565b9250506020614dc485828601614cce565b9150509250929050565b6000602082019050614de36000830184614d3a565b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000614e2183836148b1565b60208301905092915050565b6000602082019050919050565b6000614e4582614de9565b614e4f8185614df4565b9350614e5a83614e05565b8060005b83811015614e8b578151614e728882614e15565b9750614e7d83614e2d565b925050600181019050614e5e565b5085935050505092915050565b60006020820190508181036000830152614eb28184614e3a565b905092915050565b600082825260208201905092915050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000614f01601f83614eba565b9150614f0c82614ecb565b602082019050919050565b60006020820190508181036000830152614f3081614ef4565b9050919050565b7f556e7374616b696e672069732063757272656e746c792064697361626c65642e600082015250565b6000614f6d602083614eba565b9150614f7882614f37565b602082019050919050565b60006020820190508181036000830152614f9c81614f60565b9050919050565b6000614fbe614fb9614fb484614793565b614c3d565b6148cf565b9050919050565b614fce81614fa3565b82525050565b6000602082019050614fe96000830184614fc5565b92915050565b600081519050614ffe8161482c565b92915050565b60006020828403121561501a57615019614789565b5b600061502884828501614fef565b91505092915050565b7f596f7520646f6e2774206f776e207468697320746f6b656e2e00000000000000600082015250565b6000615067601983614eba565b915061507282615031565b602082019050919050565b600060208201905081810360008301526150968161505a565b9050919050565b7f546f6b656e206973206e6f74207374616b65642e000000000000000000000000600082015250565b60006150d3601483614eba565b91506150de8261509d565b602082019050919050565b60006020820190508181036000830152615102816150c6565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061513f602083614eba565b915061514a82615109565b602082019050919050565b6000602082019050818103600083015261516e81615132565b9050919050565b7f546865206e65772076616c7565206973207468652073616d652061732074686560008201527f2063757272656e742076616c75652e0000000000000000000000000000000000602082015250565b60006151d1602f83614eba565b91506151dc82615175565b604082019050919050565b60006020820190508181036000830152615200816151c4565b9050919050565b7f5374616b696e672069732063757272656e746c792064697361626c65642e0000600082015250565b600061523d601e83614eba565b915061524882615207565b602082019050919050565b6000602082019050818103600083015261526c81615230565b9050919050565b7f596f75206d757374207370656369667920746f6b656e7320746f207374616b6560008201527f2e00000000000000000000000000000000000000000000000000000000000000602082015250565b60006152cf602183614eba565b91506152da82615273565b604082019050919050565b600060208201905081810360008301526152fe816152c2565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061536e82614793565b915061ffff820361538257615381615334565b5b600182019050919050565b7f596f7520646f6e2774206f776e206f6e65206f72206d6f7265206f662074686560008201527f20746f6b656e7320796f75277265207374616b696e672e000000000000000000602082015250565b60006153e9603783614eba565b91506153f48261538d565b604082019050919050565b60006020820190508181036000830152615418816153dc565b9050919050565b7f4f6e65206f72206d6f7265206f662074686520746f6b656e7320796f7527726560008201527f207374616b696e6720697320616c7265616479207374616b65642e0000000000602082015250565b600061547b603b83614eba565b91506154868261541f565b604082019050919050565b600060208201905081810360008301526154aa8161546e565b9050919050565b7f596f7520616c7265616479207374616b6564207468697320746f6b656e2e0000600082015250565b60006154e7601e83614eba565b91506154f2826154b1565b602082019050919050565b60006020820190508181036000830152615516816154da565b9050919050565b7f4f6e65206f72206d6f7265206f662074686520746f6b656e7320697320616c7260008201527f65616479207374616b65642e0000000000000000000000000000000000000000602082015250565b6000615579602c83614eba565b91506155848261551d565b604082019050919050565b600060208201905081810360008301526155a88161556c565b9050919050565b7f596f75206d757374207370656369667920746f6b656e7320746f20757064617460008201527f652e000000000000000000000000000000000000000000000000000000000000602082015250565b600061560b602283614eba565b9150615616826155af565b604082019050919050565b6000602082019050818103600083015261563a816155fe565b9050919050565b7f546f6b656e73206d7573742062656c6f6e6720746f207468652073616d65206160008201527f6464726573732e00000000000000000000000000000000000000000000000000602082015250565b600061569d602783614eba565b91506156a882615641565b604082019050919050565b600060208201905081810360008301526156cc81615690565b9050919050565b7f4f6e65206f72206d6f726520746f6b656e73206973206e6f742063757272656e60008201527f746c79207374616b65642e000000000000000000000000000000000000000000602082015250565b600061572f602b83614eba565b915061573a826156d3565b604082019050919050565b6000602082019050818103600083015261575e81615722565b9050919050565b7f596f75206d757374207370656369667920746f6b656e7320746f20756e73746160008201527f6b652e0000000000000000000000000000000000000000000000000000000000602082015250565b60006157c1602383614eba565b91506157cc82615765565b604082019050919050565b600060208201905081810360008301526157f0816157b4565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000615853602683614eba565b915061585e826157f7565b604082019050919050565b6000602082019050818103600083015261588281615846565b9050919050565b7f596f7520646f6e2774206f776e206f6e65206f72206d6f7265206f662074686560008201527f20746f6b656e7320796f7527726520756e7374616b696e672e00000000000000602082015250565b60006158e5603983614eba565b91506158f082615889565b604082019050919050565b60006020820190508181036000830152615914816158d8565b9050919050565b7f4f6e65206f72206d6f7265206f662074686520746f6b656e7320796f7527726560008201527f20756e7374616b696e67206973206e6f74207374616b65642e00000000000000602082015250565b6000615977603983614eba565b91506159828261591b565b604082019050919050565b600060208201905081810360008301526159a68161596a565b9050919050565b60006159b8826148cf565b91506159c3836148cf565b92508282039050818111156159db576159da615334565b5b92915050565b60006159ec82614793565b91506159f783614793565b9250828201905061ffff811115615a1157615a10615334565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6000615a51826148cf565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203615a8357615a82615334565b5b60018201905091905056fea2646970667358221220155505fc8a9539a8d3482f1ef7aa9657fce068c254208b9d8e10b2b580dcdd3b64736f6c63430008110033000000000000000000000000f4121a2880c225f90dc3b3466226908c9cb2b0850000000000000000000000000000000000000000000000000000000000002329
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101a85760003560e01c80637537e161116100f9578063d5abeb0111610097578063f66ab0a911610071578063f66ab0a914610458578063f687b34514610474578063f7bd560f14610492578063fe4eaa12146104b0576101a8565b8063d5abeb0114610402578063f2fde38b14610420578063f3073ee71461043c576101a8565b806394067045116100d3578063940670451461037c5780639cfcd3ec146103ac578063c5b08fa7146103c8578063d427efd1146103e4576101a8565b80637537e161146103115780638da5cb5b1461032d5780639168ae721461034b576101a8565b806335322f37116101665780636e5a0155116101405780636e5a0155146102b1578063715018a6146102cd57806372411513146102d757806374e6385a146102f3576101a8565b806335322f371461026b578063546ba763146102755780636588103b14610293576101a8565b806246aba3146101ad57806302dc0524146101c95780631307e232146101f95780631cfff51b14610215578063284dc1a2146102335780632f57ee411461024f575b600080fd5b6101c760048036038101906101c291906147cd565b6104ce565b005b6101e360048036038101906101de9190614858565b610741565b6040516101f091906149c0565b60405180910390f35b610213600480360381019061020e9190614a1a565b610753565b005b61021d610841565b60405161022a9190614a56565b60405180910390f35b61024d60048036038101906102489190614bca565b610854565b005b610269600480360381019061026491906147cd565b610bd7565b005b610273610e4a565b005b61027d610f06565b60405161028a9190614c22565b60405180910390f35b61029b610f22565b6040516102a89190614c9c565b60405180910390f35b6102cb60048036038101906102c69190614ce3565b610f46565b005b6102d5610fcc565b005b6102f160048036038101906102ec9190614bca565b611054565b005b6102fb6115ad565b6040516103089190614a56565b60405180910390f35b61032b60048036038101906103269190614858565b6115c0565b005b610335611648565b6040516103429190614d1f565b60405180910390f35b61036560048036038101906103609190614858565b611672565b604051610373929190614d49565b60405180910390f35b61039660048036038101906103919190614ce3565b6116a4565b6040516103a39190614d1f565b60405180910390f35b6103c660048036038101906103c19190614d72565b6116d7565b005b6103e260048036038101906103dd9190614bca565b611e7d565b005b6103ec612223565b6040516103f99190614c22565b60405180910390f35b61040a61261e565b6040516104179190614c22565b60405180910390f35b61043a60048036038101906104359190614858565b612642565b005b61045660048036038101906104519190614a1a565b612739565b005b610472600480360381019061046d9190614bca565b612827565b005b61047c612baa565b6040516104899190614dce565b60405180910390f35b61049a612bb0565b6040516104a791906149c0565b60405180910390f35b6104b8612cf4565b6040516104c59190614e98565b60405180910390f35b600260005403610513576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161050a90614f17565b60405180910390fd5b6002600081905550600160159054906101000a900460ff1661056a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161056190614f83565b60405180910390fd5b6000610574612d03565b90508073ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000f4121a2880c225f90dc3b3466226908c9cb2b08573ffffffffffffffffffffffffffffffffffffffff16636352211e846040518263ffffffff1660e01b81526004016105e69190614fd4565b602060405180830381865afa158015610603573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106279190615004565b73ffffffffffffffffffffffffffffffffffffffff161461067d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106749061507d565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600560008461ffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610722576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610719906150e9565b60405180910390fd5b61072c8183612d0b565b61073581612fcb565b50600160008190555050565b606061074c826130aa565b9050919050565b61075b612d03565b73ffffffffffffffffffffffffffffffffffffffff16610779611648565b73ffffffffffffffffffffffffffffffffffffffff16146107cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107c690615155565b60405180910390fd5b600160159054906101000a900460ff16151581151503610824576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161081b906151e7565b60405180910390fd5b80600160156101000a81548160ff02191690831515021790555050565b600160149054906101000a900460ff1681565b600260005403610899576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161089090614f17565b60405180910390fd5b6002600081905550600160149054906101000a900460ff166108f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e790615253565b60405180910390fd5b6000815111610934576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092b906152e5565b60405180910390fd5b600061093e612d03565b905060006001905060006001905060005b84518161ffff161015610af3578373ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000f4121a2880c225f90dc3b3466226908c9cb2b08573ffffffffffffffffffffffffffffffffffffffff16636352211e878461ffff16815181106109c6576109c5615305565b5b60200260200101516040518263ffffffff1660e01b81526004016109ea9190614fd4565b602060405180830381865afa158015610a07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a2b9190615004565b73ffffffffffffffffffffffffffffffffffffffff1614610a4f5760009250610af3565b8373ffffffffffffffffffffffffffffffffffffffff1660056000878461ffff1681518110610a8157610a80615305565b5b602002602001015161ffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603610ae05760009150610af3565b8080610aeb90615363565b91505061094f565b5081610b34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2b906153ff565b60405180910390fd5b80610b74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6b90615491565b60405180910390fd5b60005b84518161ffff161015610bbf57610bac84868361ffff1681518110610b9f57610b9e615305565b5b6020026020010151613536565b8080610bb790615363565b915050610b77565b50610bc983612fcb565b505050600160008190555050565b600260005403610c1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1390614f17565b60405180910390fd5b6002600081905550600160149054906101000a900460ff16610c73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6a90615253565b60405180910390fd5b6000610c7d612d03565b90508073ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000f4121a2880c225f90dc3b3466226908c9cb2b08573ffffffffffffffffffffffffffffffffffffffff16636352211e846040518263ffffffff1660e01b8152600401610cef9190614fd4565b602060405180830381865afa158015610d0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d309190615004565b73ffffffffffffffffffffffffffffffffffffffff1614610d86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7d9061507d565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600560008461ffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603610e2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e22906154fd565b60405180910390fd5b610e358183613536565b610e3e81612fcb565b50600160008190555050565b600260005403610e8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8690614f17565b60405180910390fd5b6002600081905550600160159054906101000a900460ff16610ee6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610edd90614f83565b60405180910390fd5b6000610ef0612d03565b9050610efb816138c3565b506001600081905550565b600080610f11612d03565b9050610f1c816139c3565b91505090565b7f000000000000000000000000f4121a2880c225f90dc3b3466226908c9cb2b08581565b610f4e612d03565b73ffffffffffffffffffffffffffffffffffffffff16610f6c611648565b73ffffffffffffffffffffffffffffffffffffffff1614610fc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb990615155565b60405180910390fd5b8060028190555050565b610fd4612d03565b73ffffffffffffffffffffffffffffffffffffffff16610ff2611648565b73ffffffffffffffffffffffffffffffffffffffff1614611048576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103f90615155565b60405180910390fd5b6110526000613cce565b565b61105c612d03565b73ffffffffffffffffffffffffffffffffffffffff1661107a611648565b73ffffffffffffffffffffffffffffffffffffffff16146110d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c790615155565b60405180910390fd5b600260005403611115576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110c90614f17565b60405180910390fd5b60026000819055506000815111611161576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611158906152e5565b60405180910390fd5b60006001905060005b82518161ffff1610156112d2577f000000000000000000000000f4121a2880c225f90dc3b3466226908c9cb2b08573ffffffffffffffffffffffffffffffffffffffff16636352211e848361ffff16815181106111ca576111c9615305565b5b60200260200101516040518263ffffffff1660e01b81526004016111ee9190614fd4565b602060405180830381865afa15801561120b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061122f9190615004565b73ffffffffffffffffffffffffffffffffffffffff1660056000858461ffff16815181106112605761125f615305565b5b602002602001015161ffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036112bf57600091506112d2565b80806112ca90615363565b91505061116a565b5080611313576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130a9061558f565b60405180910390fd5b6000825167ffffffffffffffff8111156113305761132f614a87565b5b60405190808252806020026020018201604052801561135e5781602001602082028036833780820191505090505b5090506000805b84518161ffff1610156115505760007f000000000000000000000000f4121a2880c225f90dc3b3466226908c9cb2b08573ffffffffffffffffffffffffffffffffffffffff16636352211e878461ffff16815181106113c7576113c6615305565b5b60200260200101516040518263ffffffff1660e01b81526004016113eb9190614fd4565b602060405180830381865afa158015611408573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061142c9190615004565b905061145681878461ffff168151811061144957611448615305565b5b6020026020010151613536565b6000805b85518161ffff1610156114d4578273ffffffffffffffffffffffffffffffffffffffff16868261ffff168151811061149557611494615305565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16036114c157600191506114d4565b80806114cc90615363565b91505061145a565b508061153b5781858561ffff16815181106114f2576114f1615305565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050838061153790615363565b9450505b5050808061154890615363565b915050611365565b5060005b8161ffff168161ffff16101561159e5761158b838261ffff168151811061157e5761157d615305565b5b6020026020010151612fcb565b808061159690615363565b915050611554565b50505050600160008190555050565b600160159054906101000a900460ff1681565b6115c8612d03565b73ffffffffffffffffffffffffffffffffffffffff166115e6611648565b73ffffffffffffffffffffffffffffffffffffffff161461163c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163390615155565b60405180910390fd5b611645816138c3565b50565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60046020528060005260406000206000915090508060000160009054906101000a900461ffff16908060020154905082565b60056020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6116df612d03565b73ffffffffffffffffffffffffffffffffffffffff166116fd611648565b73ffffffffffffffffffffffffffffffffffffffff1614611753576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174a90615155565b60405180910390fd5b600260005403611798576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178f90614f17565b60405180910390fd5b600260008190555060008251116117e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117db90615621565b60405180910390fd5b60007f000000000000000000000000f4121a2880c225f90dc3b3466226908c9cb2b08573ffffffffffffffffffffffffffffffffffffffff16636352211e8460008151811061183657611835615305565b5b60200260200101516040518263ffffffff1660e01b815260040161185a9190614fd4565b602060405180830381865afa158015611877573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061189b9190615004565b905060006001905060005b84518161ffff1610156119b9578273ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000f4121a2880c225f90dc3b3466226908c9cb2b08573ffffffffffffffffffffffffffffffffffffffff16636352211e878461ffff168151811061191d5761191c615305565b5b60200260200101516040518263ffffffff1660e01b81526004016119419190614fd4565b602060405180830381865afa15801561195e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119829190615004565b73ffffffffffffffffffffffffffffffffffffffff16146119a657600091506119b9565b80806119b190615363565b9150506118a6565b50806119fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f1906156b3565b60405180910390fd5b60005b84518161ffff161015611e6e576000858261ffff1681518110611a2357611a22615305565b5b6020026020010151905060007f0000000000000000000000000000000000000000000000000000000000002329905060005b600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101805490508161ffff161015611b47578261ffff16600460008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018261ffff1681548110611b0357611b02615305565b5b906000526020600020906003020160000160149054906101000a900461ffff1661ffff1603611b3457809150611b47565b8080611b3f90615363565b915050611a55565b507f000000000000000000000000000000000000000000000000000000000000232961ffff168161ffff1610611bb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba990615745565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000232961ffff168161ffff161015611e595760008573ffffffffffffffffffffffffffffffffffffffff16600460008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018361ffff1681548110611c5357611c52615305565b5b906000526020600020906003020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16148015611d0a57508573ffffffffffffffffffffffffffffffffffffffff16600560008561ffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b905060008673ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000f4121a2880c225f90dc3b3466226908c9cb2b08573ffffffffffffffffffffffffffffffffffffffff16636352211e866040518263ffffffff1660e01b8152600401611d7e9190614fd4565b602060405180830381865afa158015611d9b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dbf9190615004565b73ffffffffffffffffffffffffffffffffffffffff16149050818015611de25750805b15611e565787600460008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018461ffff1681548110611e4057611e3f615305565b5b9060005260206000209060030201600101819055505b50505b50508080611e6690615363565b9150506119fd565b50505060016000819055505050565b611e85612d03565b73ffffffffffffffffffffffffffffffffffffffff16611ea3611648565b73ffffffffffffffffffffffffffffffffffffffff1614611ef9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef090615155565b60405180910390fd5b600260005403611f3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3590614f17565b60405180910390fd5b60026000819055506000815111611f8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f81906157d7565b60405180910390fd5b6000815167ffffffffffffffff811115611fa757611fa6614a87565b5b604051908082528060200260200182016040528015611fd55781602001602082028036833780820191505090505b5090506000805b83518161ffff1610156121c75760007f000000000000000000000000f4121a2880c225f90dc3b3466226908c9cb2b08573ffffffffffffffffffffffffffffffffffffffff16636352211e868461ffff168151811061203e5761203d615305565b5b60200260200101516040518263ffffffff1660e01b81526004016120629190614fd4565b602060405180830381865afa15801561207f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120a39190615004565b90506120cd81868461ffff16815181106120c0576120bf615305565b5b6020026020010151612d0b565b6000805b85518161ffff16101561214b578273ffffffffffffffffffffffffffffffffffffffff16868261ffff168151811061210c5761210b615305565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1603612138576001915061214b565b808061214390615363565b9150506120d1565b50806121b25781858561ffff168151811061216957612168615305565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505083806121ae90615363565b9450505b505080806121bf90615363565b915050611fdc565b5060005b8161ffff168161ffff16101561221557612202838261ffff16815181106121f5576121f4615305565b5b6020026020010151612fcb565b808061220d90615363565b9150506121cb565b505050600160008190555050565b60008060038054905067ffffffffffffffff81111561224557612244614a87565b5b6040519080825280602002602001820160405280156122735781602001602082028036833780820191505090505b5090506000805b6003805490508161ffff16101561261557600060038261ffff16815481106122a5576122a4615305565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101805480602002602001604051908101604052809291908181526020016000905b828210156123f257838290600052602060002090600302016040518060800160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900461ffff1661ffff1661ffff1681526020016001820154815260200160028201548152505081526020019060010190612336565b50505050905060005b81518161ffff1610156125ff578273ffffffffffffffffffffffffffffffffffffffff1660056000848461ffff168151811061243a57612439615305565b5b60200260200101516020015161ffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614801561258257508273ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000f4121a2880c225f90dc3b3466226908c9cb2b08573ffffffffffffffffffffffffffffffffffffffff16636352211e848461ffff168151811061250157612500615305565b5b6020026020010151602001516040518263ffffffff1660e01b81526004016125299190614fd4565b602060405180830381865afa158015612546573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061256a9190615004565b73ffffffffffffffffffffffffffffffffffffffff16145b156125ec5782868661ffff168151811061259f5761259e615305565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505084806125e490615363565b9550506125ff565b80806125f790615363565b9150506123fb565b505050808061260d90615363565b91505061227a565b50809250505090565b7f000000000000000000000000000000000000000000000000000000000000232981565b61264a612d03565b73ffffffffffffffffffffffffffffffffffffffff16612668611648565b73ffffffffffffffffffffffffffffffffffffffff16146126be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126b590615155565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361272d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161272490615869565b60405180910390fd5b61273681613cce565b50565b612741612d03565b73ffffffffffffffffffffffffffffffffffffffff1661275f611648565b73ffffffffffffffffffffffffffffffffffffffff16146127b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127ac90615155565b60405180910390fd5b600160149054906101000a900460ff1615158115150361280a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612801906151e7565b60405180910390fd5b80600160146101000a81548160ff02191690831515021790555050565b60026000540361286c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161286390614f17565b60405180910390fd5b6002600081905550600160159054906101000a900460ff166128c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128ba90614f83565b60405180910390fd5b6000815111612907576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128fe906157d7565b60405180910390fd5b6000612911612d03565b905060006001905060006001905060005b84518161ffff161015612ac6578373ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000f4121a2880c225f90dc3b3466226908c9cb2b08573ffffffffffffffffffffffffffffffffffffffff16636352211e878461ffff168151811061299957612998615305565b5b60200260200101516040518263ffffffff1660e01b81526004016129bd9190614fd4565b602060405180830381865afa1580156129da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129fe9190615004565b73ffffffffffffffffffffffffffffffffffffffff1614612a225760009250612ac6565b8373ffffffffffffffffffffffffffffffffffffffff1660056000878461ffff1681518110612a5457612a53615305565b5b602002602001015161ffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612ab35760009150612ac6565b8080612abe90615363565b915050612922565b5081612b07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612afe906158fb565b60405180910390fd5b80612b47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b3e9061598d565b60405180910390fd5b60005b84518161ffff161015612b9257612b7f84868361ffff1681518110612b7257612b71615305565b5b6020026020010151612d0b565b8080612b8a90615363565b915050612b4a565b50612b9c83612fcb565b505050600160008190555050565b60025481565b60606000612bbc613d94565b905060008161ffff1667ffffffffffffffff811115612bde57612bdd614a87565b5b604051908082528060200260200182016040528015612c1757816020015b612c046146b6565b815260200190600190039081612bfc5790505b5090506000612c24613e07565b90506000805b82518161ffff161015612ce9576000612c60848361ffff1681518110612c5357612c52615305565b5b60200260200101516130aa565b905060005b81518161ffff161015612cd457818161ffff1681518110612c8957612c88615305565b5b6020026020010151868561ffff1681518110612ca857612ca7615305565b5b60200260200101819052508380612cbe90615363565b9450508080612ccc90615363565b915050612c65565b50508080612ce190615363565b915050612c2a565b508294505050505090565b6060612cfe613e07565b905090565b600033905090565b60007f0000000000000000000000000000000000000000000000000000000000002329905060005b600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101805490508161ffff161015612e25578261ffff16600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018261ffff1681548110612de157612de0615305565b5b906000526020600020906003020160000160149054906101000a900461ffff1661ffff1603612e1257809150612e25565b8080612e1d90615363565b915050612d33565b507f000000000000000000000000000000000000000000000000000000000000232961ffff168161ffff161015612f6f576000600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018261ffff1681548110612eb057612eaf615305565b5b906000526020600020906003020160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018261ffff1681548110612f5957612f58615305565b5b9060005260206000209060030201600101819055505b6000600560008461ffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050565b6000612fd6826139c3565b905080600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160006101000a81548161ffff021916908361ffff16021790555042600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201819055506000808261ffff16149050801561309b57613096836138c3565b6130a5565b6130a4836142ec565b5b505050565b606060006130b7836139c3565b905060018161ffff16101561312357600067ffffffffffffffff8111156130e1576130e0614a87565b5b60405190808252806020026020018201604052801561311a57816020015b6131076146b6565b8152602001906001900390816130ff5790505b50915050613531565b60008161ffff1667ffffffffffffffff81111561314357613142614a87565b5b60405190808252806020026020018201604052801561317c57816020015b6131696146b6565b8152602001906001900390816131615790505b5090506000805b600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101805490508161ffff161015613529576000600460008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018261ffff168154811061322e5761322d615305565b5b90600052602060002090600302016040518060800160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900461ffff1661ffff1661ffff16815260200160018201548152602001600282015481525050905060008773ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614801561337a57508773ffffffffffffffffffffffffffffffffffffffff1660056000846020015161ffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b905060008873ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000f4121a2880c225f90dc3b3466226908c9cb2b08573ffffffffffffffffffffffffffffffffffffffff16636352211e85602001516040518263ffffffff1660e01b81526004016133f29190614fd4565b602060405180830381865afa15801561340f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134339190615004565b73ffffffffffffffffffffffffffffffffffffffff161490508180156134565750805b156135135782868661ffff168151811061347357613472615305565b5b6020026020010181905250858561ffff168151811061349557613494615305565b5b60200260200101516040015142116134ae5760006134dd565b858561ffff16815181106134c5576134c4615305565b5b602002602001015160400151426134dc91906159ad565b5b868661ffff16815181106134f4576134f3615305565b5b60200260200101516060018181525050848061350f90615363565b9550505b505050808061352190615363565b915050613183565b508193505050505b919050565b6000429050600060405180608001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020018461ffff168152602001600254841161357f57600254613581565b835b81526020016000815250905060007f0000000000000000000000000000000000000000000000000000000000002329905060005b600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101805490508161ffff1610156136a7578461ffff16600460008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018261ffff168154811061366357613662615305565b5b906000526020600020906003020160000160149054906101000a900461ffff1661ffff1603613694578091506136a7565b808061369f90615363565b9150506135b5565b507f000000000000000000000000000000000000000000000000000000000000232961ffff168161ffff1610156137c55781600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018261ffff168154811061373157613730615305565b5b906000526020600020906003020160008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548161ffff021916908361ffff16021790555060408201518160010155606082015181600201559050506138b2565b600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010182908060018154018082558091505060019003906000526020600020906003020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548161ffff021916908361ffff160217905550604082015181600101556060820151816002015550505b6138bc85856143f6565b5050505050565b6138cc81614515565b5042600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020181905550600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101600061396291906146f8565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160006101000a81548161ffff021916908361ffff16021790555050565b6000806000905060005b600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101805490508161ffff161015613cc4576000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018261ffff1681548110613a7857613a77615305565b5b906000526020600020906003020160000160149054906101000a900461ffff16905060008573ffffffffffffffffffffffffffffffffffffffff16600460008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018461ffff1681548110613b0b57613b0a615305565b5b906000526020600020906003020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16148015613bc257508573ffffffffffffffffffffffffffffffffffffffff16600560008461ffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b905060008673ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000f4121a2880c225f90dc3b3466226908c9cb2b08573ffffffffffffffffffffffffffffffffffffffff16636352211e856040518263ffffffff1660e01b8152600401613c369190614fd4565b602060405180830381865afa158015613c53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c779190615004565b73ffffffffffffffffffffffffffffffffffffffff16149050808015613c9a5750815b15613cae578480613caa90615363565b9550505b5050508080613cbc90615363565b9150506139cd565b5080915050919050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080600090506000613da5613e07565b905060005b81518161ffff161015613dfe57613dde828261ffff1681518110613dd157613dd0615305565b5b60200260200101516139c3565b83613de991906159e1565b92508080613df690615363565b915050613daa565b50819250505090565b6060600060038054905067ffffffffffffffff811115613e2a57613e29614a87565b5b604051908082528060200260200182016040528015613e585781602001602082028036833780820191505090505b5090506000805b6003805490508161ffff1610156141fa57600060038261ffff1681548110613e8a57613e89615305565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101805480602002602001604051908101604052809291908181526020016000905b82821015613fd757838290600052602060002090600302016040518060800160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900461ffff1661ffff1661ffff1681526020016001820154815260200160028201548152505081526020019060010190613f1b565b50505050905060005b81518161ffff1610156141e4578273ffffffffffffffffffffffffffffffffffffffff1660056000848461ffff168151811061401f5761401e615305565b5b60200260200101516020015161ffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614801561416757508273ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000f4121a2880c225f90dc3b3466226908c9cb2b08573ffffffffffffffffffffffffffffffffffffffff16636352211e848461ffff16815181106140e6576140e5615305565b5b6020026020010151602001516040518263ffffffff1660e01b815260040161410e9190614fd4565b602060405180830381865afa15801561412b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061414f9190615004565b73ffffffffffffffffffffffffffffffffffffffff16145b156141d15782868661ffff168151811061418457614183615305565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505084806141c990615363565b9550506141e4565b80806141dc90615363565b915050613fe0565b50505080806141f290615363565b915050613e5f565b5060008161ffff1667ffffffffffffffff81111561421b5761421a614a87565b5b6040519080825280602002602001820160405280156142495781602001602082028036833780820191505090505b50905060005b8261ffff168161ffff1610156142e257838161ffff168151811061427657614275615305565b5b6020026020010151828261ffff168151811061429557614294615305565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505080806142da90615363565b91505061424f565b5080935050505090565b60005b6003805490508161ffff16101561438e578173ffffffffffffffffffffffffffffffffffffffff1660038261ffff168154811061432f5761432e615305565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160361437b57506143f3565b808061438690615363565b9150506142ef565b506003819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b50565b6000600560008361ffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415801561449d5750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b905080156144b9576144af8284612d0b565b6144b882612fcb565b5b83600560008561ffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050565b600080600090505b6003805490508110156146ab578273ffffffffffffffffffffffffffffffffffffffff166003828154811061455557614554615305565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160361469857600360016003805490506145af91906159ad565b815481106145c0576145bf615305565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600382815481106145ff576145fe615305565b5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600380548061465957614658615a17565b5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055905560019150506146b1565b80806146a390615a46565b91505061451d565b50600090505b919050565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600061ffff16815260200160008152602001600081525090565b5080546000825560030290600052602060002090810190614719919061471c565b50565b5b8082111561477b57600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556000820160146101000a81549061ffff0219169055600182016000905560028201600090555060030161471d565b5090565b6000604051905090565b600080fd5b600080fd5b600061ffff82169050919050565b6147aa81614793565b81146147b557600080fd5b50565b6000813590506147c7816147a1565b92915050565b6000602082840312156147e3576147e2614789565b5b60006147f1848285016147b8565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000614825826147fa565b9050919050565b6148358161481a565b811461484057600080fd5b50565b6000813590506148528161482c565b92915050565b60006020828403121561486e5761486d614789565b5b600061487c84828501614843565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6148ba8161481a565b82525050565b6148c981614793565b82525050565b6000819050919050565b6148e2816148cf565b82525050565b6080820160008201516148fe60008501826148b1565b50602082015161491160208501826148c0565b50604082015161492460408501826148d9565b50606082015161493760608501826148d9565b50505050565b600061494983836148e8565b60808301905092915050565b6000602082019050919050565b600061496d82614885565b6149778185614890565b9350614982836148a1565b8060005b838110156149b357815161499a888261493d565b97506149a583614955565b925050600181019050614986565b5085935050505092915050565b600060208201905081810360008301526149da8184614962565b905092915050565b60008115159050919050565b6149f7816149e2565b8114614a0257600080fd5b50565b600081359050614a14816149ee565b92915050565b600060208284031215614a3057614a2f614789565b5b6000614a3e84828501614a05565b91505092915050565b614a50816149e2565b82525050565b6000602082019050614a6b6000830184614a47565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b614abf82614a76565b810181811067ffffffffffffffff82111715614ade57614add614a87565b5b80604052505050565b6000614af161477f565b9050614afd8282614ab6565b919050565b600067ffffffffffffffff821115614b1d57614b1c614a87565b5b602082029050602081019050919050565b600080fd5b6000614b46614b4184614b02565b614ae7565b90508083825260208201905060208402830185811115614b6957614b68614b2e565b5b835b81811015614b925780614b7e88826147b8565b845260208401935050602081019050614b6b565b5050509392505050565b600082601f830112614bb157614bb0614a71565b5b8135614bc1848260208601614b33565b91505092915050565b600060208284031215614be057614bdf614789565b5b600082013567ffffffffffffffff811115614bfe57614bfd61478e565b5b614c0a84828501614b9c565b91505092915050565b614c1c81614793565b82525050565b6000602082019050614c376000830184614c13565b92915050565b6000819050919050565b6000614c62614c5d614c58846147fa565b614c3d565b6147fa565b9050919050565b6000614c7482614c47565b9050919050565b6000614c8682614c69565b9050919050565b614c9681614c7b565b82525050565b6000602082019050614cb16000830184614c8d565b92915050565b614cc0816148cf565b8114614ccb57600080fd5b50565b600081359050614cdd81614cb7565b92915050565b600060208284031215614cf957614cf8614789565b5b6000614d0784828501614cce565b91505092915050565b614d198161481a565b82525050565b6000602082019050614d346000830184614d10565b92915050565b614d43816148cf565b82525050565b6000604082019050614d5e6000830185614c13565b614d6b6020830184614d3a565b9392505050565b60008060408385031215614d8957614d88614789565b5b600083013567ffffffffffffffff811115614da757614da661478e565b5b614db385828601614b9c565b9250506020614dc485828601614cce565b9150509250929050565b6000602082019050614de36000830184614d3a565b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000614e2183836148b1565b60208301905092915050565b6000602082019050919050565b6000614e4582614de9565b614e4f8185614df4565b9350614e5a83614e05565b8060005b83811015614e8b578151614e728882614e15565b9750614e7d83614e2d565b925050600181019050614e5e565b5085935050505092915050565b60006020820190508181036000830152614eb28184614e3a565b905092915050565b600082825260208201905092915050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000614f01601f83614eba565b9150614f0c82614ecb565b602082019050919050565b60006020820190508181036000830152614f3081614ef4565b9050919050565b7f556e7374616b696e672069732063757272656e746c792064697361626c65642e600082015250565b6000614f6d602083614eba565b9150614f7882614f37565b602082019050919050565b60006020820190508181036000830152614f9c81614f60565b9050919050565b6000614fbe614fb9614fb484614793565b614c3d565b6148cf565b9050919050565b614fce81614fa3565b82525050565b6000602082019050614fe96000830184614fc5565b92915050565b600081519050614ffe8161482c565b92915050565b60006020828403121561501a57615019614789565b5b600061502884828501614fef565b91505092915050565b7f596f7520646f6e2774206f776e207468697320746f6b656e2e00000000000000600082015250565b6000615067601983614eba565b915061507282615031565b602082019050919050565b600060208201905081810360008301526150968161505a565b9050919050565b7f546f6b656e206973206e6f74207374616b65642e000000000000000000000000600082015250565b60006150d3601483614eba565b91506150de8261509d565b602082019050919050565b60006020820190508181036000830152615102816150c6565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061513f602083614eba565b915061514a82615109565b602082019050919050565b6000602082019050818103600083015261516e81615132565b9050919050565b7f546865206e65772076616c7565206973207468652073616d652061732074686560008201527f2063757272656e742076616c75652e0000000000000000000000000000000000602082015250565b60006151d1602f83614eba565b91506151dc82615175565b604082019050919050565b60006020820190508181036000830152615200816151c4565b9050919050565b7f5374616b696e672069732063757272656e746c792064697361626c65642e0000600082015250565b600061523d601e83614eba565b915061524882615207565b602082019050919050565b6000602082019050818103600083015261526c81615230565b9050919050565b7f596f75206d757374207370656369667920746f6b656e7320746f207374616b6560008201527f2e00000000000000000000000000000000000000000000000000000000000000602082015250565b60006152cf602183614eba565b91506152da82615273565b604082019050919050565b600060208201905081810360008301526152fe816152c2565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061536e82614793565b915061ffff820361538257615381615334565b5b600182019050919050565b7f596f7520646f6e2774206f776e206f6e65206f72206d6f7265206f662074686560008201527f20746f6b656e7320796f75277265207374616b696e672e000000000000000000602082015250565b60006153e9603783614eba565b91506153f48261538d565b604082019050919050565b60006020820190508181036000830152615418816153dc565b9050919050565b7f4f6e65206f72206d6f7265206f662074686520746f6b656e7320796f7527726560008201527f207374616b696e6720697320616c7265616479207374616b65642e0000000000602082015250565b600061547b603b83614eba565b91506154868261541f565b604082019050919050565b600060208201905081810360008301526154aa8161546e565b9050919050565b7f596f7520616c7265616479207374616b6564207468697320746f6b656e2e0000600082015250565b60006154e7601e83614eba565b91506154f2826154b1565b602082019050919050565b60006020820190508181036000830152615516816154da565b9050919050565b7f4f6e65206f72206d6f7265206f662074686520746f6b656e7320697320616c7260008201527f65616479207374616b65642e0000000000000000000000000000000000000000602082015250565b6000615579602c83614eba565b91506155848261551d565b604082019050919050565b600060208201905081810360008301526155a88161556c565b9050919050565b7f596f75206d757374207370656369667920746f6b656e7320746f20757064617460008201527f652e000000000000000000000000000000000000000000000000000000000000602082015250565b600061560b602283614eba565b9150615616826155af565b604082019050919050565b6000602082019050818103600083015261563a816155fe565b9050919050565b7f546f6b656e73206d7573742062656c6f6e6720746f207468652073616d65206160008201527f6464726573732e00000000000000000000000000000000000000000000000000602082015250565b600061569d602783614eba565b91506156a882615641565b604082019050919050565b600060208201905081810360008301526156cc81615690565b9050919050565b7f4f6e65206f72206d6f726520746f6b656e73206973206e6f742063757272656e60008201527f746c79207374616b65642e000000000000000000000000000000000000000000602082015250565b600061572f602b83614eba565b915061573a826156d3565b604082019050919050565b6000602082019050818103600083015261575e81615722565b9050919050565b7f596f75206d757374207370656369667920746f6b656e7320746f20756e73746160008201527f6b652e0000000000000000000000000000000000000000000000000000000000602082015250565b60006157c1602383614eba565b91506157cc82615765565b604082019050919050565b600060208201905081810360008301526157f0816157b4565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000615853602683614eba565b915061585e826157f7565b604082019050919050565b6000602082019050818103600083015261588281615846565b9050919050565b7f596f7520646f6e2774206f776e206f6e65206f72206d6f7265206f662074686560008201527f20746f6b656e7320796f7527726520756e7374616b696e672e00000000000000602082015250565b60006158e5603983614eba565b91506158f082615889565b604082019050919050565b60006020820190508181036000830152615914816158d8565b9050919050565b7f4f6e65206f72206d6f7265206f662074686520746f6b656e7320796f7527726560008201527f20756e7374616b696e67206973206e6f74207374616b65642e00000000000000602082015250565b6000615977603983614eba565b91506159828261591b565b604082019050919050565b600060208201905081810360008301526159a68161596a565b9050919050565b60006159b8826148cf565b91506159c3836148cf565b92508282039050818111156159db576159da615334565b5b92915050565b60006159ec82614793565b91506159f783614793565b9250828201905061ffff811115615a1157615a10615334565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6000615a51826148cf565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203615a8357615a82615334565b5b60018201905091905056fea2646970667358221220155505fc8a9539a8d3482f1ef7aa9657fce068c254208b9d8e10b2b580dcdd3b64736f6c63430008110033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000f4121a2880c225f90dc3b3466226908c9cb2b0850000000000000000000000000000000000000000000000000000000000002329
-----Decoded View---------------
Arg [0] : _nftCollection (address): 0xF4121a2880c225f90DC3B3466226908c9cB2b085
Arg [1] : _maxSupply (uint16): 9001
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000f4121a2880c225f90dc3b3466226908c9cb2b085
Arg [1] : 0000000000000000000000000000000000000000000000000000000000002329
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 27 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.