Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
- Contract name:
- Lottery
- Optimization enabled
- false
- Compiler version
- v0.8.20+commit.a1b79de6
- EVM Version
- paris
- Verified at
- 2024-06-05T10:16:05.910916Z
Constructor Arguments
0x0000000000000000000000007fdbf4fe2dbbdf956c010b3dd83177cb86eb1b14000000000000000000000000780fb5aca83f2e3f57ee18cc3094988ef49d8c3d0000000000000000000000000ca83dd56af172a1e04b667d6e64446d0b88c4a4000000000000000000000000f5b8925c7c1642ef0ccd71536e353e7b38c2198c
Arg [0] (address) : 0x7fdbf4fe2dbbdf956c010b3dd83177cb86eb1b14
Arg [1] (address) : 0x780fb5aca83f2e3f57ee18cc3094988ef49d8c3d
Arg [2] (address) : 0x0ca83dd56af172a1e04b667d6e64446d0b88c4a4
Arg [3] (address) : 0xf5b8925c7c1642ef0ccd71536e353e7b38c2198c
contracts/Lottery.sol
// SPDX-License-Identifier: Unlicensed pragma solidity 0.8.20; import {ReentrancyGuard} from "@openzeppelin/contracts/security/ReentrancyGuard.sol"; import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; import "./utils/VRFConsumerBaseV2.sol"; import "./interfaces/IErinaceusVRF.sol"; import "hardhat/console.sol"; interface ILolik { function submit(address _referral) external payable returns (uint256); function swap(uint256 amount) external; function getPooledFtnByShares(uint256 _sharesAmount) external view returns (uint256); function getSharesByPooledFtn(uint256 _ftnAmount) external view returns (uint256); } contract Lottery is VRFConsumerBaseV2, Ownable { uint256 public currentPoolID; uint256 public nextPoolID; uint256 public day; // test IErinaceusVRF public erinaceusVRF; ILolik public Lolik; ILolik public LolikWithdraw; IERC20 public stFTN; uint64 public subID; uint16 public requestConfirmations; uint32 public gasLimit; bytes32 public keyHash; // tokens that are not claimed yet uint256 public remainingTokens; uint256 public teamRewards; uint256 public totalDeposit; uint256 public fee; address public team; struct Pool { uint256 poolStart; uint32 countOfWinners; uint256 totalDeposit; uint256 totalTickets; uint256 duration; uint256 lastUpdateTime; uint256[] winnersInPool; uint256 rewardForRound; PoolStatus poolStatus; } struct PoolFlag { uint256 totalDeposit; uint256 totalTickets; uint256 lastUpdateTime; } struct User { uint256 depositFTN; uint256 tickets; uint256 lastUpdatedTime; bool rewardsClaimed; } // poolId => current user ID mapping(uint256 => uint256) public currentUserIDInPool; // poolId => Pool struct mapping(uint256 => Pool) public poolInfo; // poolId => flagId => poolFlag struct mapping(uint256 => mapping(uint256 => PoolFlag)) public poolFlag; // User address => poolID => UserID mapping(address => mapping(uint256 => uint256)) public userID; // PoolID => UserID => UserInfo mapping(uint256 => mapping(uint256 => User)) public userInfo; enum PoolStatus { notStarted, started, finished } event NewRoundAdded(uint256 indexed id, uint256 duration, uint256 start, uint256 countOfWinners); event RoundFinished(uint256 indexed id, uint256 rewardsForRound, uint256 totalDeposit); event Stake(address indexed user, uint256 amount); event UnStake(address indexed user, uint256 amount); constructor( address _erinaceusVRF, address _vaultContract, address _withdrowalContract, address _team ) VRFConsumerBaseV2(_erinaceusVRF) { erinaceusVRF = IErinaceusVRF(_erinaceusVRF); LolikWithdraw = ILolik(_withdrowalContract); Lolik = ILolik(_vaultContract); stFTN = IERC20(_vaultContract); team = _team; day = 3600; } fallback() external payable {} receive() external payable {} function setup( uint64 _subID, bytes32 _keyHash, uint32 _gasLimit, uint16 _requestConfirmations, uint256 _fee ) external onlyOwner{ subID = _subID; keyHash = _keyHash; gasLimit = _gasLimit; requestConfirmations = _requestConfirmations; fee = _fee; } function newRound(uint256 duration, uint32 countOfWinners) external onlyOwner { if(currentPoolID > 0){ require( poolInfo[currentPoolID - 1].poolStatus == PoolStatus.finished, "Previous pool is not finished" ); } poolInfo[currentPoolID].duration = duration; poolInfo[currentPoolID].poolStart = block.timestamp; poolInfo[currentPoolID].poolStatus = PoolStatus.started; poolInfo[currentPoolID].countOfWinners = countOfWinners; poolInfo[currentPoolID].lastUpdateTime = block.timestamp; poolInfo[currentPoolID].winnersInPool = new uint256[](countOfWinners); nextPoolID +=1; emit NewRoundAdded(currentPoolID, duration, block.timestamp, countOfWinners); } function finalizeRound() external { Pool storage pool = poolInfo[currentPoolID]; uint256 length = currentUserIDInPool[currentPoolID] / 100; require(pool.poolStart + pool.duration <= block.timestamp, "Pool is still active"); uint256 timestamp = block.timestamp; if (block.timestamp > pool.poolStart + pool.duration) { timestamp = pool.poolStart + pool.duration; } if(timestamp - pool.lastUpdateTime > day) { pool.totalTickets += pool.totalDeposit * ((timestamp - pool.lastUpdateTime) / day); pool.lastUpdateTime += ((timestamp - pool.lastUpdateTime) / day) * day; } console.log(" ~ finalizeRound ~ pool.totalTickets:", pool.totalTickets); for (uint256 i; i <= length; i++) { if(timestamp - poolFlag[currentPoolID][i].lastUpdateTime > day){ poolFlag[currentPoolID][i].totalTickets += poolFlag[currentPoolID][i].totalDeposit * ((timestamp - poolFlag[currentPoolID][i].lastUpdateTime) / day); poolFlag[currentPoolID][i].lastUpdateTime += ((timestamp - poolFlag[currentPoolID][i].lastUpdateTime) / day) * day; } } erinaceusVRF.requestRandomWords( keyHash, subID, requestConfirmations, gasLimit, pool.countOfWinners ); pool.poolStatus = PoolStatus.finished; uint256 rewardWithFees; if(totalDeposit > 0){ rewardWithFees = (stFTN.balanceOf(address(this)) - remainingTokens - pool.totalDeposit - teamRewards) * pool.totalDeposit / totalDeposit; pool.rewardForRound = rewardWithFees * (100 - fee) / 100; console.log(" ~ finalizeRound ~ pool.rewardForRound:", pool.rewardForRound); } remainingTokens += pool.rewardForRound + pool.totalDeposit; teamRewards = stFTN.balanceOf(address(this)) - remainingTokens; console.log(" ~ finalizeRound ~ teamRewards:", teamRewards); currentPoolID = nextPoolID; emit RoundFinished(currentPoolID, pool.rewardForRound, pool.totalDeposit); } function stake() external payable { Pool storage pool = poolInfo[currentPoolID]; uint256 userId = userID[msg.sender][currentPoolID]; require( pool.poolStatus == PoolStatus.started, "Pool is not started yet" ); require(pool.poolStart + pool.duration - day > block.timestamp, "Not allowed to stake on last day"); require(msg.value > 0, "Nothing to stake"); if (userId == 0) { currentUserIDInPool[currentPoolID]++; userId = currentUserIDInPool[currentPoolID]; } User storage user = userInfo[currentPoolID][userId]; userID[msg.sender][currentPoolID] = userId; uint256 amount = Lolik.submit{value: msg.value}(address(this)); amount = Lolik.getPooledFtnByShares(amount); _updatePool(msg.sender, amount, true); if(userInfo[currentPoolID][userId].lastUpdatedTime == 0) { userInfo[currentPoolID][userId].lastUpdatedTime = pool.poolStart + (block.timestamp - pool.poolStart) / day * day; } userInfo[currentPoolID][userId] = User({ depositFTN: user.depositFTN += amount, tickets: user.tickets, lastUpdatedTime: userInfo[currentPoolID][userId].lastUpdatedTime, rewardsClaimed: false }); totalDeposit += amount; emit Stake(msg.sender, amount); } function unstake(uint256 _amount, uint256 _poolID) external { _unStake(msg.sender, _amount, _poolID); } function _unStake(address _user, uint256 _amount, uint256 _poolID) internal { uint256 userId = userID[_user][_poolID]; User storage user = userInfo[_poolID][userId]; require(user.depositFTN >= _amount, "Insufficient deposit"); stFTN.approve(address(LolikWithdraw), _amount); LolikWithdraw.swap(_amount); if(_poolID == currentPoolID){ _updatePool(_user, _amount, false); }else{ remainingTokens -= _amount; } totalDeposit -= _amount; user.depositFTN -= _amount; _sendViaCall(payable(_user), _amount); emit UnStake(_user, _amount); } function fulfillRandomWords( uint256 requestId, uint256[] memory randomWords ) internal virtual override { if(poolInfo[currentPoolID - 1].totalTickets > 0){ uint256[] memory winners = new uint256[](randomWords.length); for(uint256 i; i < randomWords.length; i++){ winners[i] = (randomWords[i] % poolInfo[currentPoolID - 1].totalTickets); } poolInfo[currentPoolID - 1].winnersInPool = winners; } } function claimTeamRewards() external { if(teamRewards > 0){ stFTN.approve(address(LolikWithdraw), teamRewards); LolikWithdraw.swap(teamRewards); _sendViaCall(payable(team), teamRewards); teamRewards = 0; } } function check(uint256 poolID) public view returns (uint256[] memory winingNumbers) { uint256 userId = userID[msg.sender][poolID]; Pool memory pool = poolInfo[poolID]; User memory user = userInfo[poolID][userId]; uint256 userIsInFlag = userId / 100; uint256[] memory flagRange = new uint256[](2); if (userIsInFlag > 0) { for (uint256 i; i < userIsInFlag; i++) { flagRange[0] += poolFlag[poolID][i].totalTickets; } } flagRange[1] = flagRange[0] + poolFlag[poolID][userIsInFlag].totalTickets - 1; uint256[] memory usersTicketsRange = new uint256[](2); uint256 timestamp = block.timestamp; if (block.timestamp > pool.poolStart + pool.duration) { timestamp = pool.poolStart + pool.duration; } if (userId > 1) { for (uint256 j = userIsInFlag * 100; j < userId; j++) { if(timestamp - userInfo[poolID][j].lastUpdatedTime > day) { usersTicketsRange[0] += userInfo[poolID][j].tickets + userInfo[poolID][j].depositFTN * ((timestamp - userInfo[poolID][j].lastUpdatedTime) / day); }else{ usersTicketsRange[0] += userInfo[poolID][j].tickets; } } usersTicketsRange[0] += flagRange[0]; } else { usersTicketsRange[0] = flagRange[0]; } if(timestamp - user.lastUpdatedTime > day) { usersTicketsRange[1] = usersTicketsRange[0] + user.tickets + user.depositFTN * ((timestamp - user.lastUpdatedTime) / day); }else{ usersTicketsRange[1] = usersTicketsRange[0] + user.tickets; } uint256[] memory tempWiningNumbers = new uint256[]( poolInfo[poolID].countOfWinners ); uint256 index; for (uint32 k; k < pool.countOfWinners; k++) { if ( usersTicketsRange[0] <= pool.winnersInPool[k] && pool.winnersInPool[k] <= usersTicketsRange[1] ) { tempWiningNumbers[index] = pool.winnersInPool[k]; index++; } } if (index > 0) { winingNumbers = new uint256[](index); for (uint256 i; i < index; i++) { winingNumbers[i] = tempWiningNumbers[i]; } } } function claim(uint256 poolID) external { uint256[] memory winningNumbers = check(poolID); Pool memory pool = poolInfo[poolID]; uint256 userId = userID[msg.sender][poolID]; User storage user = userInfo[poolID][userId]; require(!user.rewardsClaimed, "Rewards are already claimed"); if (winningNumbers.length > 0) { stFTN.approve(address(LolikWithdraw), pool.rewardForRound * winningNumbers.length / pool.countOfWinners); LolikWithdraw.swap(pool.rewardForRound * winningNumbers.length / pool.countOfWinners); _sendViaCall(payable(msg.sender), pool.rewardForRound * winningNumbers.length / pool.countOfWinners); remainingTokens -= pool.rewardForRound * winningNumbers.length / pool.countOfWinners; user.rewardsClaimed = true; } if(user.depositFTN > 0){ _unStake(msg.sender, user.depositFTN, poolID); } } function _updatePool( address userAddress, uint256 amount, bool isStake ) internal { Pool storage pool = poolInfo[currentPoolID]; uint256 timestamp = block.timestamp; if (block.timestamp > pool.poolStart + pool.duration) { timestamp = pool.poolStart + pool.duration; } if(timestamp - pool.lastUpdateTime > day){ pool.totalTickets += pool.totalDeposit * ((timestamp - pool.lastUpdateTime) / day); pool.lastUpdateTime += ((timestamp - pool.lastUpdateTime) / day) * day; } if (amount > 0) { if (isStake) { pool.totalDeposit += amount; uint256 userId = userID[userAddress][currentPoolID]; User storage user = userInfo[currentPoolID][userId]; { uint256 id = userId / 100; if(timestamp - poolFlag[currentPoolID][id].lastUpdateTime > day){ poolFlag[currentPoolID][id].totalTickets += poolFlag[currentPoolID][id].totalDeposit * ((timestamp - poolFlag[currentPoolID][id].lastUpdateTime) / day - 1); poolFlag[currentPoolID][id].lastUpdateTime += ((timestamp - poolFlag[currentPoolID][id].lastUpdateTime) / day) * day; } poolFlag[currentPoolID][id].totalDeposit += amount; } if (user.depositFTN > 0) { if(timestamp - user.lastUpdatedTime > day){ user.tickets += user.depositFTN * ((timestamp - user.lastUpdatedTime) / day); user.lastUpdatedTime += ((timestamp - user.lastUpdatedTime) / day) * day; } } if(totalDeposit + amount > 0) { pool.rewardForRound = ((stFTN.balanceOf(address(this)) - remainingTokens - pool.totalDeposit - teamRewards) * pool.totalDeposit / (totalDeposit + amount)) * (100 - fee) / 100; console.log(" ~ pool.rewardForRound:", pool.rewardForRound); } } else { pool.totalDeposit -= amount; uint256 userId = userID[userAddress][currentPoolID]; User storage user = userInfo[currentPoolID][userId]; { uint256 id = userId / 100; if(timestamp - poolFlag[currentPoolID][id].lastUpdateTime > day){ poolFlag[currentPoolID][id].totalTickets += poolFlag[currentPoolID][id].totalDeposit * ((timestamp - poolFlag[currentPoolID][id].lastUpdateTime) / day); poolFlag[currentPoolID][id].lastUpdateTime += ((timestamp - poolFlag[currentPoolID][id].lastUpdateTime) / day) * day; } poolFlag[currentPoolID][id].totalDeposit -= amount; } if(timestamp - user.lastUpdatedTime > day){ user.tickets += user.depositFTN * ((timestamp - user.lastUpdatedTime) / day); user.lastUpdatedTime += ((timestamp - user.lastUpdatedTime) / day) * day; } if(totalDeposit - amount > 0) { pool.rewardForRound = ((stFTN.balanceOf(address(this)) - remainingTokens - pool.totalDeposit - teamRewards) * pool.totalDeposit / (totalDeposit - amount)) * (100 - fee) / 100; } } } } function getWinningNumbers(uint256 poolId) public view returns(uint256[] memory){ return poolInfo[poolId].winnersInPool; } function getChance(address _user, uint256 poolID) public view returns (uint256 chance){ uint256 userId = userID[_user][poolID]; User memory user = userInfo[poolID][userId]; Pool memory pool = poolInfo[poolID]; uint256 timestamp = block.timestamp; if (block.timestamp > pool.poolStart + pool.duration) { timestamp = pool.poolStart + pool.duration; } uint256 userTickets = user.tickets; if(timestamp - user.lastUpdatedTime > day){ userTickets += user.depositFTN * ((timestamp - user.lastUpdatedTime) / day); } uint256 totalTickets = pool.totalTickets; if(timestamp - pool.lastUpdateTime > day){ totalTickets += pool.totalDeposit * ((timestamp - pool.lastUpdateTime) / day); } chance = userTickets * 1e18 / totalTickets; } function setDay(uint256 duration) external onlyOwner { day = duration; } function _sendViaCall(address payable to, uint256 amount) internal { (bool sent, ) = to.call{value: amount}(""); if (!sent) { revert(); } } }
@openzeppelin/contracts/access/Ownable.sol
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (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 Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling 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); } }
@openzeppelin/contracts/security/ReentrancyGuard.sol
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (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() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be _NOT_ENTERED require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } /** * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a * `nonReentrant` function in the call stack. */ function _reentrancyGuardEntered() internal view returns (bool) { return _status == _ENTERED; } }
@openzeppelin/contracts/token/ERC20/IERC20.sol
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 amount) external returns (bool); }
@openzeppelin/contracts/utils/Context.sol
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.4) (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; } function _contextSuffixLength() internal view virtual returns (uint256) { return 0; } }
contracts/interfaces/IErinaceusVRF.sol
// SPDX-License-Identifier: MIT pragma solidity 0.8.20; interface IErinaceusVRF { function requestRandomWords( bytes32 keyHash, uint64 subId, uint16 requestConfirmations, uint32 callbackGasLimit, uint32 numWords ) external; }
contracts/utils/VRFConsumerBaseV2.sol
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; /** **************************************************************************** * @notice Interface for contracts using VRF randomness * ***************************************************************************** * @dev PURPOSE * * @dev Reggie the Random Oracle (not his real job) wants to provide randomness * @dev to Vera the verifier in such a way that Vera can be sure he's not * @dev making his output up to suit himself. Reggie provides Vera a public key * @dev to which he knows the secret key. Each time Vera provides a seed to * @dev Reggie, he gives back a value which is computed completely * @dev deterministically from the seed and the secret key. * * @dev Reggie provides a proof by which Vera can verify that the output was * @dev correctly computed once Reggie tells it to her, but without that proof, * @dev the output is indistinguishable to her from a uniform random sample * @dev from the output space. * * @dev The purpose of this contract is to make it easy for unrelated contracts * @dev to talk to Vera the verifier about the work Reggie is doing, to provide * @dev simple access to a verifiable source of randomness. It ensures 2 things: * @dev 1. The fulfillment came from the ErinaceusVRF * @dev 2. The consumer contract implements fulfillRandomWords. * ***************************************************************************** * @dev USAGE * * @dev Calling contracts must inherit from VRFConsumerBase, and can * @dev initialize VRFConsumerBase's attributes in their constructor as * @dev shown: * * @dev contract VRFConsumer { * @dev constructor(<other arguments>, address _erinaceusVRF, address _link) * @dev VRFConsumerBase(_erinaceusVRF) public { * @dev <initialization with other arguments goes here> * @dev } * @dev } * * @dev The oracle will have given you an ID for the VRF keypair they have * @dev committed to (let's call it keyHash). Create subscription, fund it * @dev and your consumer contract as a consumer of it (see ErinaceusVRFInterface * @dev subscription management functions). * @dev Call requestRandomWords(keyHash, subId, minimumRequestConfirmations, * @dev callbackGasLimit, numWords), * @dev see (ErinaceusVRFInterface for a description of the arguments). * * @dev Once the ErinaceusVRF has received and validated the oracle's response * @dev to your request, it will call your contract's fulfillRandomWords method. * * @dev The randomness argument to fulfillRandomWords is a set of random words * @dev generated from your requestId and the blockHash of the request. * * @dev If your contract could have concurrent requests open, you can use the * @dev requestId returned from requestRandomWords to track which response is associated * @dev with which randomness request. * @dev See "SECURITY CONSIDERATIONS" for principles to keep in mind, * @dev if your contract could have multiple requests in flight simultaneously. * * @dev Colliding `requestId`s are cryptographically impossible as long as seeds * @dev differ. * * ***************************************************************************** * @dev SECURITY CONSIDERATIONS * * @dev A method with the ability to call your fulfillRandomness method directly * @dev could spoof a VRF response with any random value, so it's critical that * @dev it cannot be directly called by anything other than this base contract * @dev (specifically, by the VRFConsumerBase.rawFulfillRandomness method). * * @dev For your users to trust that your contract's random behavior is free * @dev from malicious interference, it's best if you can write it so that all * @dev behaviors implied by a VRF response are executed *during* your * @dev fulfillRandomness method. If your contract must store the response (or * @dev anything derived from it) and use it later, you must ensure that any * @dev user-significant behavior which depends on that stored value cannot be * @dev manipulated by a subsequent VRF request. * * @dev Similarly, both miners and the VRF oracle itself have some influence * @dev over the order in which VRF responses appear on the blockchain, so if * @dev your contract could have multiple VRF requests in flight simultaneously, * @dev you must ensure that the order in which the VRF responses arrive cannot * @dev be used to manipulate your contract's user-significant behavior. * * @dev Since the block hash of the block which contains the requestRandomness * @dev call is mixed into the input to the VRF *last*, a sufficiently powerful * @dev miner could, in principle, fork the blockchain to evict the block * @dev containing the request, forcing the request to be included in a * @dev different block with a different hash, and therefore a different input * @dev to the VRF. However, such an attack would incur a substantial economic * @dev cost. This cost scales with the number of blocks the VRF oracle waits * @dev until it calls responds to a request. It is for this reason that * @dev that you can signal to an oracle you'd like them to wait longer before * @dev responding to the request (however this is not enforced in the contract * @dev and so remains effective only in the case of unmodified oracle software). */ abstract contract VRFConsumerBaseV2 { error OnlyErinaceusCanFulfill(address have, address want); // solhint-disable-next-line chainlink-solidity/prefix-immutable-variables-with-i address private immutable erinaceusVRF; /** * @param _erinaceusVRF address of ErinaceusVRF contract */ constructor(address _erinaceusVRF) { erinaceusVRF = _erinaceusVRF; } /** * @notice fulfillRandomness handles the VRF response. Your contract must * @notice implement it. See "SECURITY CONSIDERATIONS" above for important * @notice principles to keep in mind when implementing your fulfillRandomness * @notice method. * * @dev VRFConsumerBaseV2 expects its subcontracts to have a method with this * @dev signature, and will call it once it has verified the proof * @dev associated with the randomness. (It is triggered via a call to * @dev rawFulfillRandomness, below.) * * @param requestId The Id initially returned by requestRandomness * @param randomWords the VRF output expanded to the requested number of words */ // solhint-disable-next-line chainlink-solidity/prefix-internal-functions-with-underscore function fulfillRandomWords(uint256 requestId, uint256[] memory randomWords) internal virtual; // rawFulfillRandomness is called by ErinaceusVRF when it receives a valid VRF // proof. rawFulfillRandomness then calls fulfillRandomness, after validating // the origin of the call function rawFulfillRandomWords(uint256 requestId, uint256[] memory randomWords) external { if (msg.sender != erinaceusVRF) { revert OnlyErinaceusCanFulfill(msg.sender, erinaceusVRF); } fulfillRandomWords(requestId, randomWords); } }
hardhat/console.sol
// SPDX-License-Identifier: MIT pragma solidity >=0.4.22 <0.9.0; library console { address constant CONSOLE_ADDRESS = 0x000000000000000000636F6e736F6c652e6c6f67; function _sendLogPayloadImplementation(bytes memory payload) internal view { address consoleAddress = CONSOLE_ADDRESS; /// @solidity memory-safe-assembly assembly { pop( staticcall( gas(), consoleAddress, add(payload, 32), mload(payload), 0, 0 ) ) } } function _castToPure( function(bytes memory) internal view fnIn ) internal pure returns (function(bytes memory) pure fnOut) { assembly { fnOut := fnIn } } function _sendLogPayload(bytes memory payload) internal pure { _castToPure(_sendLogPayloadImplementation)(payload); } function log() internal pure { _sendLogPayload(abi.encodeWithSignature("log()")); } function logInt(int256 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(int256)", p0)); } function logUint(uint256 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256)", p0)); } function logString(string memory p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); } function logBool(bool p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); } function logAddress(address p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); } function logBytes(bytes memory p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes)", p0)); } function logBytes1(bytes1 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0)); } function logBytes2(bytes2 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0)); } function logBytes3(bytes3 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0)); } function logBytes4(bytes4 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0)); } function logBytes5(bytes5 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0)); } function logBytes6(bytes6 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0)); } function logBytes7(bytes7 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0)); } function logBytes8(bytes8 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0)); } function logBytes9(bytes9 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0)); } function logBytes10(bytes10 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0)); } function logBytes11(bytes11 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0)); } function logBytes12(bytes12 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0)); } function logBytes13(bytes13 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0)); } function logBytes14(bytes14 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0)); } function logBytes15(bytes15 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0)); } function logBytes16(bytes16 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0)); } function logBytes17(bytes17 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0)); } function logBytes18(bytes18 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0)); } function logBytes19(bytes19 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0)); } function logBytes20(bytes20 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0)); } function logBytes21(bytes21 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0)); } function logBytes22(bytes22 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0)); } function logBytes23(bytes23 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0)); } function logBytes24(bytes24 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0)); } function logBytes25(bytes25 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0)); } function logBytes26(bytes26 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0)); } function logBytes27(bytes27 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0)); } function logBytes28(bytes28 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0)); } function logBytes29(bytes29 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0)); } function logBytes30(bytes30 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0)); } function logBytes31(bytes31 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0)); } function logBytes32(bytes32 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0)); } function log(uint256 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256)", p0)); } function log(string memory p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); } function log(bool p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); } function log(address p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); } function log(uint256 p0, uint256 p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256)", p0, p1)); } function log(uint256 p0, string memory p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string)", p0, p1)); } function log(uint256 p0, bool p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool)", p0, p1)); } function log(uint256 p0, address p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address)", p0, p1)); } function log(string memory p0, uint256 p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256)", p0, p1)); } function log(string memory p0, string memory p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1)); } function log(string memory p0, bool p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1)); } function log(string memory p0, address p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1)); } function log(bool p0, uint256 p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256)", p0, p1)); } function log(bool p0, string memory p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1)); } function log(bool p0, bool p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1)); } function log(bool p0, address p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1)); } function log(address p0, uint256 p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256)", p0, p1)); } function log(address p0, string memory p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1)); } function log(address p0, bool p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1)); } function log(address p0, address p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address)", p0, p1)); } function log(uint256 p0, uint256 p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256)", p0, p1, p2)); } function log(uint256 p0, uint256 p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string)", p0, p1, p2)); } function log(uint256 p0, uint256 p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool)", p0, p1, p2)); } function log(uint256 p0, uint256 p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address)", p0, p1, p2)); } function log(uint256 p0, string memory p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256)", p0, p1, p2)); } function log(uint256 p0, string memory p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string)", p0, p1, p2)); } function log(uint256 p0, string memory p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool)", p0, p1, p2)); } function log(uint256 p0, string memory p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address)", p0, p1, p2)); } function log(uint256 p0, bool p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256)", p0, p1, p2)); } function log(uint256 p0, bool p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string)", p0, p1, p2)); } function log(uint256 p0, bool p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool)", p0, p1, p2)); } function log(uint256 p0, bool p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address)", p0, p1, p2)); } function log(uint256 p0, address p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256)", p0, p1, p2)); } function log(uint256 p0, address p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string)", p0, p1, p2)); } function log(uint256 p0, address p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool)", p0, p1, p2)); } function log(uint256 p0, address p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address)", p0, p1, p2)); } function log(string memory p0, uint256 p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256)", p0, p1, p2)); } function log(string memory p0, uint256 p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string)", p0, p1, p2)); } function log(string memory p0, uint256 p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool)", p0, p1, p2)); } function log(string memory p0, uint256 p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address)", p0, p1, p2)); } function log(string memory p0, string memory p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256)", p0, p1, p2)); } function log(string memory p0, string memory p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2)); } function log(string memory p0, string memory p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2)); } function log(string memory p0, string memory p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2)); } function log(string memory p0, bool p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256)", p0, p1, p2)); } function log(string memory p0, bool p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2)); } function log(string memory p0, bool p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2)); } function log(string memory p0, bool p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2)); } function log(string memory p0, address p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256)", p0, p1, p2)); } function log(string memory p0, address p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2)); } function log(string memory p0, address p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2)); } function log(string memory p0, address p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2)); } function log(bool p0, uint256 p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256)", p0, p1, p2)); } function log(bool p0, uint256 p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string)", p0, p1, p2)); } function log(bool p0, uint256 p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool)", p0, p1, p2)); } function log(bool p0, uint256 p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address)", p0, p1, p2)); } function log(bool p0, string memory p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256)", p0, p1, p2)); } function log(bool p0, string memory p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2)); } function log(bool p0, string memory p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2)); } function log(bool p0, string memory p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2)); } function log(bool p0, bool p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256)", p0, p1, p2)); } function log(bool p0, bool p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2)); } function log(bool p0, bool p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2)); } function log(bool p0, bool p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2)); } function log(bool p0, address p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256)", p0, p1, p2)); } function log(bool p0, address p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2)); } function log(bool p0, address p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2)); } function log(bool p0, address p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2)); } function log(address p0, uint256 p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256)", p0, p1, p2)); } function log(address p0, uint256 p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string)", p0, p1, p2)); } function log(address p0, uint256 p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool)", p0, p1, p2)); } function log(address p0, uint256 p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address)", p0, p1, p2)); } function log(address p0, string memory p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256)", p0, p1, p2)); } function log(address p0, string memory p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2)); } function log(address p0, string memory p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2)); } function log(address p0, string memory p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2)); } function log(address p0, bool p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256)", p0, p1, p2)); } function log(address p0, bool p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2)); } function log(address p0, bool p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2)); } function log(address p0, bool p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2)); } function log(address p0, address p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256)", p0, p1, p2)); } function log(address p0, address p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2)); } function log(address p0, address p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2)); } function log(address p0, address p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2)); } function log(uint256 p0, uint256 p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,string)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,bool)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,address)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,string)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,bool)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,address)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,string)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,bool)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,address)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,string)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,bool)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,address)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,string)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,bool)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,address)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,string)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,bool)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,address)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,string)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,bool)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,address)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,string)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,bool)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,address)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,string)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,bool)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,address)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,string)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,bool)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,address)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,string)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,bool)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,address)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,string)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,bool)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,address)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,string)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,bool)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,address)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,string)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,bool)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,address)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,string)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,bool)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,address)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,string)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,bool)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,address)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,uint256)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,string)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,address)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,uint256)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,string)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,address)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,uint256)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,uint256)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,string)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,uint256)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,uint256)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,uint256)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,uint256)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,uint256)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,uint256)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,uint256)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,uint256)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,uint256)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,uint256)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,uint256)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,uint256)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,uint256)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,string)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,bool)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,address)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,uint256)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,string)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,bool)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,address)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,uint256)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,string)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,address)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,uint256)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,string)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,bool)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,uint256)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,uint256)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,uint256)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,uint256)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,uint256)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,uint256)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint256)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint256)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,uint256)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,uint256)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint256)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint256)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,uint256)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,string)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,bool)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,address)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,uint256)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,string)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,bool)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,address)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,uint256)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,string)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,bool)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,address)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,uint256)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,string)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,bool)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,uint256)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,uint256)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,uint256)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,uint256)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,uint256)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,uint256)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint256)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint256)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3)); } function log(address p0, address p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,uint256)", p0, p1, p2, p3)); } function log(address p0, address p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,string)", p0, p1, p2, p3)); } function log(address p0, address p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,address)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,uint256)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint256)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint256)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3)); } }
Compiler Settings
{"outputSelection":{"*":{"*":["*"],"":["*"]}},"optimizer":{"runs":200,"enabled":false},"metadata":{"useLiteralContent":true},"libraries":{},"evmVersion":"paris"}
Contract ABI
[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"_erinaceusVRF","internalType":"address"},{"type":"address","name":"_vaultContract","internalType":"address"},{"type":"address","name":"_withdrowalContract","internalType":"address"},{"type":"address","name":"_team","internalType":"address"}]},{"type":"error","name":"OnlyErinaceusCanFulfill","inputs":[{"type":"address","name":"have","internalType":"address"},{"type":"address","name":"want","internalType":"address"}]},{"type":"event","name":"NewRoundAdded","inputs":[{"type":"uint256","name":"id","internalType":"uint256","indexed":true},{"type":"uint256","name":"duration","internalType":"uint256","indexed":false},{"type":"uint256","name":"start","internalType":"uint256","indexed":false},{"type":"uint256","name":"countOfWinners","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":true},{"type":"address","name":"newOwner","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"RoundFinished","inputs":[{"type":"uint256","name":"id","internalType":"uint256","indexed":true},{"type":"uint256","name":"rewardsForRound","internalType":"uint256","indexed":false},{"type":"uint256","name":"totalDeposit","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Stake","inputs":[{"type":"address","name":"user","internalType":"address","indexed":true},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"UnStake","inputs":[{"type":"address","name":"user","internalType":"address","indexed":true},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"fallback","stateMutability":"payable"},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract ILolik"}],"name":"Lolik","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract ILolik"}],"name":"LolikWithdraw","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256[]","name":"winingNumbers","internalType":"uint256[]"}],"name":"check","inputs":[{"type":"uint256","name":"poolID","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"claim","inputs":[{"type":"uint256","name":"poolID","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"claimTeamRewards","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"currentPoolID","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"currentUserIDInPool","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"day","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IErinaceusVRF"}],"name":"erinaceusVRF","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"fee","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"finalizeRound","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint32","name":"","internalType":"uint32"}],"name":"gasLimit","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"chance","internalType":"uint256"}],"name":"getChance","inputs":[{"type":"address","name":"_user","internalType":"address"},{"type":"uint256","name":"poolID","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256[]","name":"","internalType":"uint256[]"}],"name":"getWinningNumbers","inputs":[{"type":"uint256","name":"poolId","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"keyHash","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"newRound","inputs":[{"type":"uint256","name":"duration","internalType":"uint256"},{"type":"uint32","name":"countOfWinners","internalType":"uint32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"nextPoolID","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"totalDeposit","internalType":"uint256"},{"type":"uint256","name":"totalTickets","internalType":"uint256"},{"type":"uint256","name":"lastUpdateTime","internalType":"uint256"}],"name":"poolFlag","inputs":[{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"poolStart","internalType":"uint256"},{"type":"uint32","name":"countOfWinners","internalType":"uint32"},{"type":"uint256","name":"totalDeposit","internalType":"uint256"},{"type":"uint256","name":"totalTickets","internalType":"uint256"},{"type":"uint256","name":"duration","internalType":"uint256"},{"type":"uint256","name":"lastUpdateTime","internalType":"uint256"},{"type":"uint256","name":"rewardForRound","internalType":"uint256"},{"type":"uint8","name":"poolStatus","internalType":"enum Lottery.PoolStatus"}],"name":"poolInfo","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"rawFulfillRandomWords","inputs":[{"type":"uint256","name":"requestId","internalType":"uint256"},{"type":"uint256[]","name":"randomWords","internalType":"uint256[]"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"remainingTokens","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceOwnership","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint16","name":"","internalType":"uint16"}],"name":"requestConfirmations","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setDay","inputs":[{"type":"uint256","name":"duration","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setup","inputs":[{"type":"uint64","name":"_subID","internalType":"uint64"},{"type":"bytes32","name":"_keyHash","internalType":"bytes32"},{"type":"uint32","name":"_gasLimit","internalType":"uint32"},{"type":"uint16","name":"_requestConfirmations","internalType":"uint16"},{"type":"uint256","name":"_fee","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IERC20"}],"name":"stFTN","inputs":[]},{"type":"function","stateMutability":"payable","outputs":[],"name":"stake","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint64","name":"","internalType":"uint64"}],"name":"subID","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"team","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"teamRewards","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalDeposit","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"unstake","inputs":[{"type":"uint256","name":"_amount","internalType":"uint256"},{"type":"uint256","name":"_poolID","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"userID","inputs":[{"type":"address","name":"","internalType":"address"},{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"depositFTN","internalType":"uint256"},{"type":"uint256","name":"tickets","internalType":"uint256"},{"type":"uint256","name":"lastUpdatedTime","internalType":"uint256"},{"type":"bool","name":"rewardsClaimed","internalType":"bool"}],"name":"userInfo","inputs":[{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"receive","stateMutability":"payable"}]
Contract Creation Code
0x60a06040523480156200001157600080fd5b50604051620055893803806200558983398181016040528101906200003791906200031b565b838073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1681525050506200008d62000081620001e560201b60201c565b620001ed60201b60201c565b83600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610e10600381905550505050506200038d565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620002e382620002b6565b9050919050565b620002f581620002d6565b81146200030157600080fd5b50565b6000815190506200031581620002ea565b92915050565b60008060008060808587031215620003385762000337620002b1565b5b6000620003488782880162000304565b94505060206200035b8782880162000304565b93505060406200036e8782880162000304565b9250506060620003818782880162000304565b91505092959194509250565b6080516151d9620003b06000396000818161103d015261109101526151d96000f3fe6080604052600436106102135760003560e01c80638921b0ca11610118578063bf583903116100a0578063f2fde38b1161006f578063f2fde38b14610798578063f41dfe2b146107c1578063f6153ccd146107ec578063f68016b714610817578063fb284629146108425761021a565b8063bf583903146106ee578063cc4b97e114610719578063d7070ae214610742578063ddca3f431461076d5761021a565b80639e2c8a5b116100e75780639e2c8a5b146105f2578063aec477591461061b578063b0fb162f14610646578063b345dc8c14610671578063b5222b08146106b15761021a565b80638921b0ca146105225780638da5cb5b146105615780639cb0741b1461058c5780639d5c35ae146105b55761021a565b80635f72f4501161019b5780636acf26b91161016a5780636acf26b91461044d578063715018a61461047857806376ce29811461048f5780637b76ac91146104cc57806385f2aef2146104f75761021a565b80635f72f4501461037d57806361728f39146103ba57806362a58fb8146103e5578063669f0e82146104105761021a565b80632add13c7116101e25780632add13c7146102c9578063379607f5146102f4578063390724ac1461031d5780633a4b66f114610348578063576a3170146103525761021a565b806305c5a20b1461021c5780631526fe27146102455780631e820325146102895780631fe543e3146102a05761021a565b3661021a57005b005b34801561022857600080fd5b50610243600480360381019061023e9190614061565b610859565b005b34801561025157600080fd5b5061026c600480360381019061026791906140dc565b6108dd565b60405161028098979695949392919061419e565b60405180910390f35b34801561029557600080fd5b5061029e610942565b005b3480156102ac57600080fd5b506102c760048036038101906102c29190614375565b61103b565b005b3480156102d557600080fd5b506102de6110fb565b6040516102eb91906143d1565b60405180910390f35b34801561030057600080fd5b5061031b600480360381019061031691906140dc565b611101565b005b34801561032957600080fd5b50610332611548565b60405161033f91906143d1565b60405180910390f35b61035061154e565b005b34801561035e57600080fd5b50610367611acb565b604051610374919061446b565b60405180910390f35b34801561038957600080fd5b506103a4600480360381019061039f91906140dc565b611af1565b6040516103b19190614544565b60405180910390f35b3480156103c657600080fd5b506103cf612410565b6040516103dc9190614575565b60405180910390f35b3480156103f157600080fd5b506103fa612416565b604051610407919061459f565b60405180910390f35b34801561041c57600080fd5b50610437600480360381019061043291906140dc565b612430565b60405161044491906143d1565b60405180910390f35b34801561045957600080fd5b50610462612448565b60405161046f91906145db565b60405180910390f35b34801561048457600080fd5b5061048d61246e565b005b34801561049b57600080fd5b506104b660048036038101906104b19190614634565b612482565b6040516104c391906143d1565b60405180910390f35b3480156104d857600080fd5b506104e16124a7565b6040516104ee91906143d1565b60405180910390f35b34801561050357600080fd5b5061050c6124ad565b6040516105199190614683565b60405180910390f35b34801561052e57600080fd5b506105496004803603810190610544919061469e565b6124d3565b604051610558939291906146de565b60405180910390f35b34801561056d57600080fd5b5061057661250a565b6040516105839190614683565b60405180910390f35b34801561059857600080fd5b506105b360048036038101906105ae91906140dc565b612533565b005b3480156105c157600080fd5b506105dc60048036038101906105d791906140dc565b612545565b6040516105e99190614544565b60405180910390f35b3480156105fe57600080fd5b506106196004803603810190610614919061469e565b6125b3565b005b34801561062757600080fd5b506106306125c2565b60405161063d9190614736565b60405180910390f35b34801561065257600080fd5b5061065b6125e8565b6040516106689190614760565b60405180910390f35b34801561067d57600080fd5b506106986004803603810190610693919061469e565b6125fc565b6040516106a89493929190614796565b60405180910390f35b3480156106bd57600080fd5b506106d860048036038101906106d39190614634565b612646565b6040516106e591906143d1565b60405180910390f35b3480156106fa57600080fd5b5061070361293c565b60405161071091906143d1565b60405180910390f35b34801561072557600080fd5b50610740600480360381019061073b91906147db565b612942565b005b34801561074e57600080fd5b50610757612b92565b60405161076491906143d1565b60405180910390f35b34801561077957600080fd5b50610782612b98565b60405161078f91906143d1565b60405180910390f35b3480156107a457600080fd5b506107bf60048036038101906107ba919061481b565b612b9e565b005b3480156107cd57600080fd5b506107d6612c21565b6040516107e391906145db565b60405180910390f35b3480156107f857600080fd5b50610801612c47565b60405161080e91906143d1565b60405180910390f35b34801561082357600080fd5b5061082c612c4d565b6040516108399190614848565b60405180910390f35b34801561084e57600080fd5b50610857612c63565b005b610861612dfb565b84600760146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508360098190555082600860006101000a81548163ffffffff021916908363ffffffff160217905550816007601c6101000a81548161ffff021916908361ffff16021790555080600d819055505050505050565b60106020528060005260406000206000915090508060000154908060010160009054906101000a900463ffffffff16908060020154908060030154908060040154908060050154908060070154908060080160009054906101000a900460ff16905088565b6000601060006001548152602001908152602001600020905060006064600f600060015481526020019081526020016000205461097f91906148c1565b9050428260040154836000015461099691906148f2565b11156109d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109ce90614983565b60405180910390fd5b6000429050826004015483600001546109f091906148f2565b421115610a0e5782600401548360000154610a0b91906148f2565b90505b600354836005015482610a2191906149a3565b1115610ab257600354836005015482610a3a91906149a3565b610a4491906148c1565b8360020154610a5391906149d7565b836003016000828254610a6691906148f2565b92505081905550600354600354846005015483610a8391906149a3565b610a8d91906148c1565b610a9791906149d7565b836005016000828254610aaa91906148f2565b925050819055505b610ad8604051806060016040528060258152602001615158602591398460030154612e79565b60005b828111610c775760035460116000600154815260200190815260200160002060008381526020019081526020016000206002015483610b1a91906149a3565b1115610c645760035460116000600154815260200190815260200160002060008381526020019081526020016000206002015483610b5891906149a3565b610b6291906148c1565b601160006001548152602001908152602001600020600083815260200190815260200160002060000154610b9691906149d7565b60116000600154815260200190815260200160002060008381526020019081526020016000206001016000828254610bce91906148f2565b9250508190555060035460035460116000600154815260200190815260200160002060008481526020019081526020016000206002015484610c1091906149a3565b610c1a91906148c1565b610c2491906149d7565b60116000600154815260200190815260200160002060008381526020019081526020016000206002016000828254610c5c91906148f2565b925050819055505b8080610c6f90614a19565b915050610adb565b50600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635d3b1d30600954600760149054906101000a900467ffffffffffffffff166007601c9054906101000a900461ffff16600860009054906101000a900463ffffffff168860010160009054906101000a900463ffffffff166040518663ffffffff1660e01b8152600401610d29959493929190614a61565b600060405180830381600087803b158015610d4357600080fd5b505af1158015610d57573d6000803e3d6000fd5b5050505060028360080160006101000a81548160ff02191690836002811115610d8357610d82614127565b5b0217905550600080600c541115610ecc57600c548460020154600b548660020154600a54600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610e029190614683565b602060405180830381865afa158015610e1f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e439190614ac9565b610e4d91906149a3565b610e5791906149a3565b610e6191906149a3565b610e6b91906149d7565b610e7591906148c1565b90506064600d546064610e8891906149a3565b82610e9391906149d7565b610e9d91906148c1565b8460070181905550610ecb60405180606001604052806027815260200161517d602791398560070154612e79565b5b83600201548460070154610ee091906148f2565b600a6000828254610ef191906148f2565b92505081905550600a54600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610f569190614683565b602060405180830381865afa158015610f73573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f979190614ac9565b610fa191906149a3565b600b81905550610fe86040518060400160405280601f81526020017f207e2066696e616c697a65526f756e64207e207465616d526577617264733a00815250600b54612e79565b6002546001819055506001547f87d39ec94082b342cc157bbd80096ad2fa03e1698a57924ad16e36709cb0e2878560070154866002015460405161102d929190614af6565b60405180910390a250505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146110ed57337f00000000000000000000000000000000000000000000000000000000000000006040517f1cdc5ebb0000000000000000000000000000000000000000000000000000000081526004016110e4929190614b1f565b60405180910390fd5b6110f78282612f15565b5050565b60015481565b600061110c82611af1565b905060006010600084815260200190815260200160002060405180610120016040529081600082015481526020016001820160009054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160028201548152602001600382015481526020016004820154815260200160058201548152602001600682018054806020026020016040519081016040528092919081815260200182805480156111d657602002820191906000526020600020905b8154815260200190600101908083116111c2575b50505050508152602001600782015481526020016008820160009054906101000a900460ff16600281111561120e5761120d614127565b5b60028111156112205761121f614127565b5b8152505090506000601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000858152602001908152602001600020549050600060136000868152602001908152602001600020600083815260200190815260200160002090508060030160009054906101000a900460ff16156112f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ec90614b94565b60405180910390fd5b60008451111561152457600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16856020015163ffffffff1687518760e0015161137c91906149d7565b61138691906148c1565b6040518363ffffffff1660e01b81526004016113a3929190614bb4565b6020604051808303816000875af11580156113c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113e69190614c09565b50600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166394b918de846020015163ffffffff1686518660e0015161144191906149d7565b61144b91906148c1565b6040518263ffffffff1660e01b815260040161146791906143d1565b600060405180830381600087803b15801561148157600080fd5b505af1158015611495573d6000803e3d6000fd5b505050506114c833846020015163ffffffff1686518660e001516114b991906149d7565b6114c391906148c1565b613055565b826020015163ffffffff1684518460e001516114e491906149d7565b6114ee91906148c1565b600a60008282546114ff91906149a3565b9250508190555060018160030160006101000a81548160ff0219169083151502179055505b60008160000154111561154157611540338260000154876130d0565b5b5050505050565b60025481565b600060106000600154815260200190815260200160002090506000601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001548152602001908152602001600020549050600160028111156115d2576115d1614127565b5b8260080160009054906101000a900460ff1660028111156115f6576115f5614127565b5b14611636576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162d90614c82565b60405180910390fd5b426003548360040154846000015461164e91906148f2565b61165891906149a3565b11611698576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168f90614cee565b60405180910390fd5b600034116116db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d290614d5a565b60405180910390fd5b6000810361172757600f60006001548152602001908152602001600020600081548092919061170990614a19565b9190505550600f600060015481526020019081526020016000205490505b60006013600060015481526020019081526020016000206000838152602001908152602001600020905081601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001548152602001908152602001600020819055506000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a1903eab34306040518363ffffffff1660e01b81526004016118069190614683565b60206040518083038185885af1158015611824573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906118499190614ac9565b9050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630d48764e826040518263ffffffff1660e01b81526004016118a691906143d1565b602060405180830381865afa1580156118c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118e79190614ac9565b90506118f5338260016133ab565b60006013600060015481526020019081526020016000206000858152602001908152602001600020600201540361198d5760035460035485600001544261193c91906149a3565b61194691906148c1565b61195091906149d7565b846000015461195f91906148f2565b6013600060015481526020019081526020016000206000858152602001908152602001600020600201819055505b6040518060800160405280828460000160008282546119ac91906148f2565b925050819055815260200183600101548152602001601360006001548152602001908152602001600020600086815260200190815260200160002060020154815260200160001515815250601360006001548152602001908152602001600020600085815260200190815260200160002060008201518160000155602082015181600101556040820151816002015560608201518160030160006101000a81548160ff02191690831515021790555090505080600c6000828254611a7091906148f2565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167febedb8b3c678666e7f36970bc8f57abf6d8fa2e828c0da91ea5b75bf68ed101a82604051611abd91906143d1565b60405180910390a250505050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606000601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905060006010600085815260200190815260200160002060405180610120016040529081600082015481526020016001820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016002820154815260200160038201548152602001600482015481526020016005820154815260200160068201805480602002602001604051908101604052809291908181526020018280548015611c1057602002820191906000526020600020905b815481526020019060010190808311611bfc575b50505050508152602001600782015481526020016008820160009054906101000a900460ff166002811115611c4857611c47614127565b5b6002811115611c5a57611c59614127565b5b81525050905060006013600086815260200190815260200160002060008481526020019081526020016000206040518060800160405290816000820154815260200160018201548152602001600282015481526020016003820160009054906101000a900460ff16151515158152505090506000606484611cdb91906148c1565b90506000600267ffffffffffffffff811115611cfa57611cf9614232565b5b604051908082528060200260200182016040528015611d285781602001602082028036833780820191505090505b5090506000821115611dab5760005b82811015611da9576011600089815260200190815260200160002060008281526020019081526020016000206001015482600081518110611d7b57611d7a614d7a565b5b60200260200101818151611d8f91906148f2565b915081815250508080611da190614a19565b915050611d37565b505b60016011600089815260200190815260200160002060008481526020019081526020016000206001015482600081518110611de957611de8614d7a565b5b6020026020010151611dfb91906148f2565b611e0591906149a3565b81600181518110611e1957611e18614d7a565b5b6020026020010181815250506000600267ffffffffffffffff811115611e4257611e41614232565b5b604051908082528060200260200182016040528015611e705781602001602082028036833780820191505090505b509050600042905085608001518660000151611e8c91906148f2565b421115611eaa5785608001518660000151611ea791906148f2565b90505b600187111561209d576000606485611ec291906149d7565b90505b8781101561204c57600354601360008c815260200190815260200160002060008381526020019081526020016000206002015483611f0391906149a3565b1115611fe157600354601360008c815260200190815260200160002060008381526020019081526020016000206002015483611f3f91906149a3565b611f4991906148c1565b601360008c8152602001908152602001600020600083815260200190815260200160002060000154611f7b91906149d7565b601360008c8152602001908152602001600020600083815260200190815260200160002060010154611fad91906148f2565b83600081518110611fc157611fc0614d7a565b5b60200260200101818151611fd591906148f2565b91508181525050612039565b601360008b81526020019081526020016000206000828152602001908152602001600020600101548360008151811061201d5761201c614d7a565b5b6020026020010181815161203191906148f2565b915081815250505b808061204490614a19565b915050611ec5565b508260008151811061206157612060614d7a565b5b60200260200101518260008151811061207d5761207c614d7a565b5b6020026020010181815161209191906148f2565b915081815250506120da565b826000815181106120b1576120b0614d7a565b5b6020026020010151826000815181106120cd576120cc614d7a565b5b6020026020010181815250505b6003548560400151826120ed91906149a3565b11156121795760035485604001518261210691906149a3565b61211091906148c1565b856000015161211f91906149d7565b85602001518360008151811061213857612137614d7a565b5b602002602001015161214a91906148f2565b61215491906148f2565b8260018151811061216857612167614d7a565b5b6020026020010181815250506121c5565b84602001518260008151811061219257612191614d7a565b5b60200260200101516121a491906148f2565b826001815181106121b8576121b7614d7a565b5b6020026020010181815250505b6000601060008b815260200190815260200160002060010160009054906101000a900463ffffffff1663ffffffff1667ffffffffffffffff81111561220d5761220c614232565b5b60405190808252806020026020018201604052801561223b5781602001602082028036833780820191505090505b5090506000805b886020015163ffffffff168163ffffffff161015612353578860c001518163ffffffff168151811061227757612276614d7a565b5b60200260200101518560008151811061229357612292614d7a565b5b6020026020010151111580156122e85750846001815181106122b8576122b7614d7a565b5b60200260200101518960c001518263ffffffff16815181106122dd576122dc614d7a565b5b602002602001015111155b15612340578860c001518163ffffffff168151811061230a57612309614d7a565b5b602002602001015183838151811061232557612324614d7a565b5b602002602001018181525050818061233c90614a19565b9250505b808061234b90614da9565b915050612242565b506000811115612402578067ffffffffffffffff81111561237757612376614232565b5b6040519080825280602002602001820160405280156123a55781602001602082028036833780820191505090505b50995060005b81811015612400578281815181106123c6576123c5614d7a565b5b60200260200101518b82815181106123e1576123e0614d7a565b5b60200260200101818152505080806123f890614a19565b9150506123ab565b505b505050505050505050919050565b60095481565b600760149054906101000a900467ffffffffffffffff1681565b600f6020528060005260406000206000915090505481565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b612476612dfb565b6124806000613da5565b565b6012602052816000526040600020602052806000526040600020600091509150505481565b60035481565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6011602052816000526040600020602052806000526040600020600091509150508060000154908060010154908060020154905083565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61253b612dfb565b8060038190555050565b6060601060008381526020019081526020016000206006018054806020026020016040519081016040528092919081815260200182805480156125a757602002820191906000526020600020905b815481526020019060010190808311612593575b50505050509050919050565b6125be3383836130d0565b5050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6007601c9054906101000a900461ffff1681565b6013602052816000526040600020602052806000526040600020600091509150508060000154908060010154908060020154908060030160009054906101000a900460ff16905084565b600080601260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905060006013600085815260200190815260200160002060008381526020019081526020016000206040518060800160405290816000820154815260200160018201548152602001600282015481526020016003820160009054906101000a900460ff161515151581525050905060006010600086815260200190815260200160002060405180610120016040529081600082015481526020016001820160009054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160028201548152602001600382015481526020016004820154815260200160058201548152602001600682018054806020026020016040519081016040528092919081815260200182805480156127d057602002820191906000526020600020905b8154815260200190600101908083116127bc575b50505050508152602001600782015481526020016008820160009054906101000a900460ff16600281111561280857612807614127565b5b600281111561281a57612819614127565b5b81525050905060004290508160800151826000015161283991906148f2565b421115612857578160800151826000015161285491906148f2565b90505b60008360200151905060035484604001518361287391906149a3565b11156128b35760035484604001518361288c91906149a3565b61289691906148c1565b84600001516128a591906149d7565b816128b091906148f2565b90505b6000836060015190506003548460a00151846128cf91906149a3565b111561290f576003548460a00151846128e891906149a3565b6128f291906148c1565b846040015161290191906149d7565b8161290c91906148f2565b90505b80670de0b6b3a76400008361292491906149d7565b61292e91906148c1565b965050505050505092915050565b600a5481565b61294a612dfb565b600060015411156129ec5760028081111561296857612967614127565b5b601060006001805461297a91906149a3565b815260200190815260200160002060080160009054906101000a900460ff1660028111156129ab576129aa614127565b5b146129eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129e290614e21565b60405180910390fd5b5b81601060006001548152602001908152602001600020600401819055504260106000600154815260200190815260200160002060000181905550600160106000600154815260200190815260200160002060080160006101000a81548160ff02191690836002811115612a6257612a61614127565b5b02179055508060106000600154815260200190815260200160002060010160006101000a81548163ffffffff021916908363ffffffff16021790555042601060006001548152602001908152602001600020600501819055508063ffffffff1667ffffffffffffffff811115612adb57612ada614232565b5b604051908082528060200260200182016040528015612b095781602001602082028036833780820191505090505b506010600060015481526020019081526020016000206006019080519060200190612b35929190613eb7565b50600160026000828254612b4991906148f2565b925050819055506001547fcf30947cc5e4faa736b723018e806822835db29e1b1c2e6d140f95e19d8ede85834284604051612b8693929190614e72565b60405180910390a25050565b600b5481565b600d5481565b612ba6612dfb565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612c15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c0c90614f1b565b60405180910390fd5b612c1e81613da5565b50565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600c5481565b600860009054906101000a900463ffffffff1681565b6000600b541115612df957600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600b546040518363ffffffff1660e01b8152600401612cef929190614bb4565b6020604051808303816000875af1158015612d0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d329190614c09565b50600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166394b918de600b546040518263ffffffff1660e01b8152600401612d9091906143d1565b600060405180830381600087803b158015612daa57600080fd5b505af1158015612dbe573d6000803e3d6000fd5b50505050612df0600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600b54613055565b6000600b819055505b565b612e03613e69565b73ffffffffffffffffffffffffffffffffffffffff16612e2161250a565b73ffffffffffffffffffffffffffffffffffffffff1614612e77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e6e90614f87565b60405180910390fd5b565b612f118282604051602401612e8f929190615015565b6040516020818303038152906040527fb60e72cc000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613e71565b5050565b60006010600060018054612f2991906149a3565b8152602001908152602001600020600301541115613051576000815167ffffffffffffffff811115612f5e57612f5d614232565b5b604051908082528060200260200182016040528015612f8c5781602001602082028036833780820191505090505b50905060005b8251811015613016576010600060018054612fad91906149a3565b815260200190815260200160002060030154838281518110612fd257612fd1614d7a565b5b6020026020010151612fe49190615045565b828281518110612ff757612ff6614d7a565b5b602002602001018181525050808061300e90614a19565b915050612f92565b5080601060006001805461302a91906149a3565b8152602001908152602001600020600601908051906020019061304e929190613eb7565b50505b5050565b60008273ffffffffffffffffffffffffffffffffffffffff168260405161307b906150a7565b60006040518083038185875af1925050503d80600081146130b8576040519150601f19603f3d011682016040523d82523d6000602084013e6130bd565b606091505b50509050806130cb57600080fd5b505050565b6000601260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020549050600060136000848152602001908152602001600020600083815260200190815260200160002090508381600001541015613194576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161318b90615108565b60405180910390fd5b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16866040518363ffffffff1660e01b8152600401613213929190614bb4565b6020604051808303816000875af1158015613232573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132569190614c09565b50600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166394b918de856040518263ffffffff1660e01b81526004016132b291906143d1565b600060405180830381600087803b1580156132cc57600080fd5b505af11580156132e0573d6000803e3d6000fd5b5050505060015483036132fe576132f9858560006133ab565b613318565b83600a600082825461331091906149a3565b925050819055505b83600c600082825461332a91906149a3565b925050819055508381600001600082825461334591906149a3565b925050819055506133568585613055565b8473ffffffffffffffffffffffffffffffffffffffff167fb24546d975e2628748efc9aced80665e0fad66272033e5c0ea25fd3afac997958560405161339c91906143d1565b60405180910390a25050505050565b600060106000600154815260200190815260200160002090506000429050816004015482600001546133dd91906148f2565b4211156133fb57816004015482600001546133f891906148f2565b90505b60035482600501548261340e91906149a3565b111561349f5760035482600501548261342791906149a3565b61343191906148c1565b826002015461344091906149d7565b82600301600082825461345391906148f2565b9250508190555060035460035483600501548361347091906149a3565b61347a91906148c1565b61348491906149d7565b82600501600082825461349791906148f2565b925050819055505b6000841115613d9e57821561395657838260020160008282546134c291906148f2565b925050819055506000601260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001548152602001908152602001600020549050600060136000600154815260200190815260200160002060008381526020019081526020016000209050600060648361355991906148c1565b90506003546011600060015481526020019081526020016000206000838152602001908152602001600020600201548561359391906149a3565b11156136e9576001600354601160006001548152602001908152602001600020600084815260200190815260200160002060020154866135d391906149a3565b6135dd91906148c1565b6135e791906149a3565b60116000600154815260200190815260200160002060008381526020019081526020016000206000015461361b91906149d7565b6011600060015481526020019081526020016000206000838152602001908152602001600020600101600082825461365391906148f2565b925050819055506003546003546011600060015481526020019081526020016000206000848152602001908152602001600020600201548661369591906149a3565b61369f91906148c1565b6136a991906149d7565b601160006001548152602001908152602001600020600083815260200190815260200160002060020160008282546136e191906148f2565b925050819055505b866011600060015481526020019081526020016000206000838152602001908152602001600020600001600082825461372291906148f2565b92505081905550506000816000015411156137dc5760035481600201548461374a91906149a3565b11156137db5760035481600201548461376391906149a3565b61376d91906148c1565b816000015461377c91906149d7565b81600101600082825461378f91906148f2565b925050819055506003546003548260020154856137ac91906149a3565b6137b691906148c1565b6137c091906149d7565b8160020160008282546137d391906148f2565b925050819055505b5b600086600c546137ec91906148f2565b111561394f576064600d54606461380391906149a3565b87600c5461381191906148f2565b8660020154600b548860020154600a54600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161387c9190614683565b602060405180830381865afa158015613899573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138bd9190614ac9565b6138c791906149a3565b6138d191906149a3565b6138db91906149a3565b6138e591906149d7565b6138ef91906148c1565b6138f991906149d7565b61390391906148c1565b846007018190555061394e6040518060400160405280601781526020017f207e20706f6f6c2e726577617264466f72526f756e643a0000000000000000008152508560070154612e79565b5b5050613d9d565b8382600201600082825461396a91906149a3565b925050819055506000601260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600060015481526020019081526020016000205490506000601360006001548152602001908152602001600020600083815260200190815260200160002090506000606483613a0191906148c1565b905060035460116000600154815260200190815260200160002060008381526020019081526020016000206002015485613a3b91906149a3565b1115613b855760035460116000600154815260200190815260200160002060008381526020019081526020016000206002015485613a7991906149a3565b613a8391906148c1565b601160006001548152602001908152602001600020600083815260200190815260200160002060000154613ab791906149d7565b60116000600154815260200190815260200160002060008381526020019081526020016000206001016000828254613aef91906148f2565b9250508190555060035460035460116000600154815260200190815260200160002060008481526020019081526020016000206002015486613b3191906149a3565b613b3b91906148c1565b613b4591906149d7565b60116000600154815260200190815260200160002060008381526020019081526020016000206002016000828254613b7d91906148f2565b925050819055505b8660116000600154815260200190815260200160002060008381526020019081526020016000206000016000828254613bbe91906149a3565b9250508190555050600354816002015484613bd991906149a3565b1115613c6a57600354816002015484613bf291906149a3565b613bfc91906148c1565b8160000154613c0b91906149d7565b816001016000828254613c1e91906148f2565b92505081905550600354600354826002015485613c3b91906149a3565b613c4591906148c1565b613c4f91906149d7565b816002016000828254613c6291906148f2565b925050819055505b600086600c54613c7a91906149a3565b1115613d9a576064600d546064613c9191906149a3565b87600c54613c9f91906149a3565b8660020154600b548860020154600a54600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401613d0a9190614683565b602060405180830381865afa158015613d27573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d4b9190614ac9565b613d5591906149a3565b613d5f91906149a3565b613d6991906149a3565b613d7391906149d7565b613d7d91906148c1565b613d8791906149d7565b613d9191906148c1565b84600701819055505b50505b5b5050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600033905090565b613e8881613e80613e8b613eac565b63ffffffff16565b50565b60006a636f6e736f6c652e6c6f679050600080835160208501845afa505050565b613f04819050919050565b828054828255906000526020600020908101928215613ef3579160200282015b82811115613ef2578251825591602001919060010190613ed7565b5b509050613f009190613f0e565b5090565b613f0c615128565b565b5b80821115613f27576000816000905550600101613f0f565b5090565b6000604051905090565b600080fd5b600080fd5b600067ffffffffffffffff82169050919050565b613f5c81613f3f565b8114613f6757600080fd5b50565b600081359050613f7981613f53565b92915050565b6000819050919050565b613f9281613f7f565b8114613f9d57600080fd5b50565b600081359050613faf81613f89565b92915050565b600063ffffffff82169050919050565b613fce81613fb5565b8114613fd957600080fd5b50565b600081359050613feb81613fc5565b92915050565b600061ffff82169050919050565b61400881613ff1565b811461401357600080fd5b50565b60008135905061402581613fff565b92915050565b6000819050919050565b61403e8161402b565b811461404957600080fd5b50565b60008135905061405b81614035565b92915050565b600080600080600060a0868803121561407d5761407c613f35565b5b600061408b88828901613f6a565b955050602061409c88828901613fa0565b94505060406140ad88828901613fdc565b93505060606140be88828901614016565b92505060806140cf8882890161404c565b9150509295509295909350565b6000602082840312156140f2576140f1613f35565b5b60006141008482850161404c565b91505092915050565b6141128161402b565b82525050565b61412181613fb5565b82525050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6003811061416757614166614127565b5b50565b600081905061417882614156565b919050565b60006141888261416a565b9050919050565b6141988161417d565b82525050565b6000610100820190506141b4600083018b614109565b6141c1602083018a614118565b6141ce6040830189614109565b6141db6060830188614109565b6141e86080830187614109565b6141f560a0830186614109565b61420260c0830185614109565b61420f60e083018461418f565b9998505050505050505050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61426a82614221565b810181811067ffffffffffffffff8211171561428957614288614232565b5b80604052505050565b600061429c613f2b565b90506142a88282614261565b919050565b600067ffffffffffffffff8211156142c8576142c7614232565b5b602082029050602081019050919050565b600080fd5b60006142f16142ec846142ad565b614292565b90508083825260208201905060208402830185811115614314576143136142d9565b5b835b8181101561433d5780614329888261404c565b845260208401935050602081019050614316565b5050509392505050565b600082601f83011261435c5761435b61421c565b5b813561436c8482602086016142de565b91505092915050565b6000806040838503121561438c5761438b613f35565b5b600061439a8582860161404c565b925050602083013567ffffffffffffffff8111156143bb576143ba613f3a565b5b6143c785828601614347565b9150509250929050565b60006020820190506143e66000830184614109565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061443161442c614427846143ec565b61440c565b6143ec565b9050919050565b600061444382614416565b9050919050565b600061445582614438565b9050919050565b6144658161444a565b82525050565b6000602082019050614480600083018461445c565b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6144bb8161402b565b82525050565b60006144cd83836144b2565b60208301905092915050565b6000602082019050919050565b60006144f182614486565b6144fb8185614491565b9350614506836144a2565b8060005b8381101561453757815161451e88826144c1565b9750614529836144d9565b92505060018101905061450a565b5085935050505092915050565b6000602082019050818103600083015261455e81846144e6565b905092915050565b61456f81613f7f565b82525050565b600060208201905061458a6000830184614566565b92915050565b61459981613f3f565b82525050565b60006020820190506145b46000830184614590565b92915050565b60006145c582614438565b9050919050565b6145d5816145ba565b82525050565b60006020820190506145f060008301846145cc565b92915050565b6000614601826143ec565b9050919050565b614611816145f6565b811461461c57600080fd5b50565b60008135905061462e81614608565b92915050565b6000806040838503121561464b5761464a613f35565b5b60006146598582860161461f565b925050602061466a8582860161404c565b9150509250929050565b61467d816145f6565b82525050565b60006020820190506146986000830184614674565b92915050565b600080604083850312156146b5576146b4613f35565b5b60006146c38582860161404c565b92505060206146d48582860161404c565b9150509250929050565b60006060820190506146f36000830186614109565b6147006020830185614109565b61470d6040830184614109565b949350505050565b600061472082614438565b9050919050565b61473081614715565b82525050565b600060208201905061474b6000830184614727565b92915050565b61475a81613ff1565b82525050565b60006020820190506147756000830184614751565b92915050565b60008115159050919050565b6147908161477b565b82525050565b60006080820190506147ab6000830187614109565b6147b86020830186614109565b6147c56040830185614109565b6147d26060830184614787565b95945050505050565b600080604083850312156147f2576147f1613f35565b5b60006148008582860161404c565b925050602061481185828601613fdc565b9150509250929050565b60006020828403121561483157614830613f35565b5b600061483f8482850161461f565b91505092915050565b600060208201905061485d6000830184614118565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006148cc8261402b565b91506148d78361402b565b9250826148e7576148e6614863565b5b828204905092915050565b60006148fd8261402b565b91506149088361402b565b92508282019050808211156149205761491f614892565b5b92915050565b600082825260208201905092915050565b7f506f6f6c206973207374696c6c20616374697665000000000000000000000000600082015250565b600061496d601483614926565b915061497882614937565b602082019050919050565b6000602082019050818103600083015261499c81614960565b9050919050565b60006149ae8261402b565b91506149b98361402b565b92508282039050818111156149d1576149d0614892565b5b92915050565b60006149e28261402b565b91506149ed8361402b565b92508282026149fb8161402b565b91508282048414831517614a1257614a11614892565b5b5092915050565b6000614a248261402b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614a5657614a55614892565b5b600182019050919050565b600060a082019050614a766000830188614566565b614a836020830187614590565b614a906040830186614751565b614a9d6060830185614118565b614aaa6080830184614118565b9695505050505050565b600081519050614ac381614035565b92915050565b600060208284031215614adf57614ade613f35565b5b6000614aed84828501614ab4565b91505092915050565b6000604082019050614b0b6000830185614109565b614b186020830184614109565b9392505050565b6000604082019050614b346000830185614674565b614b416020830184614674565b9392505050565b7f526577617264732061726520616c726561647920636c61696d65640000000000600082015250565b6000614b7e601b83614926565b9150614b8982614b48565b602082019050919050565b60006020820190508181036000830152614bad81614b71565b9050919050565b6000604082019050614bc96000830185614674565b614bd66020830184614109565b9392505050565b614be68161477b565b8114614bf157600080fd5b50565b600081519050614c0381614bdd565b92915050565b600060208284031215614c1f57614c1e613f35565b5b6000614c2d84828501614bf4565b91505092915050565b7f506f6f6c206973206e6f74207374617274656420796574000000000000000000600082015250565b6000614c6c601783614926565b9150614c7782614c36565b602082019050919050565b60006020820190508181036000830152614c9b81614c5f565b9050919050565b7f4e6f7420616c6c6f77656420746f207374616b65206f6e206c61737420646179600082015250565b6000614cd8602083614926565b9150614ce382614ca2565b602082019050919050565b60006020820190508181036000830152614d0781614ccb565b9050919050565b7f4e6f7468696e6720746f207374616b6500000000000000000000000000000000600082015250565b6000614d44601083614926565b9150614d4f82614d0e565b602082019050919050565b60006020820190508181036000830152614d7381614d37565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000614db482613fb5565b915063ffffffff8203614dca57614dc9614892565b5b600182019050919050565b7f50726576696f757320706f6f6c206973206e6f742066696e6973686564000000600082015250565b6000614e0b601d83614926565b9150614e1682614dd5565b602082019050919050565b60006020820190508181036000830152614e3a81614dfe565b9050919050565b6000614e5c614e57614e5284613fb5565b61440c565b61402b565b9050919050565b614e6c81614e41565b82525050565b6000606082019050614e876000830186614109565b614e946020830185614109565b614ea16040830184614e63565b949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614f05602683614926565b9150614f1082614ea9565b604082019050919050565b60006020820190508181036000830152614f3481614ef8565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614f71602083614926565b9150614f7c82614f3b565b602082019050919050565b60006020820190508181036000830152614fa081614f64565b9050919050565b600081519050919050565b60005b83811015614fd0578082015181840152602081019050614fb5565b60008484015250505050565b6000614fe782614fa7565b614ff18185614926565b9350615001818560208601614fb2565b61500a81614221565b840191505092915050565b6000604082019050818103600083015261502f8185614fdc565b905061503e6020830184614109565b9392505050565b60006150508261402b565b915061505b8361402b565b92508261506b5761506a614863565b5b828206905092915050565b600081905092915050565b50565b6000615091600083615076565b915061509c82615081565b600082019050919050565b60006150b282615084565b9150819050919050565b7f496e73756666696369656e74206465706f736974000000000000000000000000600082015250565b60006150f2601483614926565b91506150fd826150bc565b602082019050919050565b60006020820190508181036000830152615121816150e5565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052605160045260246000fdfe207e2066696e616c697a65526f756e64207e20706f6f6c2e746f74616c5469636b6574733a207e2066696e616c697a65526f756e64207e20706f6f6c2e726577617264466f72526f756e643aa2646970667358221220f96d482f4fc6f46386cab3984a1dc3c3575cf092af62a044a395a3ca89493e0664736f6c634300081400330000000000000000000000007fdbf4fe2dbbdf956c010b3dd83177cb86eb1b14000000000000000000000000780fb5aca83f2e3f57ee18cc3094988ef49d8c3d0000000000000000000000000ca83dd56af172a1e04b667d6e64446d0b88c4a4000000000000000000000000f5b8925c7c1642ef0ccd71536e353e7b38c2198c
Deployed ByteCode
0x6080604052600436106102135760003560e01c80638921b0ca11610118578063bf583903116100a0578063f2fde38b1161006f578063f2fde38b14610798578063f41dfe2b146107c1578063f6153ccd146107ec578063f68016b714610817578063fb284629146108425761021a565b8063bf583903146106ee578063cc4b97e114610719578063d7070ae214610742578063ddca3f431461076d5761021a565b80639e2c8a5b116100e75780639e2c8a5b146105f2578063aec477591461061b578063b0fb162f14610646578063b345dc8c14610671578063b5222b08146106b15761021a565b80638921b0ca146105225780638da5cb5b146105615780639cb0741b1461058c5780639d5c35ae146105b55761021a565b80635f72f4501161019b5780636acf26b91161016a5780636acf26b91461044d578063715018a61461047857806376ce29811461048f5780637b76ac91146104cc57806385f2aef2146104f75761021a565b80635f72f4501461037d57806361728f39146103ba57806362a58fb8146103e5578063669f0e82146104105761021a565b80632add13c7116101e25780632add13c7146102c9578063379607f5146102f4578063390724ac1461031d5780633a4b66f114610348578063576a3170146103525761021a565b806305c5a20b1461021c5780631526fe27146102455780631e820325146102895780631fe543e3146102a05761021a565b3661021a57005b005b34801561022857600080fd5b50610243600480360381019061023e9190614061565b610859565b005b34801561025157600080fd5b5061026c600480360381019061026791906140dc565b6108dd565b60405161028098979695949392919061419e565b60405180910390f35b34801561029557600080fd5b5061029e610942565b005b3480156102ac57600080fd5b506102c760048036038101906102c29190614375565b61103b565b005b3480156102d557600080fd5b506102de6110fb565b6040516102eb91906143d1565b60405180910390f35b34801561030057600080fd5b5061031b600480360381019061031691906140dc565b611101565b005b34801561032957600080fd5b50610332611548565b60405161033f91906143d1565b60405180910390f35b61035061154e565b005b34801561035e57600080fd5b50610367611acb565b604051610374919061446b565b60405180910390f35b34801561038957600080fd5b506103a4600480360381019061039f91906140dc565b611af1565b6040516103b19190614544565b60405180910390f35b3480156103c657600080fd5b506103cf612410565b6040516103dc9190614575565b60405180910390f35b3480156103f157600080fd5b506103fa612416565b604051610407919061459f565b60405180910390f35b34801561041c57600080fd5b50610437600480360381019061043291906140dc565b612430565b60405161044491906143d1565b60405180910390f35b34801561045957600080fd5b50610462612448565b60405161046f91906145db565b60405180910390f35b34801561048457600080fd5b5061048d61246e565b005b34801561049b57600080fd5b506104b660048036038101906104b19190614634565b612482565b6040516104c391906143d1565b60405180910390f35b3480156104d857600080fd5b506104e16124a7565b6040516104ee91906143d1565b60405180910390f35b34801561050357600080fd5b5061050c6124ad565b6040516105199190614683565b60405180910390f35b34801561052e57600080fd5b506105496004803603810190610544919061469e565b6124d3565b604051610558939291906146de565b60405180910390f35b34801561056d57600080fd5b5061057661250a565b6040516105839190614683565b60405180910390f35b34801561059857600080fd5b506105b360048036038101906105ae91906140dc565b612533565b005b3480156105c157600080fd5b506105dc60048036038101906105d791906140dc565b612545565b6040516105e99190614544565b60405180910390f35b3480156105fe57600080fd5b506106196004803603810190610614919061469e565b6125b3565b005b34801561062757600080fd5b506106306125c2565b60405161063d9190614736565b60405180910390f35b34801561065257600080fd5b5061065b6125e8565b6040516106689190614760565b60405180910390f35b34801561067d57600080fd5b506106986004803603810190610693919061469e565b6125fc565b6040516106a89493929190614796565b60405180910390f35b3480156106bd57600080fd5b506106d860048036038101906106d39190614634565b612646565b6040516106e591906143d1565b60405180910390f35b3480156106fa57600080fd5b5061070361293c565b60405161071091906143d1565b60405180910390f35b34801561072557600080fd5b50610740600480360381019061073b91906147db565b612942565b005b34801561074e57600080fd5b50610757612b92565b60405161076491906143d1565b60405180910390f35b34801561077957600080fd5b50610782612b98565b60405161078f91906143d1565b60405180910390f35b3480156107a457600080fd5b506107bf60048036038101906107ba919061481b565b612b9e565b005b3480156107cd57600080fd5b506107d6612c21565b6040516107e391906145db565b60405180910390f35b3480156107f857600080fd5b50610801612c47565b60405161080e91906143d1565b60405180910390f35b34801561082357600080fd5b5061082c612c4d565b6040516108399190614848565b60405180910390f35b34801561084e57600080fd5b50610857612c63565b005b610861612dfb565b84600760146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508360098190555082600860006101000a81548163ffffffff021916908363ffffffff160217905550816007601c6101000a81548161ffff021916908361ffff16021790555080600d819055505050505050565b60106020528060005260406000206000915090508060000154908060010160009054906101000a900463ffffffff16908060020154908060030154908060040154908060050154908060070154908060080160009054906101000a900460ff16905088565b6000601060006001548152602001908152602001600020905060006064600f600060015481526020019081526020016000205461097f91906148c1565b9050428260040154836000015461099691906148f2565b11156109d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109ce90614983565b60405180910390fd5b6000429050826004015483600001546109f091906148f2565b421115610a0e5782600401548360000154610a0b91906148f2565b90505b600354836005015482610a2191906149a3565b1115610ab257600354836005015482610a3a91906149a3565b610a4491906148c1565b8360020154610a5391906149d7565b836003016000828254610a6691906148f2565b92505081905550600354600354846005015483610a8391906149a3565b610a8d91906148c1565b610a9791906149d7565b836005016000828254610aaa91906148f2565b925050819055505b610ad8604051806060016040528060258152602001615158602591398460030154612e79565b60005b828111610c775760035460116000600154815260200190815260200160002060008381526020019081526020016000206002015483610b1a91906149a3565b1115610c645760035460116000600154815260200190815260200160002060008381526020019081526020016000206002015483610b5891906149a3565b610b6291906148c1565b601160006001548152602001908152602001600020600083815260200190815260200160002060000154610b9691906149d7565b60116000600154815260200190815260200160002060008381526020019081526020016000206001016000828254610bce91906148f2565b9250508190555060035460035460116000600154815260200190815260200160002060008481526020019081526020016000206002015484610c1091906149a3565b610c1a91906148c1565b610c2491906149d7565b60116000600154815260200190815260200160002060008381526020019081526020016000206002016000828254610c5c91906148f2565b925050819055505b8080610c6f90614a19565b915050610adb565b50600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635d3b1d30600954600760149054906101000a900467ffffffffffffffff166007601c9054906101000a900461ffff16600860009054906101000a900463ffffffff168860010160009054906101000a900463ffffffff166040518663ffffffff1660e01b8152600401610d29959493929190614a61565b600060405180830381600087803b158015610d4357600080fd5b505af1158015610d57573d6000803e3d6000fd5b5050505060028360080160006101000a81548160ff02191690836002811115610d8357610d82614127565b5b0217905550600080600c541115610ecc57600c548460020154600b548660020154600a54600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610e029190614683565b602060405180830381865afa158015610e1f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e439190614ac9565b610e4d91906149a3565b610e5791906149a3565b610e6191906149a3565b610e6b91906149d7565b610e7591906148c1565b90506064600d546064610e8891906149a3565b82610e9391906149d7565b610e9d91906148c1565b8460070181905550610ecb60405180606001604052806027815260200161517d602791398560070154612e79565b5b83600201548460070154610ee091906148f2565b600a6000828254610ef191906148f2565b92505081905550600a54600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610f569190614683565b602060405180830381865afa158015610f73573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f979190614ac9565b610fa191906149a3565b600b81905550610fe86040518060400160405280601f81526020017f207e2066696e616c697a65526f756e64207e207465616d526577617264733a00815250600b54612e79565b6002546001819055506001547f87d39ec94082b342cc157bbd80096ad2fa03e1698a57924ad16e36709cb0e2878560070154866002015460405161102d929190614af6565b60405180910390a250505050565b7f0000000000000000000000007fdbf4fe2dbbdf956c010b3dd83177cb86eb1b1473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146110ed57337f0000000000000000000000007fdbf4fe2dbbdf956c010b3dd83177cb86eb1b146040517f1cdc5ebb0000000000000000000000000000000000000000000000000000000081526004016110e4929190614b1f565b60405180910390fd5b6110f78282612f15565b5050565b60015481565b600061110c82611af1565b905060006010600084815260200190815260200160002060405180610120016040529081600082015481526020016001820160009054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160028201548152602001600382015481526020016004820154815260200160058201548152602001600682018054806020026020016040519081016040528092919081815260200182805480156111d657602002820191906000526020600020905b8154815260200190600101908083116111c2575b50505050508152602001600782015481526020016008820160009054906101000a900460ff16600281111561120e5761120d614127565b5b60028111156112205761121f614127565b5b8152505090506000601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000858152602001908152602001600020549050600060136000868152602001908152602001600020600083815260200190815260200160002090508060030160009054906101000a900460ff16156112f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ec90614b94565b60405180910390fd5b60008451111561152457600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16856020015163ffffffff1687518760e0015161137c91906149d7565b61138691906148c1565b6040518363ffffffff1660e01b81526004016113a3929190614bb4565b6020604051808303816000875af11580156113c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113e69190614c09565b50600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166394b918de846020015163ffffffff1686518660e0015161144191906149d7565b61144b91906148c1565b6040518263ffffffff1660e01b815260040161146791906143d1565b600060405180830381600087803b15801561148157600080fd5b505af1158015611495573d6000803e3d6000fd5b505050506114c833846020015163ffffffff1686518660e001516114b991906149d7565b6114c391906148c1565b613055565b826020015163ffffffff1684518460e001516114e491906149d7565b6114ee91906148c1565b600a60008282546114ff91906149a3565b9250508190555060018160030160006101000a81548160ff0219169083151502179055505b60008160000154111561154157611540338260000154876130d0565b5b5050505050565b60025481565b600060106000600154815260200190815260200160002090506000601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001548152602001908152602001600020549050600160028111156115d2576115d1614127565b5b8260080160009054906101000a900460ff1660028111156115f6576115f5614127565b5b14611636576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162d90614c82565b60405180910390fd5b426003548360040154846000015461164e91906148f2565b61165891906149a3565b11611698576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168f90614cee565b60405180910390fd5b600034116116db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d290614d5a565b60405180910390fd5b6000810361172757600f60006001548152602001908152602001600020600081548092919061170990614a19565b9190505550600f600060015481526020019081526020016000205490505b60006013600060015481526020019081526020016000206000838152602001908152602001600020905081601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001548152602001908152602001600020819055506000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a1903eab34306040518363ffffffff1660e01b81526004016118069190614683565b60206040518083038185885af1158015611824573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906118499190614ac9565b9050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630d48764e826040518263ffffffff1660e01b81526004016118a691906143d1565b602060405180830381865afa1580156118c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118e79190614ac9565b90506118f5338260016133ab565b60006013600060015481526020019081526020016000206000858152602001908152602001600020600201540361198d5760035460035485600001544261193c91906149a3565b61194691906148c1565b61195091906149d7565b846000015461195f91906148f2565b6013600060015481526020019081526020016000206000858152602001908152602001600020600201819055505b6040518060800160405280828460000160008282546119ac91906148f2565b925050819055815260200183600101548152602001601360006001548152602001908152602001600020600086815260200190815260200160002060020154815260200160001515815250601360006001548152602001908152602001600020600085815260200190815260200160002060008201518160000155602082015181600101556040820151816002015560608201518160030160006101000a81548160ff02191690831515021790555090505080600c6000828254611a7091906148f2565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167febedb8b3c678666e7f36970bc8f57abf6d8fa2e828c0da91ea5b75bf68ed101a82604051611abd91906143d1565b60405180910390a250505050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606000601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905060006010600085815260200190815260200160002060405180610120016040529081600082015481526020016001820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016002820154815260200160038201548152602001600482015481526020016005820154815260200160068201805480602002602001604051908101604052809291908181526020018280548015611c1057602002820191906000526020600020905b815481526020019060010190808311611bfc575b50505050508152602001600782015481526020016008820160009054906101000a900460ff166002811115611c4857611c47614127565b5b6002811115611c5a57611c59614127565b5b81525050905060006013600086815260200190815260200160002060008481526020019081526020016000206040518060800160405290816000820154815260200160018201548152602001600282015481526020016003820160009054906101000a900460ff16151515158152505090506000606484611cdb91906148c1565b90506000600267ffffffffffffffff811115611cfa57611cf9614232565b5b604051908082528060200260200182016040528015611d285781602001602082028036833780820191505090505b5090506000821115611dab5760005b82811015611da9576011600089815260200190815260200160002060008281526020019081526020016000206001015482600081518110611d7b57611d7a614d7a565b5b60200260200101818151611d8f91906148f2565b915081815250508080611da190614a19565b915050611d37565b505b60016011600089815260200190815260200160002060008481526020019081526020016000206001015482600081518110611de957611de8614d7a565b5b6020026020010151611dfb91906148f2565b611e0591906149a3565b81600181518110611e1957611e18614d7a565b5b6020026020010181815250506000600267ffffffffffffffff811115611e4257611e41614232565b5b604051908082528060200260200182016040528015611e705781602001602082028036833780820191505090505b509050600042905085608001518660000151611e8c91906148f2565b421115611eaa5785608001518660000151611ea791906148f2565b90505b600187111561209d576000606485611ec291906149d7565b90505b8781101561204c57600354601360008c815260200190815260200160002060008381526020019081526020016000206002015483611f0391906149a3565b1115611fe157600354601360008c815260200190815260200160002060008381526020019081526020016000206002015483611f3f91906149a3565b611f4991906148c1565b601360008c8152602001908152602001600020600083815260200190815260200160002060000154611f7b91906149d7565b601360008c8152602001908152602001600020600083815260200190815260200160002060010154611fad91906148f2565b83600081518110611fc157611fc0614d7a565b5b60200260200101818151611fd591906148f2565b91508181525050612039565b601360008b81526020019081526020016000206000828152602001908152602001600020600101548360008151811061201d5761201c614d7a565b5b6020026020010181815161203191906148f2565b915081815250505b808061204490614a19565b915050611ec5565b508260008151811061206157612060614d7a565b5b60200260200101518260008151811061207d5761207c614d7a565b5b6020026020010181815161209191906148f2565b915081815250506120da565b826000815181106120b1576120b0614d7a565b5b6020026020010151826000815181106120cd576120cc614d7a565b5b6020026020010181815250505b6003548560400151826120ed91906149a3565b11156121795760035485604001518261210691906149a3565b61211091906148c1565b856000015161211f91906149d7565b85602001518360008151811061213857612137614d7a565b5b602002602001015161214a91906148f2565b61215491906148f2565b8260018151811061216857612167614d7a565b5b6020026020010181815250506121c5565b84602001518260008151811061219257612191614d7a565b5b60200260200101516121a491906148f2565b826001815181106121b8576121b7614d7a565b5b6020026020010181815250505b6000601060008b815260200190815260200160002060010160009054906101000a900463ffffffff1663ffffffff1667ffffffffffffffff81111561220d5761220c614232565b5b60405190808252806020026020018201604052801561223b5781602001602082028036833780820191505090505b5090506000805b886020015163ffffffff168163ffffffff161015612353578860c001518163ffffffff168151811061227757612276614d7a565b5b60200260200101518560008151811061229357612292614d7a565b5b6020026020010151111580156122e85750846001815181106122b8576122b7614d7a565b5b60200260200101518960c001518263ffffffff16815181106122dd576122dc614d7a565b5b602002602001015111155b15612340578860c001518163ffffffff168151811061230a57612309614d7a565b5b602002602001015183838151811061232557612324614d7a565b5b602002602001018181525050818061233c90614a19565b9250505b808061234b90614da9565b915050612242565b506000811115612402578067ffffffffffffffff81111561237757612376614232565b5b6040519080825280602002602001820160405280156123a55781602001602082028036833780820191505090505b50995060005b81811015612400578281815181106123c6576123c5614d7a565b5b60200260200101518b82815181106123e1576123e0614d7a565b5b60200260200101818152505080806123f890614a19565b9150506123ab565b505b505050505050505050919050565b60095481565b600760149054906101000a900467ffffffffffffffff1681565b600f6020528060005260406000206000915090505481565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b612476612dfb565b6124806000613da5565b565b6012602052816000526040600020602052806000526040600020600091509150505481565b60035481565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6011602052816000526040600020602052806000526040600020600091509150508060000154908060010154908060020154905083565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61253b612dfb565b8060038190555050565b6060601060008381526020019081526020016000206006018054806020026020016040519081016040528092919081815260200182805480156125a757602002820191906000526020600020905b815481526020019060010190808311612593575b50505050509050919050565b6125be3383836130d0565b5050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6007601c9054906101000a900461ffff1681565b6013602052816000526040600020602052806000526040600020600091509150508060000154908060010154908060020154908060030160009054906101000a900460ff16905084565b600080601260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905060006013600085815260200190815260200160002060008381526020019081526020016000206040518060800160405290816000820154815260200160018201548152602001600282015481526020016003820160009054906101000a900460ff161515151581525050905060006010600086815260200190815260200160002060405180610120016040529081600082015481526020016001820160009054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160028201548152602001600382015481526020016004820154815260200160058201548152602001600682018054806020026020016040519081016040528092919081815260200182805480156127d057602002820191906000526020600020905b8154815260200190600101908083116127bc575b50505050508152602001600782015481526020016008820160009054906101000a900460ff16600281111561280857612807614127565b5b600281111561281a57612819614127565b5b81525050905060004290508160800151826000015161283991906148f2565b421115612857578160800151826000015161285491906148f2565b90505b60008360200151905060035484604001518361287391906149a3565b11156128b35760035484604001518361288c91906149a3565b61289691906148c1565b84600001516128a591906149d7565b816128b091906148f2565b90505b6000836060015190506003548460a00151846128cf91906149a3565b111561290f576003548460a00151846128e891906149a3565b6128f291906148c1565b846040015161290191906149d7565b8161290c91906148f2565b90505b80670de0b6b3a76400008361292491906149d7565b61292e91906148c1565b965050505050505092915050565b600a5481565b61294a612dfb565b600060015411156129ec5760028081111561296857612967614127565b5b601060006001805461297a91906149a3565b815260200190815260200160002060080160009054906101000a900460ff1660028111156129ab576129aa614127565b5b146129eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129e290614e21565b60405180910390fd5b5b81601060006001548152602001908152602001600020600401819055504260106000600154815260200190815260200160002060000181905550600160106000600154815260200190815260200160002060080160006101000a81548160ff02191690836002811115612a6257612a61614127565b5b02179055508060106000600154815260200190815260200160002060010160006101000a81548163ffffffff021916908363ffffffff16021790555042601060006001548152602001908152602001600020600501819055508063ffffffff1667ffffffffffffffff811115612adb57612ada614232565b5b604051908082528060200260200182016040528015612b095781602001602082028036833780820191505090505b506010600060015481526020019081526020016000206006019080519060200190612b35929190613eb7565b50600160026000828254612b4991906148f2565b925050819055506001547fcf30947cc5e4faa736b723018e806822835db29e1b1c2e6d140f95e19d8ede85834284604051612b8693929190614e72565b60405180910390a25050565b600b5481565b600d5481565b612ba6612dfb565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612c15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c0c90614f1b565b60405180910390fd5b612c1e81613da5565b50565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600c5481565b600860009054906101000a900463ffffffff1681565b6000600b541115612df957600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600b546040518363ffffffff1660e01b8152600401612cef929190614bb4565b6020604051808303816000875af1158015612d0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d329190614c09565b50600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166394b918de600b546040518263ffffffff1660e01b8152600401612d9091906143d1565b600060405180830381600087803b158015612daa57600080fd5b505af1158015612dbe573d6000803e3d6000fd5b50505050612df0600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600b54613055565b6000600b819055505b565b612e03613e69565b73ffffffffffffffffffffffffffffffffffffffff16612e2161250a565b73ffffffffffffffffffffffffffffffffffffffff1614612e77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e6e90614f87565b60405180910390fd5b565b612f118282604051602401612e8f929190615015565b6040516020818303038152906040527fb60e72cc000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613e71565b5050565b60006010600060018054612f2991906149a3565b8152602001908152602001600020600301541115613051576000815167ffffffffffffffff811115612f5e57612f5d614232565b5b604051908082528060200260200182016040528015612f8c5781602001602082028036833780820191505090505b50905060005b8251811015613016576010600060018054612fad91906149a3565b815260200190815260200160002060030154838281518110612fd257612fd1614d7a565b5b6020026020010151612fe49190615045565b828281518110612ff757612ff6614d7a565b5b602002602001018181525050808061300e90614a19565b915050612f92565b5080601060006001805461302a91906149a3565b8152602001908152602001600020600601908051906020019061304e929190613eb7565b50505b5050565b60008273ffffffffffffffffffffffffffffffffffffffff168260405161307b906150a7565b60006040518083038185875af1925050503d80600081146130b8576040519150601f19603f3d011682016040523d82523d6000602084013e6130bd565b606091505b50509050806130cb57600080fd5b505050565b6000601260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020549050600060136000848152602001908152602001600020600083815260200190815260200160002090508381600001541015613194576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161318b90615108565b60405180910390fd5b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16866040518363ffffffff1660e01b8152600401613213929190614bb4565b6020604051808303816000875af1158015613232573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132569190614c09565b50600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166394b918de856040518263ffffffff1660e01b81526004016132b291906143d1565b600060405180830381600087803b1580156132cc57600080fd5b505af11580156132e0573d6000803e3d6000fd5b5050505060015483036132fe576132f9858560006133ab565b613318565b83600a600082825461331091906149a3565b925050819055505b83600c600082825461332a91906149a3565b925050819055508381600001600082825461334591906149a3565b925050819055506133568585613055565b8473ffffffffffffffffffffffffffffffffffffffff167fb24546d975e2628748efc9aced80665e0fad66272033e5c0ea25fd3afac997958560405161339c91906143d1565b60405180910390a25050505050565b600060106000600154815260200190815260200160002090506000429050816004015482600001546133dd91906148f2565b4211156133fb57816004015482600001546133f891906148f2565b90505b60035482600501548261340e91906149a3565b111561349f5760035482600501548261342791906149a3565b61343191906148c1565b826002015461344091906149d7565b82600301600082825461345391906148f2565b9250508190555060035460035483600501548361347091906149a3565b61347a91906148c1565b61348491906149d7565b82600501600082825461349791906148f2565b925050819055505b6000841115613d9e57821561395657838260020160008282546134c291906148f2565b925050819055506000601260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001548152602001908152602001600020549050600060136000600154815260200190815260200160002060008381526020019081526020016000209050600060648361355991906148c1565b90506003546011600060015481526020019081526020016000206000838152602001908152602001600020600201548561359391906149a3565b11156136e9576001600354601160006001548152602001908152602001600020600084815260200190815260200160002060020154866135d391906149a3565b6135dd91906148c1565b6135e791906149a3565b60116000600154815260200190815260200160002060008381526020019081526020016000206000015461361b91906149d7565b6011600060015481526020019081526020016000206000838152602001908152602001600020600101600082825461365391906148f2565b925050819055506003546003546011600060015481526020019081526020016000206000848152602001908152602001600020600201548661369591906149a3565b61369f91906148c1565b6136a991906149d7565b601160006001548152602001908152602001600020600083815260200190815260200160002060020160008282546136e191906148f2565b925050819055505b866011600060015481526020019081526020016000206000838152602001908152602001600020600001600082825461372291906148f2565b92505081905550506000816000015411156137dc5760035481600201548461374a91906149a3565b11156137db5760035481600201548461376391906149a3565b61376d91906148c1565b816000015461377c91906149d7565b81600101600082825461378f91906148f2565b925050819055506003546003548260020154856137ac91906149a3565b6137b691906148c1565b6137c091906149d7565b8160020160008282546137d391906148f2565b925050819055505b5b600086600c546137ec91906148f2565b111561394f576064600d54606461380391906149a3565b87600c5461381191906148f2565b8660020154600b548860020154600a54600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161387c9190614683565b602060405180830381865afa158015613899573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138bd9190614ac9565b6138c791906149a3565b6138d191906149a3565b6138db91906149a3565b6138e591906149d7565b6138ef91906148c1565b6138f991906149d7565b61390391906148c1565b846007018190555061394e6040518060400160405280601781526020017f207e20706f6f6c2e726577617264466f72526f756e643a0000000000000000008152508560070154612e79565b5b5050613d9d565b8382600201600082825461396a91906149a3565b925050819055506000601260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600060015481526020019081526020016000205490506000601360006001548152602001908152602001600020600083815260200190815260200160002090506000606483613a0191906148c1565b905060035460116000600154815260200190815260200160002060008381526020019081526020016000206002015485613a3b91906149a3565b1115613b855760035460116000600154815260200190815260200160002060008381526020019081526020016000206002015485613a7991906149a3565b613a8391906148c1565b601160006001548152602001908152602001600020600083815260200190815260200160002060000154613ab791906149d7565b60116000600154815260200190815260200160002060008381526020019081526020016000206001016000828254613aef91906148f2565b9250508190555060035460035460116000600154815260200190815260200160002060008481526020019081526020016000206002015486613b3191906149a3565b613b3b91906148c1565b613b4591906149d7565b60116000600154815260200190815260200160002060008381526020019081526020016000206002016000828254613b7d91906148f2565b925050819055505b8660116000600154815260200190815260200160002060008381526020019081526020016000206000016000828254613bbe91906149a3565b9250508190555050600354816002015484613bd991906149a3565b1115613c6a57600354816002015484613bf291906149a3565b613bfc91906148c1565b8160000154613c0b91906149d7565b816001016000828254613c1e91906148f2565b92505081905550600354600354826002015485613c3b91906149a3565b613c4591906148c1565b613c4f91906149d7565b816002016000828254613c6291906148f2565b925050819055505b600086600c54613c7a91906149a3565b1115613d9a576064600d546064613c9191906149a3565b87600c54613c9f91906149a3565b8660020154600b548860020154600a54600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401613d0a9190614683565b602060405180830381865afa158015613d27573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d4b9190614ac9565b613d5591906149a3565b613d5f91906149a3565b613d6991906149a3565b613d7391906149d7565b613d7d91906148c1565b613d8791906149d7565b613d9191906148c1565b84600701819055505b50505b5b5050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600033905090565b613e8881613e80613e8b613eac565b63ffffffff16565b50565b60006a636f6e736f6c652e6c6f679050600080835160208501845afa505050565b613f04819050919050565b828054828255906000526020600020908101928215613ef3579160200282015b82811115613ef2578251825591602001919060010190613ed7565b5b509050613f009190613f0e565b5090565b613f0c615128565b565b5b80821115613f27576000816000905550600101613f0f565b5090565b6000604051905090565b600080fd5b600080fd5b600067ffffffffffffffff82169050919050565b613f5c81613f3f565b8114613f6757600080fd5b50565b600081359050613f7981613f53565b92915050565b6000819050919050565b613f9281613f7f565b8114613f9d57600080fd5b50565b600081359050613faf81613f89565b92915050565b600063ffffffff82169050919050565b613fce81613fb5565b8114613fd957600080fd5b50565b600081359050613feb81613fc5565b92915050565b600061ffff82169050919050565b61400881613ff1565b811461401357600080fd5b50565b60008135905061402581613fff565b92915050565b6000819050919050565b61403e8161402b565b811461404957600080fd5b50565b60008135905061405b81614035565b92915050565b600080600080600060a0868803121561407d5761407c613f35565b5b600061408b88828901613f6a565b955050602061409c88828901613fa0565b94505060406140ad88828901613fdc565b93505060606140be88828901614016565b92505060806140cf8882890161404c565b9150509295509295909350565b6000602082840312156140f2576140f1613f35565b5b60006141008482850161404c565b91505092915050565b6141128161402b565b82525050565b61412181613fb5565b82525050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6003811061416757614166614127565b5b50565b600081905061417882614156565b919050565b60006141888261416a565b9050919050565b6141988161417d565b82525050565b6000610100820190506141b4600083018b614109565b6141c1602083018a614118565b6141ce6040830189614109565b6141db6060830188614109565b6141e86080830187614109565b6141f560a0830186614109565b61420260c0830185614109565b61420f60e083018461418f565b9998505050505050505050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61426a82614221565b810181811067ffffffffffffffff8211171561428957614288614232565b5b80604052505050565b600061429c613f2b565b90506142a88282614261565b919050565b600067ffffffffffffffff8211156142c8576142c7614232565b5b602082029050602081019050919050565b600080fd5b60006142f16142ec846142ad565b614292565b90508083825260208201905060208402830185811115614314576143136142d9565b5b835b8181101561433d5780614329888261404c565b845260208401935050602081019050614316565b5050509392505050565b600082601f83011261435c5761435b61421c565b5b813561436c8482602086016142de565b91505092915050565b6000806040838503121561438c5761438b613f35565b5b600061439a8582860161404c565b925050602083013567ffffffffffffffff8111156143bb576143ba613f3a565b5b6143c785828601614347565b9150509250929050565b60006020820190506143e66000830184614109565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061443161442c614427846143ec565b61440c565b6143ec565b9050919050565b600061444382614416565b9050919050565b600061445582614438565b9050919050565b6144658161444a565b82525050565b6000602082019050614480600083018461445c565b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6144bb8161402b565b82525050565b60006144cd83836144b2565b60208301905092915050565b6000602082019050919050565b60006144f182614486565b6144fb8185614491565b9350614506836144a2565b8060005b8381101561453757815161451e88826144c1565b9750614529836144d9565b92505060018101905061450a565b5085935050505092915050565b6000602082019050818103600083015261455e81846144e6565b905092915050565b61456f81613f7f565b82525050565b600060208201905061458a6000830184614566565b92915050565b61459981613f3f565b82525050565b60006020820190506145b46000830184614590565b92915050565b60006145c582614438565b9050919050565b6145d5816145ba565b82525050565b60006020820190506145f060008301846145cc565b92915050565b6000614601826143ec565b9050919050565b614611816145f6565b811461461c57600080fd5b50565b60008135905061462e81614608565b92915050565b6000806040838503121561464b5761464a613f35565b5b60006146598582860161461f565b925050602061466a8582860161404c565b9150509250929050565b61467d816145f6565b82525050565b60006020820190506146986000830184614674565b92915050565b600080604083850312156146b5576146b4613f35565b5b60006146c38582860161404c565b92505060206146d48582860161404c565b9150509250929050565b60006060820190506146f36000830186614109565b6147006020830185614109565b61470d6040830184614109565b949350505050565b600061472082614438565b9050919050565b61473081614715565b82525050565b600060208201905061474b6000830184614727565b92915050565b61475a81613ff1565b82525050565b60006020820190506147756000830184614751565b92915050565b60008115159050919050565b6147908161477b565b82525050565b60006080820190506147ab6000830187614109565b6147b86020830186614109565b6147c56040830185614109565b6147d26060830184614787565b95945050505050565b600080604083850312156147f2576147f1613f35565b5b60006148008582860161404c565b925050602061481185828601613fdc565b9150509250929050565b60006020828403121561483157614830613f35565b5b600061483f8482850161461f565b91505092915050565b600060208201905061485d6000830184614118565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006148cc8261402b565b91506148d78361402b565b9250826148e7576148e6614863565b5b828204905092915050565b60006148fd8261402b565b91506149088361402b565b92508282019050808211156149205761491f614892565b5b92915050565b600082825260208201905092915050565b7f506f6f6c206973207374696c6c20616374697665000000000000000000000000600082015250565b600061496d601483614926565b915061497882614937565b602082019050919050565b6000602082019050818103600083015261499c81614960565b9050919050565b60006149ae8261402b565b91506149b98361402b565b92508282039050818111156149d1576149d0614892565b5b92915050565b60006149e28261402b565b91506149ed8361402b565b92508282026149fb8161402b565b91508282048414831517614a1257614a11614892565b5b5092915050565b6000614a248261402b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614a5657614a55614892565b5b600182019050919050565b600060a082019050614a766000830188614566565b614a836020830187614590565b614a906040830186614751565b614a9d6060830185614118565b614aaa6080830184614118565b9695505050505050565b600081519050614ac381614035565b92915050565b600060208284031215614adf57614ade613f35565b5b6000614aed84828501614ab4565b91505092915050565b6000604082019050614b0b6000830185614109565b614b186020830184614109565b9392505050565b6000604082019050614b346000830185614674565b614b416020830184614674565b9392505050565b7f526577617264732061726520616c726561647920636c61696d65640000000000600082015250565b6000614b7e601b83614926565b9150614b8982614b48565b602082019050919050565b60006020820190508181036000830152614bad81614b71565b9050919050565b6000604082019050614bc96000830185614674565b614bd66020830184614109565b9392505050565b614be68161477b565b8114614bf157600080fd5b50565b600081519050614c0381614bdd565b92915050565b600060208284031215614c1f57614c1e613f35565b5b6000614c2d84828501614bf4565b91505092915050565b7f506f6f6c206973206e6f74207374617274656420796574000000000000000000600082015250565b6000614c6c601783614926565b9150614c7782614c36565b602082019050919050565b60006020820190508181036000830152614c9b81614c5f565b9050919050565b7f4e6f7420616c6c6f77656420746f207374616b65206f6e206c61737420646179600082015250565b6000614cd8602083614926565b9150614ce382614ca2565b602082019050919050565b60006020820190508181036000830152614d0781614ccb565b9050919050565b7f4e6f7468696e6720746f207374616b6500000000000000000000000000000000600082015250565b6000614d44601083614926565b9150614d4f82614d0e565b602082019050919050565b60006020820190508181036000830152614d7381614d37565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000614db482613fb5565b915063ffffffff8203614dca57614dc9614892565b5b600182019050919050565b7f50726576696f757320706f6f6c206973206e6f742066696e6973686564000000600082015250565b6000614e0b601d83614926565b9150614e1682614dd5565b602082019050919050565b60006020820190508181036000830152614e3a81614dfe565b9050919050565b6000614e5c614e57614e5284613fb5565b61440c565b61402b565b9050919050565b614e6c81614e41565b82525050565b6000606082019050614e876000830186614109565b614e946020830185614109565b614ea16040830184614e63565b949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614f05602683614926565b9150614f1082614ea9565b604082019050919050565b60006020820190508181036000830152614f3481614ef8565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614f71602083614926565b9150614f7c82614f3b565b602082019050919050565b60006020820190508181036000830152614fa081614f64565b9050919050565b600081519050919050565b60005b83811015614fd0578082015181840152602081019050614fb5565b60008484015250505050565b6000614fe782614fa7565b614ff18185614926565b9350615001818560208601614fb2565b61500a81614221565b840191505092915050565b6000604082019050818103600083015261502f8185614fdc565b905061503e6020830184614109565b9392505050565b60006150508261402b565b915061505b8361402b565b92508261506b5761506a614863565b5b828206905092915050565b600081905092915050565b50565b6000615091600083615076565b915061509c82615081565b600082019050919050565b60006150b282615084565b9150819050919050565b7f496e73756666696369656e74206465706f736974000000000000000000000000600082015250565b60006150f2601483614926565b91506150fd826150bc565b602082019050919050565b60006020820190508181036000830152615121816150e5565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052605160045260246000fdfe207e2066696e616c697a65526f756e64207e20706f6f6c2e746f74616c5469636b6574733a207e2066696e616c697a65526f756e64207e20706f6f6c2e726577617264466f72526f756e643aa2646970667358221220f96d482f4fc6f46386cab3984a1dc3c3575cf092af62a044a395a3ca89493e0664736f6c63430008140033